@@ -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