com php-src: Preserve VARIADIC flag for Closure::__invo ke(): Zend/tests/variadic/closure_invoke.phpt Zen d/zend_closures.c
| From: | Nikita Popov | Date: | Fri, 29 May 2015 09:07:23 +0000 |
| Subject: | com php-src: Preserve VARIADIC flag for Closure::__invo ke(): Zend/tests/variadic/closure_invoke.phpt Zen d/zend_closures.c | ||
| Groups: | php.cvs | ||
| Request: | Send a blank email to php-cvs+get-86988@lists.php.net to get a copy of this message | ||
Commit: e7d0ca39e5030226d3c237a481b1c50d8a2db2f3
Author: Nikita Popov <nikic@php.net> Fri, 29 May 2015 11:06:28 +0200
Parents: 424005a30167e0d3fbf822cd76b3e266c1d141bb
Branches: PHP-5.6 master
Link: http://git.php.net/?p=php-src.git;a=commitdiff;h=e7d0ca39e5030226d3c237a481b1c50d8a2db2f3
Log:
Preserve VARIADIC flag for Closure::__invoke()
The 13 arguments are for the benefit of PHP 7, where the first
twelve use the bitmask.
Changed paths:
A Zend/tests/variadic/closure_invoke.phpt
M Zend/zend_closures.c
Diff:
diff --git a/Zend/tests/variadic/closure_invoke.phpt b/Zend/tests/variadic/closure_invoke.phpt
new file mode 100644
index 0000000..6641ff8
--- /dev/null
+++ b/Zend/tests/variadic/closure_invoke.phpt
@@ -0,0 +1,17 @@
+--TEST--
+Closure::__invoke() with variadic parameter
+--FILE--
+<?php
+
+$closure = function(&...$refs) {};
+$closure->__invoke(
+ $v1, $v2, $v3, $v4,
+ $v5, $v6, $v7, $v8,
+ $v9, $v10, $v11, $v12,
+ $v13
+);
+
+?>
+===DONE===
+--EXPECT--
+===DONE===
diff --git a/Zend/zend_closures.c b/Zend/zend_closures.c
index 53465af..90d7eaf 100644
--- a/Zend/zend_closures.c
+++ b/Zend/zend_closures.c
@@ -148,10 +148,12 @@ ZEND_API zend_function *zend_get_closure_invoke_method(zval *obj TSRMLS_DC) /*
{
{
zend_closure *closure = (zend_closure *)zend_object_store_get_object(obj TSRMLS_CC);
zend_function *invoke = (zend_function*)emalloc(sizeof(zend_function));
+ const zend_uint keep_flags = ZEND_ACC_RETURN_REFERENCE | ZEND_ACC_VARIADIC;
invoke->common = closure->func.common;
invoke->type = ZEND_INTERNAL_FUNCTION;
- invoke->internal_function.fn_flags = ZEND_ACC_PUBLIC | ZEND_ACC_CALL_VIA_HANDLER |
(closure->func.common.fn_flags & ZEND_ACC_RETURN_REFERENCE);
+ invoke->internal_function.fn_flags =
+ ZEND_ACC_PUBLIC | ZEND_ACC_CALL_VIA_HANDLER | (closure->func.common.fn_flags &
keep_flags);
invoke->internal_function.handler = ZEND_MN(Closure___invoke);
invoke->internal_function.module = 0;
invoke->internal_function.scope = zend_ce_closure;