diff options
author | Nikita Popov <nikic@php.net> | 2015-05-29 11:06:28 +0200 |
---|---|---|
committer | Nikita Popov <nikic@php.net> | 2015-05-29 11:07:23 +0200 |
commit | e7d0ca39e5030226d3c237a481b1c50d8a2db2f3 (patch) | |
tree | 3f0770f72cd4fb16bf45f60e5b74648b5aa9b622 /Zend | |
parent | 424005a30167e0d3fbf822cd76b3e266c1d141bb (diff) | |
download | php-git-e7d0ca39e5030226d3c237a481b1c50d8a2db2f3.tar.gz |
Preserve VARIADIC flag for Closure::__invoke()
The 13 arguments are for the benefit of PHP 7, where the first
twelve use the bitmask.
Diffstat (limited to 'Zend')
-rw-r--r-- | Zend/tests/variadic/closure_invoke.phpt | 17 | ||||
-rw-r--r-- | Zend/zend_closures.c | 4 |
2 files changed, 20 insertions, 1 deletions
diff --git a/Zend/tests/variadic/closure_invoke.phpt b/Zend/tests/variadic/closure_invoke.phpt new file mode 100644 index 0000000000..6641ff8fb0 --- /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 53465af026..90d7eaf8c0 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; |