@@ -549,7 +549,7 @@ pub enum Insn {
549549 ToNewArray { val : InsnId , state : InsnId } ,
550550 NewArray { elements : Vec < InsnId > , state : InsnId } ,
551551 /// NewHash contains a vec of (key, value) pairs
552- NewHash { elements : Vec < ( InsnId , InsnId ) > , state : InsnId } ,
552+ NewHash { elements : Vec < InsnId > , state : InsnId } ,
553553 NewRange { low : InsnId , high : InsnId , flag : RangeType , state : InsnId } ,
554554 NewRangeFixnum { low : InsnId , high : InsnId , flag : RangeType , state : InsnId } ,
555555 ArrayDup { val : InsnId , state : InsnId } ,
@@ -816,9 +816,11 @@ impl<'a> std::fmt::Display for InsnPrinter<'a> {
816816 Insn :: NewHash { elements, .. } => {
817817 write ! ( f, "NewHash" ) ?;
818818 let mut prefix = " " ;
819- for ( key, value) in elements {
820- write ! ( f, "{prefix}{key}: {value}" ) ?;
821- prefix = ", " ;
819+ for chunk in elements. chunks ( 2 ) {
820+ if let [ key, value] = chunk {
821+ write ! ( f, "{prefix}{key}: {value}" ) ?;
822+ prefix = ", " ;
823+ }
822824 }
823825 Ok ( ( ) )
824826 }
@@ -1462,13 +1464,7 @@ impl Function {
14621464 & Defined { op_type, obj, pushval, v, state } => Defined { op_type, obj, pushval, v : find ! ( v) , state : find ! ( state) } ,
14631465 & DefinedIvar { self_val, pushval, id, state } => DefinedIvar { self_val : find ! ( self_val) , pushval, id, state } ,
14641466 & NewArray { ref elements, state } => NewArray { elements : find_vec ! ( elements) , state : find ! ( state) } ,
1465- & NewHash { ref elements, state } => {
1466- let mut found_elements = vec ! [ ] ;
1467- for & ( key, value) in elements {
1468- found_elements. push ( ( find ! ( key) , find ! ( value) ) ) ;
1469- }
1470- NewHash { elements : found_elements, state : find ! ( state) }
1471- }
1467+ & NewHash { ref elements, state } => NewHash { elements : find_vec ! ( elements) , state : find ! ( state) } ,
14721468 & NewRange { low, high, flag, state } => NewRange { low : find ! ( low) , high : find ! ( high) , flag, state : find ! ( state) } ,
14731469 & NewRangeFixnum { low, high, flag, state } => NewRangeFixnum { low : find ! ( low) , high : find ! ( high) , flag, state : find ! ( state) } ,
14741470 & ArrayMax { ref elements, state } => ArrayMax { elements : find_vec ! ( elements) , state : find ! ( state) } ,
@@ -2369,17 +2365,11 @@ impl Function {
23692365 worklist. push_back ( state) ;
23702366 }
23712367 & Insn :: ArrayMax { ref elements, state }
2368+ | & Insn :: NewHash { ref elements, state }
23722369 | & Insn :: NewArray { ref elements, state } => {
23732370 worklist. extend ( elements) ;
23742371 worklist. push_back ( state) ;
23752372 }
2376- & Insn :: NewHash { ref elements, state } => {
2377- for & ( key, value) in elements {
2378- worklist. push_back ( key) ;
2379- worklist. push_back ( value) ;
2380- }
2381- worklist. push_back ( state) ;
2382- }
23832373 & Insn :: NewRange { low, high, state, .. }
23842374 | & Insn :: NewRangeFixnum { low, high, state, .. } => {
23852375 worklist. push_back ( low) ;
@@ -3430,7 +3420,8 @@ pub fn iseq_to_hir(iseq: *const rb_iseq_t) -> Result<Function, ParseError> {
34303420 for _ in 0 ..( count/2 ) {
34313421 let value = state. stack_pop ( ) ?;
34323422 let key = state. stack_pop ( ) ?;
3433- elements. push ( ( key, value) ) ;
3423+ elements. push ( value) ;
3424+ elements. push ( key) ;
34343425 }
34353426 elements. reverse ( ) ;
34363427 state. stack_push ( fun. push_insn ( block, Insn :: NewHash { elements, state : exit_id } ) ) ;
0 commit comments