@@ -471,7 +471,7 @@ pub enum Insn {
471471 Test { val : InsnId } ,
472472 /// Return C `true` if `val` is `Qnil`, else `false`.
473473 IsNil { val : InsnId } ,
474- Defined { op_type : usize , obj : VALUE , pushval : VALUE , v : InsnId } ,
474+ Defined { op_type : usize , obj : VALUE , pushval : VALUE , v : InsnId , state : InsnId } ,
475475 GetConstantPath { ic : * const iseq_inline_constant_cache , state : InsnId } ,
476476
477477 /// Get a global variable named `id`
@@ -1172,7 +1172,7 @@ impl Function {
11721172 & ArrayDup { val, state } => ArrayDup { val : find ! ( val) , state } ,
11731173 & HashDup { val, state } => HashDup { val : find ! ( val) , state } ,
11741174 & CCall { cfun, ref args, name, return_type, elidable } => CCall { cfun, args : find_vec ! ( args) , name, return_type, elidable } ,
1175- & Defined { op_type, obj, pushval, v } => Defined { op_type, obj, pushval, v : find ! ( v) } ,
1175+ & Defined { op_type, obj, pushval, v, state } => Defined { op_type, obj, pushval, v : find ! ( v) , state : find ! ( state ) } ,
11761176 & DefinedIvar { self_val, pushval, id, state } => DefinedIvar { self_val : find ! ( self_val) , pushval, id, state } ,
11771177 & NewArray { ref elements, state } => NewArray { elements : find_vec ! ( elements) , state : find ! ( state) } ,
11781178 & NewHash { ref elements, state } => {
@@ -2770,7 +2770,8 @@ pub fn iseq_to_hir(iseq: *const rb_iseq_t) -> Result<Function, ParseError> {
27702770 let obj = get_arg ( pc, 1 ) ;
27712771 let pushval = get_arg ( pc, 2 ) ;
27722772 let v = state. stack_pop ( ) ?;
2773- state. stack_push ( fun. push_insn ( block, Insn :: Defined { op_type, obj, pushval, v } ) ) ;
2773+ let exit_id = fun. push_insn ( block, Insn :: Snapshot { state : exit_state } ) ;
2774+ state. stack_push ( fun. push_insn ( block, Insn :: Defined { op_type, obj, pushval, v, state : exit_id } ) ) ;
27742775 }
27752776 YARVINSN_definedivar => {
27762777 // (ID id, IVC ic, VALUE pushval)
@@ -4043,12 +4044,12 @@ mod tests {
40434044 fn test@<compiled>:2:
40444045 bb0(v0:BasicObject):
40454046 v2:NilClass = Const Value(nil)
4046- v3 :BasicObject = Defined constant, v2
4047- v4 :BasicObject = Defined func, v0
4048- v5 :NilClass = Const Value(nil)
4049- v6 :BasicObject = Defined global-variable, v5
4050- v8 :ArrayExact = NewArray v3, v4, v6
4051- Return v8
4047+ v4 :BasicObject = Defined constant, v2
4048+ v6 :BasicObject = Defined func, v0
4049+ v7 :NilClass = Const Value(nil)
4050+ v9 :BasicObject = Defined global-variable, v7
4051+ v11 :ArrayExact = NewArray v4, v6, v9
4052+ Return v11
40524053 "# ] ] ) ;
40534054 }
40544055
0 commit comments