@@ -12,6 +12,7 @@ use std::{
1212 cell:: RefCell , collections:: { BTreeSet , HashMap , HashSet , VecDeque } , ffi:: { c_void, c_uint, c_int, CStr } , fmt:: Display , mem:: { align_of, size_of} , ptr, slice:: Iter
1313} ;
1414use crate :: hir_type:: { Type , types} ;
15+ use crate :: hir_effect:: { Effect , effects} ;
1516use crate :: bitset:: BitSet ;
1617use crate :: profile:: { TypeDistributionSummary , ProfiledType } ;
1718use crate :: stats:: Counter ;
@@ -2134,6 +2135,124 @@ impl Function {
21342135 }
21352136 }
21362137
2138+ // Unused variables should NOT be allowed. We temporarily allow this to create the skeleton
2139+ // structure for an effects system. Changes that specify refined effects should remove this
2140+ // unused variables attribute.
2141+ #[ allow( unused_variables) ]
2142+ fn effects_of ( & self , insn : InsnId ) -> Effect {
2143+ assert ! ( self . insns[ insn. 0 ] . has_output( ) ) ;
2144+ match & self . insns [ insn. 0 ] {
2145+ Insn :: Param => unimplemented ! ( "params should not be present in block.insns" ) ,
2146+ Insn :: SetGlobal { .. } | Insn :: Jump ( _) | Insn :: EntryPoint { .. }
2147+ | Insn :: IfTrue { .. } | Insn :: IfFalse { .. } | Insn :: Return { .. } | Insn :: Throw { .. }
2148+ | Insn :: PatchPoint { .. } | Insn :: SetIvar { .. } | Insn :: SetClassVar { .. } | Insn :: ArrayExtend { .. }
2149+ | Insn :: ArrayPush { .. } | Insn :: SideExit { .. } | Insn :: SetLocal { .. } | Insn :: IncrCounter ( _)
2150+ | Insn :: CheckInterrupts { .. } | Insn :: GuardBlockParamProxy { .. } | Insn :: IncrCounterPtr { .. }
2151+ | Insn :: SetInstanceVariable { .. } | Insn :: StoreField { .. } | Insn :: WriteBarrier { .. } =>
2152+ panic ! ( "Cannot infer type of instruction with no output: {}. See Insn::has_output()." , self . insns[ insn. 0 ] ) ,
2153+ Insn :: Const { val : Const :: Value ( val) } => effects:: Any ,
2154+ Insn :: Const { val : Const :: CBool ( val) } => effects:: Any ,
2155+ Insn :: Const { val : Const :: CInt8 ( val) } => effects:: Any ,
2156+ Insn :: Const { val : Const :: CInt16 ( val) } => effects:: Any ,
2157+ Insn :: Const { val : Const :: CInt32 ( val) } => effects:: Any ,
2158+ Insn :: Const { val : Const :: CInt64 ( val) } => effects:: Any ,
2159+ Insn :: Const { val : Const :: CUInt8 ( val) } => effects:: Any ,
2160+ Insn :: Const { val : Const :: CUInt16 ( val) } => effects:: Any ,
2161+ Insn :: Const { val : Const :: CUInt32 ( val) } => effects:: Any ,
2162+ Insn :: Const { val : Const :: CUInt64 ( val) } => effects:: Any ,
2163+ Insn :: Const { val : Const :: CPtr ( val) } => effects:: Any ,
2164+ Insn :: Const { val : Const :: CDouble ( val) } => effects:: Any ,
2165+ Insn :: Test { val } if self . type_of ( * val) . is_known_falsy ( ) => effects:: Any ,
2166+ Insn :: Test { val } if self . type_of ( * val) . is_known_truthy ( ) => effects:: Any ,
2167+ Insn :: Test { .. } => effects:: Any ,
2168+ Insn :: IsNil { val } if self . is_a ( * val, types:: NilClass ) => effects:: Any ,
2169+ Insn :: IsNil { val } if !self . type_of ( * val) . could_be ( types:: NilClass ) => effects:: Any ,
2170+ Insn :: IsNil { .. } => effects:: Any ,
2171+ Insn :: IsMethodCfunc { .. } => effects:: Any ,
2172+ Insn :: IsBitEqual { .. } => effects:: Any ,
2173+ Insn :: IsBitNotEqual { .. } => effects:: Any ,
2174+ Insn :: BoxBool { .. } => effects:: Any ,
2175+ Insn :: BoxFixnum { .. } => effects:: Any ,
2176+ Insn :: UnboxFixnum { .. } => effects:: Any ,
2177+ Insn :: StringCopy { .. } => effects:: Any ,
2178+ Insn :: StringIntern { .. } => effects:: Any ,
2179+ Insn :: StringConcat { .. } => effects:: Any ,
2180+ Insn :: StringGetbyteFixnum { .. } => effects:: Any ,
2181+ Insn :: StringSetbyteFixnum { .. } => effects:: Any ,
2182+ Insn :: StringAppend { .. } => effects:: Any ,
2183+ Insn :: ToRegexp { .. } => effects:: Any ,
2184+ Insn :: NewArray { .. } => effects:: Any ,
2185+ Insn :: ArrayDup { .. } => effects:: Any ,
2186+ Insn :: ArrayArefFixnum { .. } => effects:: Any ,
2187+ Insn :: ArrayPop { .. } => effects:: Any ,
2188+ Insn :: ArrayLength { .. } => effects:: Any ,
2189+ Insn :: HashAref { .. } => effects:: Any ,
2190+ Insn :: NewHash { .. } => effects:: Any ,
2191+ Insn :: HashDup { .. } => effects:: Any ,
2192+ Insn :: NewRange { .. } => effects:: Any ,
2193+ Insn :: NewRangeFixnum { .. } => effects:: Any ,
2194+ Insn :: ObjectAlloc { .. } => effects:: Any ,
2195+ Insn :: ObjectAllocClass { class, .. } => effects:: Any ,
2196+ & Insn :: CCallWithFrame { return_type, .. } => effects:: Any ,
2197+ Insn :: CCall { return_type, .. } => effects:: Any ,
2198+ & Insn :: CCallVariadic { return_type, .. } => effects:: Any ,
2199+ Insn :: GuardType { val, guard_type, .. } => effects:: Any ,
2200+ Insn :: GuardTypeNot { .. } => effects:: Any ,
2201+ Insn :: GuardBitEquals { val, expected, .. } => effects:: Any ,
2202+ Insn :: GuardShape { val, .. } => effects:: Any ,
2203+ Insn :: GuardNotFrozen { recv, .. } => effects:: Any ,
2204+ Insn :: GuardLess { left, .. } => effects:: Any ,
2205+ Insn :: GuardGreaterEq { left, .. } => effects:: Any ,
2206+ Insn :: FixnumAdd { .. } => effects:: Any ,
2207+ Insn :: FixnumSub { .. } => effects:: Any ,
2208+ Insn :: FixnumMult { .. } => effects:: Any ,
2209+ Insn :: FixnumDiv { .. } => effects:: Any ,
2210+ Insn :: FixnumMod { .. } => effects:: Any ,
2211+ Insn :: FixnumEq { .. } => effects:: Any ,
2212+ Insn :: FixnumNeq { .. } => effects:: Any ,
2213+ Insn :: FixnumLt { .. } => effects:: Any ,
2214+ Insn :: FixnumLe { .. } => effects:: Any ,
2215+ Insn :: FixnumGt { .. } => effects:: Any ,
2216+ Insn :: FixnumGe { .. } => effects:: Any ,
2217+ Insn :: FixnumAnd { .. } => effects:: Any ,
2218+ Insn :: FixnumOr { .. } => effects:: Any ,
2219+ Insn :: FixnumXor { .. } => effects:: Any ,
2220+ Insn :: PutSpecialObject { .. } => effects:: Any ,
2221+ Insn :: SendWithoutBlock { .. } => effects:: Any ,
2222+ Insn :: SendWithoutBlockDirect { .. } => effects:: Any ,
2223+ Insn :: Send { .. } => effects:: Any ,
2224+ Insn :: SendForward { .. } => effects:: Any ,
2225+ Insn :: InvokeSuper { .. } => effects:: Any ,
2226+ Insn :: InvokeBlock { .. } => effects:: Any ,
2227+ Insn :: InvokeBuiltin { return_type, .. } => effects:: Any ,
2228+ Insn :: Defined { pushval, .. } => effects:: Any ,
2229+ Insn :: DefinedIvar { pushval, .. } => effects:: Any ,
2230+ Insn :: GetConstantPath { .. } => effects:: Any ,
2231+ Insn :: IsBlockGiven => effects:: Any ,
2232+ Insn :: FixnumBitCheck { .. } => effects:: Any ,
2233+ Insn :: ArrayMax { .. } => effects:: Any ,
2234+ Insn :: ArrayInclude { .. } => effects:: Any ,
2235+ Insn :: DupArrayInclude { .. } => effects:: Any ,
2236+ Insn :: GetGlobal { .. } => effects:: Any ,
2237+ Insn :: GetIvar { .. } => effects:: Any ,
2238+ Insn :: LoadPC => effects:: Any ,
2239+ Insn :: LoadSelf => effects:: Any ,
2240+ & Insn :: LoadField { return_type, .. } => effects:: Any ,
2241+ Insn :: GetSpecialSymbol { .. } => effects:: Any ,
2242+ Insn :: GetSpecialNumber { .. } => effects:: Any ,
2243+ Insn :: GetClassVar { .. } => effects:: Any ,
2244+ Insn :: ToNewArray { .. } => effects:: Any ,
2245+ Insn :: ToArray { .. } => effects:: Any ,
2246+ Insn :: ObjToString { .. } => effects:: Any ,
2247+ Insn :: AnyToString { .. } => effects:: Any ,
2248+ Insn :: GetLocal { rest_param : true , .. } => effects:: Any ,
2249+ Insn :: GetLocal { .. } => effects:: Any ,
2250+ // The type of Snapshot doesn't really matter; it's never materialized. It's used only
2251+ // as a reference for FrameState, which we use to generate side-exit code.
2252+ Insn :: Snapshot { .. } => effects:: Any ,
2253+ }
2254+ }
2255+
21372256 /// Set self.param_types. They are copied to the param types of jit_entry_blocks.
21382257 fn set_param_types ( & mut self ) {
21392258 let iseq = self . iseq ;
0 commit comments