@@ -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 > , state : InsnId } ,
552+ NewHash { elements_ptr : InsnId , elements_count : usize , 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 } ,
@@ -755,7 +755,7 @@ impl Insn {
755755 Insn :: NewArray { .. } => false ,
756756 // NewHash's operands may be hashed and compared for equality, which could have
757757 // side-effects.
758- Insn :: NewHash { elements , .. } => !elements . is_empty ( ) ,
758+ Insn :: NewHash { elements_count , .. } => * elements_count > 0 ,
759759 Insn :: ArrayDup { .. } => false ,
760760 Insn :: HashDup { .. } => false ,
761761 Insn :: Test { .. } => false ,
@@ -817,16 +817,8 @@ impl<'a> std::fmt::Display for InsnPrinter<'a> {
817817 }
818818 Ok ( ( ) )
819819 }
820- Insn :: NewHash { elements, .. } => {
821- write ! ( f, "NewHash" ) ?;
822- let mut prefix = " " ;
823- for chunk in elements. chunks ( 2 ) {
824- if let [ key, value] = chunk {
825- write ! ( f, "{prefix}{key}: {value}" ) ?;
826- prefix = ", " ;
827- }
828- }
829- Ok ( ( ) )
820+ Insn :: NewHash { elements_ptr, elements_count, .. } => {
821+ write ! ( f, "NewHash {elements_ptr} ({elements_count})" )
830822 }
831823 Insn :: NewRange { low, high, flag, .. } => {
832824 write ! ( f, "NewRange {low} {flag} {high}" )
@@ -1462,7 +1454,7 @@ impl Function {
14621454 & Defined { op_type, obj, pushval, v, state } => Defined { op_type, obj, pushval, v : find ! ( v) , state : find ! ( state) } ,
14631455 & DefinedIvar { self_val, pushval, id, state } => DefinedIvar { self_val : find ! ( self_val) , pushval, id, state } ,
14641456 & NewArray { ref elements, state } => NewArray { elements : find_vec ! ( elements) , state : find ! ( state) } ,
1465- & NewHash { ref elements , state } => NewHash { elements : find_vec ! ( elements ) , state : find ! ( state) } ,
1457+ & NewHash { elements_ptr , elements_count , state } => NewHash { elements_ptr : find ! ( elements_ptr ) , elements_count , state : find ! ( state) } ,
14661458 & NewRange { low, high, flag, state } => NewRange { low : find ! ( low) , high : find ! ( high) , flag, state : find ! ( state) } ,
14671459 & NewRangeFixnum { low, high, flag, state } => NewRangeFixnum { low : find ! ( low) , high : find ! ( high) , flag, state : find ! ( state) } ,
14681460 & ArrayMax { ref elements, state } => ArrayMax { elements : find_vec ! ( elements) , state : find ! ( state) } ,
@@ -2375,13 +2367,8 @@ impl Function {
23752367 worklist. extend ( elements) ;
23762368 worklist. push_back ( state) ;
23772369 }
2378- & Insn :: NewHash { ref elements, state } => {
2379- for chunk in elements. chunks ( 2 ) {
2380- if let & [ key, value] = chunk {
2381- worklist. push_back ( key) ;
2382- worklist. push_back ( value) ;
2383- }
2384- }
2370+ & Insn :: NewHash { elements_ptr, state, .. } => {
2371+ worklist. push_back ( elements_ptr) ;
23852372 worklist. push_back ( state) ;
23862373 }
23872374 & Insn :: NewRange { low, high, state, .. }
@@ -3451,7 +3438,8 @@ pub fn iseq_to_hir(iseq: *const rb_iseq_t) -> Result<Function, ParseError> {
34513438 elements. push ( key) ;
34523439 elements. push ( value) ;
34533440 }
3454- state. stack_push ( fun. push_insn ( block, Insn :: NewHash { elements, state : exit_id } ) ) ;
3441+ let elements_ptr = fun. push_insn ( block, Insn :: PushOpnds { opnds : elements } ) ;
3442+ state. stack_push ( fun. push_insn ( block, Insn :: NewHash { elements_ptr, elements_count : count, state : exit_id } ) ) ;
34553443 }
34563444 YARVINSN_duphash => {
34573445 let val = fun. push_insn ( block, Insn :: Const { val : Const :: Value ( get_arg ( pc, 0 ) ) } ) ;
0 commit comments