Skip to content

Commit

Permalink
zend_closures.c: In Closure::__invoke() call the closure directly (#…
Browse files Browse the repository at this point in the history
…17372)

This prevents a bunch of indirection which ultimately calls `zend_closure_get_closure()` anyway via the `get_closure` object handler.
  • Loading branch information
Girgias authored Jan 7, 2025
1 parent 17ea79b commit e40543a
Showing 1 changed file with 8 additions and 3 deletions.
11 changes: 8 additions & 3 deletions Zend/zend_closures.c
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand All @@ -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);
Expand Down

0 comments on commit e40543a

Please sign in to comment.