@@ -4433,6 +4433,7 @@ static const void *zend_jit_trace(zend_jit_trace_rec *trace_buffer, uint32_t par
4433
4433
SET_STACK_TYPE (stack , i , IS_UNKNOWN );
4434
4434
}
4435
4435
}
4436
+ opline = NULL ;
4436
4437
}
4437
4438
JIT_G (current_frame ) = frame ;
4438
4439
if (res_type != IS_UNKNOWN
@@ -4504,8 +4505,19 @@ static const void *zend_jit_trace(zend_jit_trace_rec *trace_buffer, uint32_t par
4504
4505
skip_guard = 1 ;
4505
4506
}
4506
4507
}
4507
- if (!skip_guard && !zend_jit_init_fcall_guard (& dasm_state , NULL , p -> func , trace_buffer [1 ].opline )) {
4508
- goto jit_failure ;
4508
+
4509
+ if (!skip_guard ) {
4510
+ if (!opline ) {
4511
+ zend_jit_trace_rec * q = p + 1 ;
4512
+ while (q -> op != ZEND_JIT_TRACE_VM && q -> op != ZEND_JIT_TRACE_END ) {
4513
+ q ++ ;
4514
+ }
4515
+ opline = q -> opline ;
4516
+ ZEND_ASSERT (opline != NULL );
4517
+ }
4518
+ if (!zend_jit_init_fcall_guard (& dasm_state , NULL , p -> func , opline )) {
4519
+ goto jit_failure ;
4520
+ }
4509
4521
}
4510
4522
}
4511
4523
}
@@ -4590,12 +4602,13 @@ static const void *zend_jit_trace(zend_jit_trace_rec *trace_buffer, uint32_t par
4590
4602
} else if (p -> stop == ZEND_JIT_TRACE_STOP_LINK
4591
4603
|| p -> stop == ZEND_JIT_TRACE_STOP_RETURN_HALT
4592
4604
|| p -> stop == ZEND_JIT_TRACE_STOP_INTERPRETER ) {
4593
- if (opline -> opcode == ZEND_DO_UCALL
4594
- || opline -> opcode == ZEND_DO_FCALL
4595
- || opline -> opcode == ZEND_DO_FCALL_BY_NAME
4596
- || opline -> opcode == ZEND_YIELD
4597
- || opline -> opcode == ZEND_YIELD_FROM
4598
- || opline -> opcode == ZEND_INCLUDE_OR_EVAL ) {
4605
+ if (opline
4606
+ && (opline -> opcode == ZEND_DO_UCALL
4607
+ || opline -> opcode == ZEND_DO_FCALL
4608
+ || opline -> opcode == ZEND_DO_FCALL_BY_NAME
4609
+ || opline -> opcode == ZEND_YIELD
4610
+ || opline -> opcode == ZEND_YIELD_FROM
4611
+ || opline -> opcode == ZEND_INCLUDE_OR_EVAL )) {
4599
4612
zend_jit_trace_setup_ret_counter (opline , jit_extension -> offset );
4600
4613
}
4601
4614
if (JIT_G (current_frame )
0 commit comments