diff --git a/ext/opcache/jit/zend_jit_ir.c b/ext/opcache/jit/zend_jit_ir.c index 110d84d3a343c..b7841fd1701a8 100644 --- a/ext/opcache/jit/zend_jit_ir.c +++ b/ext/opcache/jit/zend_jit_ir.c @@ -8676,6 +8676,7 @@ static int zend_jit_push_call_frame(zend_jit_ctx *jit, const zend_op *opline, co ir_STORE(jit_CALL(rx, This), IR_NULL); } else { ir_ref object_or_called_scope, call_info, call_info2, object, if_cond; + ir_ref if_cond_user = IR_UNUSED; if (opline->op2_type == IS_CV) { // JIT: GC_ADDREF(closure); @@ -8713,15 +8714,22 @@ static int zend_jit_push_call_frame(zend_jit_ctx *jit, const zend_op *opline, co // JIT: Z_PTR(call->This) = object_or_called_scope; ir_STORE(jit_CALL(rx, This.value.ptr), object_or_called_scope); - // JIT: if (closure->func.op_array.run_time_cache__ptr) - if_cond = ir_IF(ir_LOAD_A(ir_ADD_OFFSET(func_ref, offsetof(zend_closure, func.op_array.run_time_cache__ptr)))); - ir_IF_FALSE(if_cond); + if (!func) { + // JIT: if (closure->func.common.type & ZEND_USER_FUNCTION) + ir_ref type = ir_LOAD_U8(ir_ADD_OFFSET(func_ref, offsetof(zend_closure, func.type))); + if_cond_user = ir_IF(ir_AND_U8(type, ir_CONST_U8(ZEND_USER_FUNCTION))); + ir_IF_TRUE(if_cond_user); + } - // JIT: zend_jit_init_func_run_time_cache_helper(closure->func); - ir_CALL_1(IR_VOID, ir_CONST_FC_FUNC(zend_jit_init_func_run_time_cache_helper), - ir_ADD_OFFSET(func_ref, offsetof(zend_closure, func))); + if (!func || func->common.type == ZEND_USER_FUNCTION) { + // JIT: zend_jit_init_func_run_time_cache_helper(closure->func); + ir_CALL_1(IR_VOID, ir_CONST_FC_FUNC(zend_jit_init_func_run_time_cache_helper), + ir_ADD_OFFSET(func_ref, offsetof(zend_closure, func))); + } - ir_MERGE_WITH_EMPTY_TRUE(if_cond); + if (!func) { + ir_MERGE_WITH_EMPTY_FALSE(if_cond_user); + } } // JIT: ZEND_CALL_NUM_ARGS(call) = num_args;