@@ -5545,7 +5545,6 @@ static const void *zend_jit_trace(zend_jit_trace_rec *trace_buffer, uint32_t par
5545
5545
/* unconditional branch */
5546
5546
exit_addr = NULL ;
5547
5547
} else if (opline -> result_type == IS_TMP_VAR ) {
5548
- zend_jit_trace_stack * stack = JIT_G (current_frame )-> stack ;
5549
5548
uint32_t old_info = STACK_INFO (stack , EX_VAR_TO_NUM (opline -> result .var ));
5550
5549
5551
5550
SET_STACK_TYPE (stack , EX_VAR_TO_NUM (opline -> result .var ), IS_UNKNOWN , 1 );
@@ -5817,14 +5816,19 @@ static const void *zend_jit_trace(zend_jit_trace_rec *trace_buffer, uint32_t par
5817
5816
bool exit_if_true = 0 ;
5818
5817
const zend_op * exit_opline = zend_jit_trace_get_exit_opline (p + 1 , opline + 1 , & exit_if_true );
5819
5818
uint32_t exit_point ;
5819
+ int32_t old_ref = 0 ;
5820
+ uint8_t old_flags = 0 ;
5820
5821
5821
5822
if (ra ) {
5823
+ if (opline -> op2_type != IS_CONST ) {
5824
+ old_ref = STACK_REF (stack , EX_VAR_TO_NUM (opline -> op2 .var ));
5825
+ old_flags = STACK_FLAGS (stack , EX_VAR_TO_NUM (opline -> op2 .var ));
5826
+ }
5822
5827
zend_jit_trace_cleanup_stack (& ctx , stack , opline , ssa_op , ssa , ssa_opcodes );
5823
5828
}
5824
5829
if (ssa_op -> op1_use >= 0
5825
5830
&& ssa -> var_info [ssa_op -> op1_use ].avoid_refcounting ) {
5826
5831
/* Temporary reset ZREG_ZVAL_TRY_ADDREF */
5827
- zend_jit_trace_stack * stack = JIT_G (current_frame )-> stack ;
5828
5832
uint32_t old_info = STACK_INFO (stack , EX_VAR_TO_NUM (opline -> op1 .var ));
5829
5833
5830
5834
SET_STACK_REG (stack , EX_VAR_TO_NUM (opline -> op1 .var ), ZREG_NONE );
@@ -5837,6 +5841,9 @@ static const void *zend_jit_trace(zend_jit_trace_rec *trace_buffer, uint32_t par
5837
5841
if (!exit_addr ) {
5838
5842
goto jit_failure ;
5839
5843
}
5844
+ if (old_ref ) {
5845
+ SET_STACK_REF_EX (stack , EX_VAR_TO_NUM (opline -> op2 .var ), old_ref , old_flags );
5846
+ }
5840
5847
smart_branch_opcode = exit_if_true ? ZEND_JMPNZ : ZEND_JMPZ ;
5841
5848
} else {
5842
5849
smart_branch_opcode = 0 ;
0 commit comments