mirror of
https://github.com/php/php-src.git
synced 2024-12-11 19:04:38 +08:00
d3b484df82
This commit disallows the use of trailing positional arguments after argument unpacking was used. The following calls are no longer valid: fn(...$array, $var); fn(...$array1, $var, ...$array2); However, all of the following continue to be valid: fn($var, ...$array); fn(...$array1, ...$array2); fn($var, ...$array1, ...$array2); The reason behind this change is a stack allocation issue pointed out by Dmitry: As of PHP 5.5 the stack necessary for pushing arguments is precomputed and preallocated, as such the individual SEND opcodes no longer verify that there is enough stack space. The unpacked arguments will occupy some of that preallocated space and as such following positional arguments could write past a stack page boundary. An alternative resolution for this issue is to ensure that there is enough space for the remaining arguments in the UNPACK opcode. However making this allocation precise (rather than using a conversative over-estimate) would require some effort. Given that this particular aspect of the feature wasn't very popular in the first place, it doesn't seem worth the effort.
33 lines
392 B
PHP
33 lines
392 B
PHP
--TEST--
|
|
Unpack arguments for method calls
|
|
--FILE--
|
|
<?php
|
|
|
|
class Foo {
|
|
public function test(...$args) {
|
|
var_dump($args);
|
|
}
|
|
|
|
public static function test2(...$args) {
|
|
var_dump($args);
|
|
}
|
|
}
|
|
|
|
$foo = new Foo;
|
|
Foo::test2(1, 2, ...[3, 4], ...[], ...[5]);
|
|
|
|
?>
|
|
--EXPECT--
|
|
array(5) {
|
|
[0]=>
|
|
int(1)
|
|
[1]=>
|
|
int(2)
|
|
[2]=>
|
|
int(3)
|
|
[3]=>
|
|
int(4)
|
|
[4]=>
|
|
int(5)
|
|
}
|