@@ -3503,7 +3503,7 @@ static int zend_jit_trace_exit_needs_deoptimization(uint32_t trace_num, uint32_t
35033503 uint32_t stack_size ;
35043504 zend_jit_trace_stack * stack ;
35053505
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 ))) {
35073507 return 1 ;
35083508 }
35093509
@@ -3663,7 +3663,7 @@ static int zend_jit_trace_deoptimization(
36633663 }
36643664 }
36653665
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 )) {
36673667 zend_jit_check_exception (jit );
36683668 }
36693669
@@ -8013,6 +8013,9 @@ static void zend_jit_dump_exit_info(zend_jit_trace_info *t)
80138013 if (t -> exit_info [i ].flags & ZEND_JIT_EXIT_FREE_OP2 ) {
80148014 fprintf (stderr , "/FREE_OP2" );
80158015 }
8016+ if (t -> exit_info [i ].flags & ZEND_JIT_EXIT_CHECK_EXCEPTION ) {
8017+ fprintf (stderr , "/CHK_EXC" );
8018+ }
80168019 for (j = 0 ; j < stack_size ; j ++ ) {
80178020 uint8_t type = STACK_TYPE (stack , j );
80188021 if (type != IS_UNKNOWN ) {
@@ -8724,9 +8727,14 @@ int ZEND_FASTCALL zend_jit_trace_exit(uint32_t exit_num, zend_jit_registers_buf
87248727 EX (opline ) = opline - 1 ;
87258728 zval_ptr_dtor_nogc (EX_VAR ((opline - 1 )-> op1 .var ));
87268729 }
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 )) {
87288731 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 ;
87308738 }
87318739 }
87328740 if (t -> exit_info [exit_num ].flags & ZEND_JIT_EXIT_METHOD_CALL ) {
0 commit comments