]> granicus.if.org Git - php/commitdiff
Don't copy args in Closure::__invoke()
authorNikita Popov <nikic@php.net>
Sat, 16 Apr 2016 12:47:27 +0000 (14:47 +0200)
committerNikita Popov <nikic@php.net>
Sat, 16 Apr 2016 12:47:27 +0000 (14:47 +0200)
Zend/zend_closures.c

index ce392e61ba5829fb7397ccc10e476c8dd4b41097..a00d000e6eb5686e60cacad03893585de2c457b3 100644 (file)
@@ -52,17 +52,11 @@ static zend_object_handlers closure_handlers;
 ZEND_METHOD(Closure, __invoke) /* {{{ */
 {
        zend_function *func = EX(func);
-       zval *arguments;
+       zval *arguments = ZEND_CALL_ARG(execute_data, 1);
 
-       arguments = emalloc(sizeof(zval) * ZEND_NUM_ARGS());
-       if (zend_get_parameters_array_ex(ZEND_NUM_ARGS(), arguments) == FAILURE) {
-               efree(arguments);
-               zend_throw_error(NULL, "Cannot get arguments for calling closure");
-               RETVAL_FALSE;
-       } else if (call_user_function_ex(CG(function_table), NULL, getThis(), return_value, ZEND_NUM_ARGS(), arguments, 1, NULL) == FAILURE) {
+       if (call_user_function_ex(CG(function_table), NULL, getThis(), return_value, ZEND_NUM_ARGS(), arguments, 1, NULL) == FAILURE) {
                RETVAL_FALSE;
        }
-       efree(arguments);
 
        /* destruct the function also, then - we have allocated it in get_method */
        zend_string_release(func->internal_function.function_name);