@@ -298,7 +298,7 @@ pub enum Insn {
298298 StringCopy { val : InsnId } ,
299299 StringIntern { val : InsnId } ,
300300
301- NewArray { elements : Vec < InsnId > } ,
301+ NewArray { elements : Vec < InsnId > , state : InsnId } ,
302302 ArraySet { array : InsnId , idx : usize , val : InsnId } ,
303303 ArrayDup { val : InsnId , state : InsnId } ,
304304
@@ -423,7 +423,7 @@ impl<'a> std::fmt::Display for InsnPrinter<'a> {
423423 match & self . inner {
424424 Insn :: Const { val } => { write ! ( f, "Const {}" , val. print( self . ptr_map) ) }
425425 Insn :: Param { idx } => { write ! ( f, "Param {idx}" ) }
426- Insn :: NewArray { elements } => {
426+ Insn :: NewArray { elements, .. } => {
427427 write ! ( f, "NewArray" ) ?;
428428 let mut prefix = " " ;
429429 for element in elements {
@@ -1633,12 +1633,13 @@ pub fn iseq_to_hir(iseq: *const rb_iseq_t) -> Result<Function, ParseError> {
16331633 }
16341634 YARVINSN_newarray => {
16351635 let count = get_arg ( pc, 0 ) . as_usize ( ) ;
1636+ let exit_id = fun. push_insn ( block, Insn :: Snapshot { state : exit_state. clone ( ) } ) ;
16361637 let mut elements = vec ! [ ] ;
16371638 for _ in 0 ..count {
16381639 elements. push ( state. stack_pop ( ) ?) ;
16391640 }
16401641 elements. reverse ( ) ;
1641- state. stack_push ( fun. push_insn ( block, Insn :: NewArray { elements } ) ) ;
1642+ state. stack_push ( fun. push_insn ( block, Insn :: NewArray { elements, state : exit_id } ) ) ;
16421643 }
16431644 YARVINSN_duparray => {
16441645 let val = fun. push_insn ( block, Insn :: Const { val : Const :: Value ( get_arg ( pc, 0 ) ) } ) ;
@@ -2046,15 +2047,16 @@ mod infer_tests {
20462047 #[ test]
20472048 fn newarray ( ) {
20482049 let mut function = Function :: new ( std:: ptr:: null ( ) ) ;
2049- let val = function. push_insn ( function. entry_block , Insn :: NewArray { elements : vec ! [ ] } ) ;
2050+ // Fake FrameState index of 0usize
2051+ let val = function. push_insn ( function. entry_block , Insn :: NewArray { elements : vec ! [ ] , state : InsnId ( 0usize ) } ) ;
20502052 assert_bit_equal ( function. infer_type ( val) , types:: ArrayExact ) ;
20512053 }
20522054
20532055 #[ test]
20542056 fn arraydup ( ) {
20552057 let mut function = Function :: new ( std:: ptr:: null ( ) ) ;
2056- let arr = function. push_insn ( function. entry_block , Insn :: NewArray { elements : vec ! [ ] } ) ;
20572058 // Fake FrameState index of 0usize
2059+ let arr = function. push_insn ( function. entry_block , Insn :: NewArray { elements : vec ! [ ] , state : InsnId ( 0usize ) } ) ;
20582060 let val = function. push_insn ( function. entry_block , Insn :: ArrayDup { val : arr, state : InsnId ( 0usize ) } ) ;
20592061 assert_bit_equal ( function. infer_type ( val) , types:: ArrayExact ) ;
20602062 }
@@ -2168,8 +2170,8 @@ mod tests {
21682170 assert_method_hir ( "test" , expect ! [ [ r#"
21692171 fn test:
21702172 bb0():
2171- v1 :ArrayExact = NewArray
2172- Return v1
2173+ v2 :ArrayExact = NewArray
2174+ Return v2
21732175 "# ] ] ) ;
21742176 }
21752177
@@ -2179,8 +2181,8 @@ mod tests {
21792181 assert_method_hir ( "test" , expect ! [ [ r#"
21802182 fn test:
21812183 bb0(v0:BasicObject):
2182- v2 :ArrayExact = NewArray v0
2183- Return v2
2184+ v3 :ArrayExact = NewArray v0
2185+ Return v3
21842186 "# ] ] ) ;
21852187 }
21862188
@@ -2190,8 +2192,8 @@ mod tests {
21902192 assert_method_hir ( "test" , expect ! [ [ r#"
21912193 fn test:
21922194 bb0(v0:BasicObject, v1:BasicObject):
2193- v3 :ArrayExact = NewArray v0, v1
2194- Return v3
2195+ v4 :ArrayExact = NewArray v0, v1
2196+ Return v4
21952197 "# ] ] ) ;
21962198 }
21972199
@@ -2989,8 +2991,8 @@ mod opt_tests {
29892991 assert_optimized_method_hir ( "test" , expect ! [ [ r#"
29902992 fn test:
29912993 bb0():
2992- v3 :Fixnum[5] = Const Value(5)
2993- Return v3
2994+ v4 :Fixnum[5] = Const Value(5)
2995+ Return v4
29942996 "# ] ] ) ;
29952997 }
29962998
@@ -3006,8 +3008,8 @@ mod opt_tests {
30063008 assert_optimized_method_hir ( "test" , expect ! [ [ r#"
30073009 fn test:
30083010 bb0(v0:BasicObject):
3009- v4 :Fixnum[5] = Const Value(5)
3010- Return v4
3011+ v5 :Fixnum[5] = Const Value(5)
3012+ Return v5
30113013 "# ] ] ) ;
30123014 }
30133015
0 commit comments