@@ -2794,22 +2794,16 @@ static int zend_jit_check_timeout(dasm_State **Dst, const zend_op *opline, const
2794
2794
| jne ->interrupt_handler
2795
2795
#else
2796
2796
| MEM_OP2_1_ZTS cmp, byte, executor_globals, vm_interrupt, 0, r0
2797
- if (last_valid_opline == opline) {
2798
- if (exit_addr) {
2799
- | jne &exit_addr
2800
- } else {
2801
- | jne ->interrupt_handler
2802
- }
2797
+ if (exit_addr) {
2798
+ | jne &exit_addr
2799
+ } else if (last_valid_opline == opline) {
2800
+ | jne ->interrupt_handler
2803
2801
} else {
2804
2802
| jne >1
2805
2803
|.cold_code
2806
2804
|1:
2807
2805
| LOAD_IP_ADDR opline
2808
- if (exit_addr) {
2809
- | jmp &exit_addr
2810
- } else {
2811
- | jmp ->interrupt_handler
2812
- }
2806
+ | jmp ->interrupt_handler
2813
2807
|.code
2814
2808
}
2815
2809
#endif
@@ -8231,6 +8225,7 @@ static int zend_jit_do_fcall(dasm_State **Dst, const zend_op *opline, const zend
8231
8225
zend_jit_addr res_addr;
8232
8226
uint32_t call_num_args = 0;
8233
8227
zend_bool unknown_num_args = 0;
8228
+ const void *exit_addr = NULL;
8234
8229
8235
8230
if (RETURN_VALUE_USED(opline)) {
8236
8231
res_addr = ZEND_ADDR_MEM_ZVAL(ZREG_FP, opline->result.var);
@@ -8340,8 +8335,8 @@ static int zend_jit_do_fcall(dasm_State **Dst, const zend_op *opline, const zend
8340
8335
if (!func) {
8341
8336
if (trace) {
8342
8337
uint32_t exit_point = zend_jit_trace_get_exit_point(opline, opline, NULL, ZEND_JIT_EXIT_TO_VM);
8343
- const void *exit_addr = zend_jit_trace_get_exit_addr(exit_point);
8344
8338
8339
+ exit_addr = zend_jit_trace_get_exit_addr(exit_point);
8345
8340
if (!exit_addr) {
8346
8341
return 0;
8347
8342
}
@@ -8628,8 +8623,8 @@ static int zend_jit_do_fcall(dasm_State **Dst, const zend_op *opline, const zend
8628
8623
if (!func) {
8629
8624
if (trace) {
8630
8625
uint32_t exit_point = zend_jit_trace_get_exit_point(opline, opline, NULL, ZEND_JIT_EXIT_TO_VM);
8631
- const void *exit_addr = zend_jit_trace_get_exit_addr(exit_point);
8632
8626
8627
+ exit_addr = zend_jit_trace_get_exit_addr(exit_point);
8633
8628
if (!exit_addr) {
8634
8629
return 0;
8635
8630
}
@@ -8762,9 +8757,20 @@ static int zend_jit_do_fcall(dasm_State **Dst, const zend_op *opline, const zend
8762
8757
|.code
8763
8758
8764
8759
// TODO: Can we avoid checking for interrupts after each call ???
8765
- if (!zend_jit_check_timeout(Dst, opline + 1, NULL)) {
8760
+ if (trace && last_valid_opline != opline) {
8761
+ int32_t exit_point = zend_jit_trace_get_exit_point(opline, opline + 1, NULL, ZEND_JIT_EXIT_TO_VM);
8762
+
8763
+ exit_addr = zend_jit_trace_get_exit_addr(exit_point);
8764
+ if (!exit_addr) {
8765
+ return 0;
8766
+ }
8767
+ } else {
8768
+ exit_addr = NULL;
8769
+ }
8770
+ if (!zend_jit_check_timeout(Dst, opline + 1, exit_addr)) {
8766
8771
return 0;
8767
8772
}
8773
+
8768
8774
if (opline->opcode != ZEND_DO_ICALL) {
8769
8775
| LOAD_IP_ADDR (opline + 1)
8770
8776
}
0 commit comments