diff --git a/Zend/zend_closures.c b/Zend/zend_closures.c index 629aa7d51a84..e7eb47a38bd4 100644 --- a/Zend/zend_closures.c +++ b/Zend/zend_closures.c @@ -40,6 +40,8 @@ typedef struct _zend_closure { ZEND_API zend_class_entry *zend_ce_closure; static zend_object_handlers closure_handlers; +static zend_result zend_closure_get_closure(zend_object *obj, zend_class_entry **ce_ptr, zend_function **fptr_ptr, zend_object **obj_ptr, bool check_only); + ZEND_METHOD(Closure, __invoke) /* {{{ */ { zend_function *func = EX(func); @@ -51,9 +53,12 @@ ZEND_METHOD(Closure, __invoke) /* {{{ */ Z_PARAM_VARIADIC_WITH_NAMED(args, num_args, named_args) ZEND_PARSE_PARAMETERS_END(); - if (call_user_function_named(CG(function_table), NULL, ZEND_THIS, return_value, num_args, args, named_args) == FAILURE) { - RETVAL_FALSE; - } + zend_fcall_info_cache fcc = { + .closure = Z_OBJ_P(ZEND_THIS), + }; + zend_closure_get_closure(Z_OBJ_P(ZEND_THIS), &fcc.calling_scope, &fcc.function_handler, &fcc.object, false); + fcc.called_scope = fcc.calling_scope; + zend_call_known_fcc(&fcc, return_value, num_args, args, named_args); /* destruct the function also, then - we have allocated it in get_method */ zend_string_release_ex(func->internal_function.function_name, 0);