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