@@ -7949,7 +7949,7 @@ static int zend_jit_defined(zend_jit_ctx *jit, const zend_op *opline, uint8_t sm
79497949 return 1;
79507950}
79517951
7952- static int zend_jit_escape_if_undef(zend_jit_ctx *jit, int var, uint32_t flags, const zend_op *opline, int8_t reg)
7952+ static int zend_jit_escape_if_undef(zend_jit_ctx *jit, int var, uint32_t flags, const zend_op *opline, const zend_op_array *op_array, int8_t reg)
79537953{
79547954 zend_jit_addr reg_addr = ZEND_ADDR_REF_ZVAL(zend_jit_deopt_rload(jit, IR_ADDR, reg));
79557955 ir_ref if_def = ir_IF(jit_Z_TYPE(jit, reg_addr));
@@ -7972,7 +7972,20 @@ static int zend_jit_escape_if_undef(zend_jit_ctx *jit, int var, uint32_t flags,
79727972 }
79737973
79747974 jit_LOAD_IP_ADDR(jit, opline - 1);
7975- ir_IJMP(jit_STUB_ADDR(jit, jit_stub_trace_escape));
7975+
7976+ /* We can't use trace_escape() because opcode handler may be overridden by JIT */
7977+ zend_jit_op_array_trace_extension *jit_extension =
7978+ (zend_jit_op_array_trace_extension*)ZEND_FUNC_INFO(op_array);
7979+ size_t offset = jit_extension->offset;
7980+ ir_ref ref = ir_CONST_ADDR(ZEND_OP_TRACE_INFO((opline - 1), offset)->orig_handler);
7981+ if (GCC_GLOBAL_REGS || ZEND_VM_KIND == ZEND_VM_KIND_TAILCALL) {
7982+ ir_TAILCALL(IR_OPCODE_HANDLER_RET, ref);
7983+ } else {
7984+ #if defined(IR_TARGET_X86)
7985+ ref = ir_CAST_FC_FUNC(ref);
7986+ #endif
7987+ ir_TAILCALL_2(IR_ADDR, ref, jit_FP(jit), jit_IP(jit));
7988+ }
79767989
79777990 ir_IF_TRUE(if_def);
79787991
0 commit comments