@@ -40,6 +40,8 @@ typedef struct _zend_closure {
40
40
ZEND_API zend_class_entry * zend_ce_closure ;
41
41
static zend_object_handlers closure_handlers ;
42
42
43
+ 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 );
44
+
43
45
ZEND_METHOD (Closure , __invoke ) /* {{{ */
44
46
{
45
47
zend_function * func = EX (func );
@@ -51,9 +53,12 @@ ZEND_METHOD(Closure, __invoke) /* {{{ */
51
53
Z_PARAM_VARIADIC_WITH_NAMED (args , num_args , named_args )
52
54
ZEND_PARSE_PARAMETERS_END ();
53
55
54
- if (call_user_function_named (CG (function_table ), NULL , ZEND_THIS , return_value , num_args , args , named_args ) == FAILURE ) {
55
- RETVAL_FALSE ;
56
- }
56
+ zend_fcall_info_cache fcc = {
57
+ .closure = Z_OBJ_P (ZEND_THIS ),
58
+ };
59
+ zend_closure_get_closure (Z_OBJ_P (ZEND_THIS ), & fcc .calling_scope , & fcc .function_handler , & fcc .object , false);
60
+ fcc .called_scope = fcc .calling_scope ;
61
+ zend_call_known_fcc (& fcc , return_value , num_args , args , named_args );
57
62
58
63
/* destruct the function also, then - we have allocated it in get_method */
59
64
zend_string_release_ex (func -> internal_function .function_name , 0 );
0 commit comments