@@ -969,122 +969,54 @@ impl Insn {
969969 InsnPrinter { inner : self . clone ( ) , ptr_map, iseq }
970970 }
971971
972- // Unused variables should NOT be allowed. We temporarily allow this to create the skeleton
973- // structure for an effects system. Changes that specify refined effects should remove this
974- // unused variables attribute.
975- #[ allow( unused_variables) ]
976972 fn get_effects ( & self ) -> Effect {
977973 assert ! ( self . has_output( ) ) ;
978974 match & self {
979- Insn :: Param => unimplemented ! ( "params should not be present in block.insns" ) ,
980- Insn :: SetGlobal { .. } | Insn :: Jump ( _) | Insn :: EntryPoint { .. }
981- | Insn :: IfTrue { .. } | Insn :: IfFalse { .. } | Insn :: Return { .. } | Insn :: Throw { .. }
982- | Insn :: PatchPoint { .. } | Insn :: SetIvar { .. } | Insn :: SetClassVar { .. } | Insn :: ArrayExtend { .. }
983- | Insn :: ArrayPush { .. } | Insn :: SideExit { .. } | Insn :: SetLocal { .. } | Insn :: IncrCounter ( _)
984- | Insn :: CheckInterrupts { .. } | Insn :: GuardBlockParamProxy { .. } | Insn :: IncrCounterPtr { .. }
985- | Insn :: StoreField { .. } | Insn :: WriteBarrier { .. } => Effect :: from_bits ( effect_sets:: Any , effect_sets:: Any ) ,
986- Insn :: Const { val : Const :: Value ( val) } => Effect :: from_bits ( effect_sets:: Any , effect_sets:: Any ) ,
987- Insn :: Const { val : Const :: CBool ( val) } => Effect :: from_bits ( effect_sets:: Any , effect_sets:: Any ) ,
988- Insn :: Const { val : Const :: CInt8 ( val) } => Effect :: from_bits ( effect_sets:: Any , effect_sets:: Any ) ,
989- Insn :: Const { val : Const :: CInt16 ( val) } => Effect :: from_bits ( effect_sets:: Any , effect_sets:: Any ) ,
990- Insn :: Const { val : Const :: CInt32 ( val) } => Effect :: from_bits ( effect_sets:: Any , effect_sets:: Any ) ,
991- Insn :: Const { val : Const :: CInt64 ( val) } => Effect :: from_bits ( effect_sets:: Any , effect_sets:: Any ) ,
992- Insn :: Const { val : Const :: CUInt8 ( val) } => Effect :: from_bits ( effect_sets:: Any , effect_sets:: Any ) ,
993- Insn :: Const { val : Const :: CUInt16 ( val) } => Effect :: from_bits ( effect_sets:: Any , effect_sets:: Any ) ,
994- Insn :: Const { val : Const :: CUInt32 ( val) } => Effect :: from_bits ( effect_sets:: Any , effect_sets:: Any ) ,
995- Insn :: Const { val : Const :: CUInt64 ( val) } => Effect :: from_bits ( effect_sets:: Any , effect_sets:: Any ) ,
996- Insn :: Const { val : Const :: CPtr ( val) } => Effect :: from_bits ( effect_sets:: Any , effect_sets:: Any ) ,
997- Insn :: Const { val : Const :: CDouble ( val) } => Effect :: from_bits ( effect_sets:: Any , effect_sets:: Any ) ,
998- Insn :: Test { val } => Effect :: from_bits ( effect_sets:: Any , effect_sets:: Any ) ,
999- Insn :: IsNil { .. } => Effect :: from_bits ( effect_sets:: Any , effect_sets:: Any ) ,
1000- Insn :: IsMethodCfunc { .. } => Effect :: from_bits ( effect_sets:: Any , effect_sets:: Any ) ,
1001- Insn :: IsBitEqual { .. } => Effect :: from_bits ( effect_sets:: Any , effect_sets:: Any ) ,
1002- Insn :: IsBitNotEqual { .. } => Effect :: from_bits ( effect_sets:: Any , effect_sets:: Any ) ,
1003- Insn :: BoxBool { .. } => Effect :: from_bits ( effect_sets:: Any , effect_sets:: Any ) ,
1004- Insn :: BoxFixnum { .. } => Effect :: from_bits ( effect_sets:: Any , effect_sets:: Any ) ,
1005- Insn :: UnboxFixnum { .. } => Effect :: from_bits ( effect_sets:: Any , effect_sets:: Any ) ,
1006- Insn :: StringCopy { .. } => Effect :: from_bits ( effect_sets:: Any , effect_sets:: Any ) ,
1007- Insn :: StringIntern { .. } => Effect :: from_bits ( effect_sets:: Any , effect_sets:: Any ) ,
1008- Insn :: StringConcat { .. } => Effect :: from_bits ( effect_sets:: Any , effect_sets:: Any ) ,
1009- Insn :: StringGetbyte { .. } => Effect :: from_bits ( effect_sets:: Any , effect_sets:: Any ) ,
1010- Insn :: StringSetbyteFixnum { .. } => Effect :: from_bits ( effect_sets:: Any , effect_sets:: Any ) ,
1011- Insn :: StringAppend { .. } => Effect :: from_bits ( effect_sets:: Any , effect_sets:: Any ) ,
1012- Insn :: StringAppendCodepoint { .. } => Effect :: from_bits ( effect_sets:: Any , effect_sets:: Any ) ,
1013- Insn :: ToRegexp { .. } => Effect :: from_bits ( effect_sets:: Any , effect_sets:: Any ) ,
1014- Insn :: NewArray { .. } => Effect :: from_bits ( effect_sets:: Any , effect_sets:: Any ) ,
1015- Insn :: ArrayDup { .. } => Effect :: from_bits ( effect_sets:: Any , effect_sets:: Any ) ,
1016- Insn :: ArrayArefFixnum { .. } => Effect :: from_bits ( effect_sets:: Any , effect_sets:: Any ) ,
1017- Insn :: ArrayPop { .. } => Effect :: from_bits ( effect_sets:: Any , effect_sets:: Any ) ,
1018- Insn :: ArrayLength { .. } => Effect :: from_bits ( effect_sets:: Any , effect_sets:: Any ) ,
1019- Insn :: HashAref { .. } => Effect :: from_bits ( effect_sets:: Any , effect_sets:: Any ) ,
1020- Insn :: NewHash { .. } => Effect :: from_bits ( effect_sets:: Any , effect_sets:: Any ) ,
1021- Insn :: HashDup { .. } => Effect :: from_bits ( effect_sets:: Any , effect_sets:: Any ) ,
1022- Insn :: NewRange { .. } => Effect :: from_bits ( effect_sets:: Any , effect_sets:: Any ) ,
1023- Insn :: NewRangeFixnum { .. } => Effect :: from_bits ( effect_sets:: Any , effect_sets:: Any ) ,
1024- Insn :: ObjectAlloc { .. } => Effect :: from_bits ( effect_sets:: Any , effect_sets:: Any ) ,
1025- Insn :: ObjectAllocClass { class, .. } => Effect :: from_bits ( effect_sets:: Any , effect_sets:: Any ) ,
1026- & Insn :: CCallWithFrame { return_type, .. } => Effect :: from_bits ( effect_sets:: Any , effect_sets:: Any ) ,
1027- Insn :: CCall { return_type, .. } => Effect :: from_bits ( effect_sets:: Any , effect_sets:: Any ) ,
1028- & Insn :: CCallVariadic { return_type, .. } => Effect :: from_bits ( effect_sets:: Any , effect_sets:: Any ) ,
1029- Insn :: GuardType { val, guard_type, .. } => Effect :: from_bits ( effect_sets:: Any , effect_sets:: Any ) ,
1030- Insn :: GuardTypeNot { .. } => Effect :: from_bits ( effect_sets:: Any , effect_sets:: Any ) ,
1031- Insn :: GuardBitEquals { val, expected, .. } => Effect :: from_bits ( effect_sets:: Any , effect_sets:: Any ) ,
1032- Insn :: GuardShape { val, .. } => Effect :: from_bits ( effect_sets:: Any , effect_sets:: Any ) ,
1033- Insn :: GuardNotFrozen { recv, .. } => Effect :: from_bits ( effect_sets:: Any , effect_sets:: Any ) ,
1034- Insn :: GuardLess { left, .. } => Effect :: from_bits ( effect_sets:: Any , effect_sets:: Any ) ,
1035- Insn :: GuardGreaterEq { left, .. } => Effect :: from_bits ( effect_sets:: Any , effect_sets:: Any ) ,
1036- Insn :: FixnumAdd { .. } => Effect :: from_bits ( effect_sets:: Any , effect_sets:: Any ) ,
1037- Insn :: FixnumSub { .. } => Effect :: from_bits ( effect_sets:: Any , effect_sets:: Any ) ,
1038- Insn :: FixnumMult { .. } => Effect :: from_bits ( effect_sets:: Any , effect_sets:: Any ) ,
1039- Insn :: FixnumDiv { .. } => Effect :: from_bits ( effect_sets:: Any , effect_sets:: Any ) ,
1040- Insn :: FixnumMod { .. } => Effect :: from_bits ( effect_sets:: Any , effect_sets:: Any ) ,
1041- Insn :: FixnumEq { .. } => Effect :: from_bits ( effect_sets:: Any , effect_sets:: Any ) ,
1042- Insn :: FixnumNeq { .. } => Effect :: from_bits ( effect_sets:: Any , effect_sets:: Any ) ,
1043- Insn :: FixnumLt { .. } => Effect :: from_bits ( effect_sets:: Any , effect_sets:: Any ) ,
1044- Insn :: FixnumLe { .. } => Effect :: from_bits ( effect_sets:: Any , effect_sets:: Any ) ,
1045- Insn :: FixnumGt { .. } => Effect :: from_bits ( effect_sets:: Any , effect_sets:: Any ) ,
1046- Insn :: FixnumGe { .. } => Effect :: from_bits ( effect_sets:: Any , effect_sets:: Any ) ,
1047- Insn :: FixnumAnd { .. } => Effect :: from_bits ( effect_sets:: Any , effect_sets:: Any ) ,
1048- Insn :: FixnumOr { .. } => Effect :: from_bits ( effect_sets:: Any , effect_sets:: Any ) ,
1049- Insn :: FixnumXor { .. } => Effect :: from_bits ( effect_sets:: Any , effect_sets:: Any ) ,
1050- Insn :: FixnumLShift { .. } => Effect :: from_bits ( effect_sets:: Any , effect_sets:: Any ) ,
1051- Insn :: FixnumRShift { .. } => Effect :: from_bits ( effect_sets:: Any , effect_sets:: Any ) ,
1052- Insn :: PutSpecialObject { .. } => Effect :: from_bits ( effect_sets:: Any , effect_sets:: Any ) ,
1053- Insn :: SendWithoutBlock { .. } => Effect :: from_bits ( effect_sets:: Any , effect_sets:: Any ) ,
1054- Insn :: SendWithoutBlockDirect { .. } => Effect :: from_bits ( effect_sets:: Any , effect_sets:: Any ) ,
1055- Insn :: Send { .. } => Effect :: from_bits ( effect_sets:: Any , effect_sets:: Any ) ,
1056- Insn :: SendForward { .. } => Effect :: from_bits ( effect_sets:: Any , effect_sets:: Any ) ,
1057- Insn :: InvokeSuper { .. } => Effect :: from_bits ( effect_sets:: Any , effect_sets:: Any ) ,
1058- Insn :: InvokeBlock { .. } => Effect :: from_bits ( effect_sets:: Any , effect_sets:: Any ) ,
1059- Insn :: InvokeBuiltin { return_type, .. } => Effect :: from_bits ( effect_sets:: Any , effect_sets:: Any ) ,
1060- Insn :: Defined { pushval, .. } => Effect :: from_bits ( effect_sets:: Any , effect_sets:: Any ) ,
1061- Insn :: DefinedIvar { pushval, .. } => Effect :: from_bits ( effect_sets:: Any , effect_sets:: Any ) ,
1062- Insn :: GetConstantPath { .. } => Effect :: from_bits ( effect_sets:: Any , effect_sets:: Any ) ,
1063- Insn :: IsBlockGiven => Effect :: from_bits ( effect_sets:: Any , effect_sets:: Any ) ,
1064- Insn :: FixnumBitCheck { .. } => Effect :: from_bits ( effect_sets:: Any , effect_sets:: Any ) ,
1065- Insn :: ArrayMax { .. } => Effect :: from_bits ( effect_sets:: Any , effect_sets:: Any ) ,
1066- Insn :: ArrayInclude { .. } => Effect :: from_bits ( effect_sets:: Any , effect_sets:: Any ) ,
1067- Insn :: DupArrayInclude { .. } => Effect :: from_bits ( effect_sets:: Any , effect_sets:: Any ) ,
1068- Insn :: ArrayHash { .. } => Effect :: from_bits ( effect_sets:: Any , effect_sets:: Any ) ,
1069- Insn :: GetGlobal { .. } => Effect :: from_bits ( effect_sets:: Any , effect_sets:: Any ) ,
1070- Insn :: GetIvar { .. } => Effect :: from_bits ( effect_sets:: Any , effect_sets:: Any ) ,
1071- Insn :: LoadPC => Effect :: from_bits ( effect_sets:: Any , effect_sets:: Any ) ,
1072- Insn :: LoadEC => Effect :: from_bits ( effect_sets:: Any , effect_sets:: Any ) ,
1073- Insn :: LoadSelf => Effect :: from_bits ( effect_sets:: Any , effect_sets:: Any ) ,
1074- & Insn :: LoadField { return_type, .. } => Effect :: from_bits ( effect_sets:: Any , effect_sets:: Any ) ,
1075- Insn :: GetSpecialSymbol { .. } => Effect :: from_bits ( effect_sets:: Any , effect_sets:: Any ) ,
1076- Insn :: GetSpecialNumber { .. } => Effect :: from_bits ( effect_sets:: Any , effect_sets:: Any ) ,
1077- Insn :: GetClassVar { .. } => Effect :: from_bits ( effect_sets:: Any , effect_sets:: Any ) ,
1078- Insn :: ToNewArray { .. } => Effect :: from_bits ( effect_sets:: Any , effect_sets:: Any ) ,
1079- Insn :: ToArray { .. } => Effect :: from_bits ( effect_sets:: Any , effect_sets:: Any ) ,
1080- Insn :: ObjToString { .. } => Effect :: from_bits ( effect_sets:: Any , effect_sets:: Any ) ,
1081- Insn :: AnyToString { .. } => Effect :: from_bits ( effect_sets:: Any , effect_sets:: Any ) ,
1082- Insn :: GetLocal { rest_param : true , .. } => Effect :: from_bits ( effect_sets:: Any , effect_sets:: Any ) ,
1083- Insn :: GetLocal { .. } => Effect :: from_bits ( effect_sets:: Any , effect_sets:: Any ) ,
1084- // The type of Snapshot doesn't really matter; it's never materialized. It's used only
1085- // as a reference for FrameState, which we use to generate side-exit code.
1086- Insn :: Snapshot { .. } => Effect :: from_bits ( effect_sets:: Any , effect_sets:: Any ) ,
1087- Insn :: IsA { .. } => Effect :: from_bits ( effect_sets:: Any , effect_sets:: Any ) ,
975+ Insn :: Const { .. } => Effect :: from_bits ( effect_sets:: Any , effect_sets:: Allocator ) ,
976+ Insn :: Param => Effect :: from_bits ( effect_sets:: Any , effect_sets:: Allocator ) ,
977+ Insn :: StringCopy { .. } => Effect :: from_bits ( effect_sets:: Any , effect_sets:: Allocator ) ,
978+ Insn :: NewArray { .. } => Effect :: from_bits ( effect_sets:: Any , effect_sets:: Allocator ) ,
979+ // NewHash's operands may be hashed and compared for equalityEffect::from_bits(effect_sets::Any, effect_sets::Allocator), which could have
980+ // side-effects.
981+ // fix newhash which seems to be different than the rest
982+ // Insn::NewHash { elementsEffect::from_bits(effect_sets::Any, effect_sets::Allocator), .. } => Effect::from_bits(effect_sets::Any, effect_sets::Allocator),
983+ Insn :: ArrayDup { .. } => Effect :: from_bits ( effect_sets:: Any , effect_sets:: Allocator ) ,
984+ Insn :: HashDup { .. } => Effect :: from_bits ( effect_sets:: Any , effect_sets:: Allocator ) ,
985+ Insn :: Test { .. } => Effect :: from_bits ( effect_sets:: Any , effect_sets:: Allocator ) ,
986+ Insn :: Snapshot { .. } => Effect :: from_bits ( effect_sets:: Any , effect_sets:: Allocator ) ,
987+ Insn :: FixnumAdd { .. } => Effect :: from_bits ( effect_sets:: Any , effect_sets:: Allocator ) ,
988+ Insn :: FixnumSub { .. } => Effect :: from_bits ( effect_sets:: Any , effect_sets:: Allocator ) ,
989+ Insn :: FixnumMult { .. } => Effect :: from_bits ( effect_sets:: Any , effect_sets:: Allocator ) ,
990+ Insn :: FixnumEq { .. } => Effect :: from_bits ( effect_sets:: Any , effect_sets:: Allocator ) ,
991+ Insn :: FixnumNeq { .. } => Effect :: from_bits ( effect_sets:: Any , effect_sets:: Allocator ) ,
992+ Insn :: FixnumLt { .. } => Effect :: from_bits ( effect_sets:: Any , effect_sets:: Allocator ) ,
993+ Insn :: FixnumLe { .. } => Effect :: from_bits ( effect_sets:: Any , effect_sets:: Allocator ) ,
994+ Insn :: FixnumGt { .. } => Effect :: from_bits ( effect_sets:: Any , effect_sets:: Allocator ) ,
995+ Insn :: FixnumGe { .. } => Effect :: from_bits ( effect_sets:: Any , effect_sets:: Allocator ) ,
996+ Insn :: FixnumAnd { .. } => Effect :: from_bits ( effect_sets:: Any , effect_sets:: Allocator ) ,
997+ Insn :: FixnumOr { .. } => Effect :: from_bits ( effect_sets:: Any , effect_sets:: Allocator ) ,
998+ Insn :: FixnumXor { .. } => Effect :: from_bits ( effect_sets:: Any , effect_sets:: Allocator ) ,
999+ Insn :: FixnumLShift { .. } => Effect :: from_bits ( effect_sets:: Any , effect_sets:: Allocator ) ,
1000+ Insn :: FixnumRShift { .. } => Effect :: from_bits ( effect_sets:: Any , effect_sets:: Allocator ) ,
1001+ Insn :: GetLocal { .. } => Effect :: from_bits ( effect_sets:: Any , effect_sets:: Allocator ) ,
1002+ Insn :: IsNil { .. } => Effect :: from_bits ( effect_sets:: Any , effect_sets:: Allocator ) ,
1003+ Insn :: LoadPC => Effect :: from_bits ( effect_sets:: Any , effect_sets:: Allocator ) ,
1004+ Insn :: LoadEC => Effect :: from_bits ( effect_sets:: Any , effect_sets:: Allocator ) ,
1005+ Insn :: LoadSelf => Effect :: from_bits ( effect_sets:: Any , effect_sets:: Allocator ) ,
1006+ Insn :: LoadField { .. } => Effect :: from_bits ( effect_sets:: Any , effect_sets:: Allocator ) ,
1007+ // Special case, let's fix this
1008+ // Insn::CCall { elidable, .. } => !elidable Effect::from_bits(effect_sets::Any, effect_sets::Allocator),
1009+ // Special case, let's fix this one too
1010+ // Insn::CCallWithFrame { elidable, .. } => !elidable Effect::from_bits(effect_sets::Any, effect_sets::Allocator),
1011+ Insn :: ObjectAllocClass { .. } => Effect :: from_bits ( effect_sets:: Any , effect_sets:: Allocator ) ,
1012+ Insn :: NewRangeFixnum { .. } => Effect :: from_bits ( effect_sets:: Any , effect_sets:: Allocator ) ,
1013+ Insn :: StringGetbyte { .. } => Effect :: from_bits ( effect_sets:: Any , effect_sets:: Allocator ) ,
1014+ Insn :: IsBlockGiven => Effect :: from_bits ( effect_sets:: Any , effect_sets:: Allocator ) ,
1015+ Insn :: BoxFixnum { .. } => Effect :: from_bits ( effect_sets:: Any , effect_sets:: Allocator ) ,
1016+ Insn :: BoxBool { .. } => Effect :: from_bits ( effect_sets:: Any , effect_sets:: Allocator ) ,
1017+ Insn :: IsBitEqual { .. } => Effect :: from_bits ( effect_sets:: Any , effect_sets:: Allocator ) ,
1018+ Insn :: IsA { .. } => Effect :: from_bits ( effect_sets:: Any , effect_sets:: Allocator ) ,
1019+ _ => Effect :: from_bits ( effect_sets:: Any , effect_sets:: Any ) ,
10881020 }
10891021 }
10901022
0 commit comments