@@ -3503,7 +3503,7 @@ static int zend_jit_trace_exit_needs_deoptimization(uint32_t trace_num, uint32_t
3503
3503
uint32_t stack_size ;
3504
3504
zend_jit_trace_stack * stack ;
3505
3505
3506
- if (opline || (flags & (ZEND_JIT_EXIT_RESTORE_CALL |ZEND_JIT_EXIT_FREE_OP1 |ZEND_JIT_EXIT_FREE_OP2 ))) {
3506
+ if (opline || (flags & (ZEND_JIT_EXIT_RESTORE_CALL |ZEND_JIT_EXIT_FREE_OP1 |ZEND_JIT_EXIT_FREE_OP2 | ZEND_JIT_EXIT_CHECK_EXCEPTION ))) {
3507
3507
return 1 ;
3508
3508
}
3509
3509
@@ -3663,7 +3663,7 @@ static int zend_jit_trace_deoptimization(
3663
3663
}
3664
3664
}
3665
3665
3666
- if (flags & (ZEND_JIT_EXIT_FREE_OP1 |ZEND_JIT_EXIT_FREE_OP2 )) {
3666
+ if (flags & (ZEND_JIT_EXIT_FREE_OP1 |ZEND_JIT_EXIT_FREE_OP2 | ZEND_JIT_EXIT_CHECK_EXCEPTION )) {
3667
3667
zend_jit_check_exception (jit );
3668
3668
}
3669
3669
@@ -8013,6 +8013,9 @@ static void zend_jit_dump_exit_info(zend_jit_trace_info *t)
8013
8013
if (t -> exit_info [i ].flags & ZEND_JIT_EXIT_FREE_OP2 ) {
8014
8014
fprintf (stderr , "/FREE_OP2" );
8015
8015
}
8016
+ if (t -> exit_info [i ].flags & ZEND_JIT_EXIT_CHECK_EXCEPTION ) {
8017
+ fprintf (stderr , "/CHK_EXC" );
8018
+ }
8016
8019
for (j = 0 ; j < stack_size ; j ++ ) {
8017
8020
uint8_t type = STACK_TYPE (stack , j );
8018
8021
if (type != IS_UNKNOWN ) {
@@ -8724,9 +8727,14 @@ int ZEND_FASTCALL zend_jit_trace_exit(uint32_t exit_num, zend_jit_registers_buf
8724
8727
EX (opline ) = opline - 1 ;
8725
8728
zval_ptr_dtor_nogc (EX_VAR ((opline - 1 )-> op1 .var ));
8726
8729
}
8727
- if (t -> exit_info [exit_num ].flags & (ZEND_JIT_EXIT_FREE_OP1 |ZEND_JIT_EXIT_FREE_OP2 )) {
8730
+ if (t -> exit_info [exit_num ].flags & (ZEND_JIT_EXIT_FREE_OP1 |ZEND_JIT_EXIT_FREE_OP2 | ZEND_JIT_EXIT_CHECK_EXCEPTION )) {
8728
8731
if (EG (exception )) {
8729
- return 1 ;
8732
+ /* EX(opline) was overridden in zend_jit_trace_exit_stub(),
8733
+ * and may be wrong when IP is reused. */
8734
+ if (GCC_GLOBAL_REGS ) {
8735
+ EX (opline ) = EG (exception_op );
8736
+ }
8737
+ return 0 ;
8730
8738
}
8731
8739
}
8732
8740
if (t -> exit_info [exit_num ].flags & ZEND_JIT_EXIT_METHOD_CALL ) {
0 commit comments