@@ -2019,6 +2019,8 @@ static zend_lifetime_interval** zend_jit_trace_allocate_registers(zend_jit_trace
2019
2019
(zend_jit_op_array_trace_extension * )ZEND_FUNC_INFO (op_array );
2020
2020
op_array_ssa = & jit_extension -> func_info .ssa ;
2021
2021
frame = JIT_G (current_frame );
2022
+ frame -> prev = NULL ;
2023
+ frame -> func = (const zend_function * )op_array ;
2022
2024
stack = frame -> stack ;
2023
2025
2024
2026
count = 0 ;
@@ -2256,7 +2258,11 @@ static zend_lifetime_interval** zend_jit_trace_allocate_registers(zend_jit_trace
2256
2258
}
2257
2259
} else if (p -> op == ZEND_JIT_TRACE_ENTER ) {
2258
2260
/* New call frames */
2261
+ zend_jit_trace_stack_frame * prev_frame = frame ;
2262
+
2259
2263
frame = zend_jit_trace_call_frame (frame , op_array );
2264
+ frame -> prev = prev_frame ;
2265
+ frame -> func = (const zend_function * )p -> op_array ;
2260
2266
stack = frame -> stack ;
2261
2267
op_array = p -> op_array ;
2262
2268
jit_extension =
@@ -2292,6 +2298,8 @@ static zend_lifetime_interval** zend_jit_trace_allocate_registers(zend_jit_trace
2292
2298
stack = frame -> stack ;
2293
2299
if (level == 0 ) {
2294
2300
/* New return frames */
2301
+ frame -> prev = NULL ;
2302
+ frame -> func = (const zend_function * )op_array ;
2295
2303
j = ZEND_JIT_TRACE_GET_FIRST_SSA_VAR (p -> info );
2296
2304
for (i = 0 ; i < op_array -> last_var + op_array -> T ; i ++ ) {
2297
2305
SET_STACK_VAR (stack , i , j );
@@ -2335,6 +2343,14 @@ static zend_lifetime_interval** zend_jit_trace_allocate_registers(zend_jit_trace
2335
2343
for (i = 0 ; i < op_array -> last_var ; i ++ ) {
2336
2344
zend_jit_close_var (stack , i , start , end , flags , idx );
2337
2345
}
2346
+ while (frame -> prev ) {
2347
+ frame = frame -> prev ;
2348
+ op_array = & frame -> func -> op_array ;
2349
+ stack = frame -> stack ;
2350
+ for (i = 0 ; i < op_array -> last_var ; i ++ ) {
2351
+ zend_jit_close_var (stack , i , start , end , flags , idx );
2352
+ }
2353
+ }
2338
2354
}
2339
2355
2340
2356
if (!count ) {
0 commit comments