@@ -4023,20 +4023,24 @@ static const void *zend_jit_trace(zend_jit_trace_rec *trace_buffer, uint32_t par
4023
4023
call = frame -> call ;
4024
4024
assert (call && & call -> func -> op_array == p -> op_array );
4025
4025
4026
- /* Check if SEND_UNPACK/SEND_ARRAY may cause enter at different opline */
4027
- if ((opline -> opcode == ZEND_DO_UCALL
4028
- || opline -> opcode == ZEND_DO_FCALL_BY_NAME
4029
- || opline -> opcode == ZEND_DO_FCALL )
4030
- && opline > op_array -> opcodes
4031
- && ((opline - 1 )-> opcode == ZEND_SEND_ARRAY
4032
- || (opline - 1 )-> opcode == ZEND_SEND_UNPACK )
4033
- && p -> op_array -> num_args
4034
- && (p -> op_array -> fn_flags & ZEND_ACC_HAS_TYPE_HINTS ) == 0
4035
- && ((p + 1 )-> op == ZEND_JIT_TRACE_VM
4036
- || (p + 1 )-> op == ZEND_JIT_TRACE_END )
4037
- && TRACE_FRAME_NUM_ARGS (call ) < p -> op_array -> num_args
4038
- && !zend_jit_trace_opline_guard (& dasm_state , (p + 1 )-> opline )) {
4039
- goto jit_failure ;
4026
+ if (opline -> opcode == ZEND_DO_UCALL
4027
+ || opline -> opcode == ZEND_DO_FCALL_BY_NAME
4028
+ || opline -> opcode == ZEND_DO_FCALL ) {
4029
+
4030
+ frame -> call_opline = opline ;
4031
+
4032
+ /* Check if SEND_UNPACK/SEND_ARRAY may cause enter at different opline */
4033
+ if (opline > op_array -> opcodes
4034
+ && ((opline - 1 )-> opcode == ZEND_SEND_ARRAY
4035
+ || (opline - 1 )-> opcode == ZEND_SEND_UNPACK )
4036
+ && p -> op_array -> num_args
4037
+ && (p -> op_array -> fn_flags & ZEND_ACC_HAS_TYPE_HINTS ) == 0
4038
+ && ((p + 1 )-> op == ZEND_JIT_TRACE_VM
4039
+ || (p + 1 )-> op == ZEND_JIT_TRACE_END )
4040
+ && TRACE_FRAME_NUM_ARGS (call ) < p -> op_array -> num_args
4041
+ && !zend_jit_trace_opline_guard (& dasm_state , (p + 1 )-> opline )) {
4042
+ goto jit_failure ;
4043
+ }
4040
4044
}
4041
4045
4042
4046
if ((p + 1 )-> op == ZEND_JIT_TRACE_END ) {
@@ -4288,6 +4292,19 @@ static const void *zend_jit_trace(zend_jit_trace_rec *trace_buffer, uint32_t par
4288
4292
|| opline -> opcode == ZEND_DO_FCALL_BY_NAME ) {
4289
4293
zend_jit_trace_setup_ret_counter (opline , jit_extension -> offset );
4290
4294
}
4295
+ if (JIT_G (current_frame )
4296
+ && JIT_G (current_frame )-> prev ) {
4297
+ frame = JIT_G (current_frame )-> prev ;
4298
+ do {
4299
+ if (frame -> call_opline ) {
4300
+ op_array = & frame -> func -> op_array ;
4301
+ jit_extension =
4302
+ (zend_jit_op_array_trace_extension * )ZEND_FUNC_INFO (op_array );
4303
+ zend_jit_trace_setup_ret_counter (frame -> call_opline , jit_extension -> offset );
4304
+ }
4305
+ frame = frame -> prev ;
4306
+ } while (frame );
4307
+ }
4291
4308
}
4292
4309
}
4293
4310
0 commit comments