mirror of
https://github.com/php/php-src.git
synced 2026-03-24 00:02:20 +01:00
zend_closures.c: In Closure::__invoke() call the closure directly (#17372)
This prevents a bunch of indirection which ultimately calls `zend_closure_get_closure()` anyway via the `get_closure` object handler.
This commit is contained in:
committed by
GitHub
parent
17ea79bb4e
commit
e40543a401
@@ -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);
|
||||
|
||||
Reference in New Issue
Block a user