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