@@ -472,7 +472,7 @@ pub enum Insn {
472472 Test { val : InsnId } ,
473473 /// Return C `true` if `val` is `Qnil`, else `false`.
474474 IsNil { val : InsnId } ,
475- Defined { op_type : usize , obj : VALUE , pushval : VALUE , v : InsnId } ,
475+ Defined { op_type : usize , obj : VALUE , pushval : VALUE , v : InsnId , state : InsnId } ,
476476 GetConstantPath { ic : * const iseq_inline_constant_cache , state : InsnId } ,
477477
478478 /// Get a global variable named `id`
@@ -1173,7 +1173,7 @@ impl Function {
11731173 & ArrayDup { val, state } => ArrayDup { val : find ! ( val) , state } ,
11741174 & HashDup { val, state } => HashDup { val : find ! ( val) , state } ,
11751175 & CCall { cfun, ref args, name, return_type, elidable } => CCall { cfun, args : find_vec ! ( args) , name, return_type, elidable } ,
1176- & Defined { op_type, obj, pushval, v } => Defined { op_type, obj, pushval, v : find ! ( v) } ,
1176+ & Defined { op_type, obj, pushval, v, state } => Defined { op_type, obj, pushval, v : find ! ( v) , state : find ! ( state ) } ,
11771177 & DefinedIvar { self_val, pushval, id, state } => DefinedIvar { self_val : find ! ( self_val) , pushval, id, state } ,
11781178 & NewArray { ref elements, state } => NewArray { elements : find_vec ! ( elements) , state : find ! ( state) } ,
11791179 & NewHash { ref elements, state } => {
@@ -2786,7 +2786,8 @@ pub fn iseq_to_hir(iseq: *const rb_iseq_t) -> Result<Function, ParseError> {
27862786 let obj = get_arg ( pc, 1 ) ;
27872787 let pushval = get_arg ( pc, 2 ) ;
27882788 let v = state. stack_pop ( ) ?;
2789- state. stack_push ( fun. push_insn ( block, Insn :: Defined { op_type, obj, pushval, v } ) ) ;
2789+ let exit_id = fun. push_insn ( block, Insn :: Snapshot { state : exit_state } ) ;
2790+ state. stack_push ( fun. push_insn ( block, Insn :: Defined { op_type, obj, pushval, v, state : exit_id } ) ) ;
27902791 }
27912792 YARVINSN_definedivar => {
27922793 // (ID id, IVC ic, VALUE pushval)
@@ -4059,12 +4060,12 @@ mod tests {
40594060 fn test@<compiled>:2:
40604061 bb0(v0:BasicObject):
40614062 v2:NilClass = Const Value(nil)
4062- v3 :BasicObject = Defined constant, v2
4063- v4 :BasicObject = Defined func, v0
4064- v5 :NilClass = Const Value(nil)
4065- v6 :BasicObject = Defined global-variable, v5
4066- v8 :ArrayExact = NewArray v3, v4, v6
4067- Return v8
4063+ v4 :BasicObject = Defined constant, v2
4064+ v6 :BasicObject = Defined func, v0
4065+ v7 :NilClass = Const Value(nil)
4066+ v9 :BasicObject = Defined global-variable, v7
4067+ v11 :ArrayExact = NewArray v4, v6, v9
4068+ Return v11
40684069 "# ] ] ) ;
40694070 }
40704071
0 commit comments