mirror of
https://github.com/php/php-src.git
synced 2026-10-28 17:56:50 +08:00
* Use a pointer to the declaring opline->lineno as unique addr, instead of the declaring opline itself zend_partial_create() takes a 'zend_op* declaring_opline' parameter for the purpose of building a cache key: the opline address is unique to this PFA as long as it's in SHM. However the declaring opline is not available when evaluating a PFA AST. Replace the parameter by 'uint32_t* declaring_lineno'. Callers can pass '&zend_op->lineno' or '&ast->lineno': Both are unique to the related PFA. * zend_partial_create(): Remove the dependency on the declaring op_array The declaring op_array is used for multiple purposes: * Generating a PFA name * Finding the filename * Finding whether op_array is cached, and therefore whether the PFA should be cached too However it's not available when evaluating a PFA AST. Remove the declaring_op_array argument, and pass the relevant information directly: * Generate the PFA name at compile time, pass it as argument to zend_partial_create() * Pass the filename and a cacheable flag as argument to zend_partial_create() * Support for PFA in constant expressions
39 lines
536 B
PHP
39 lines
536 B
PHP
--TEST--
|
|
PFA in constexpr: nested const expr
|
|
--FILE--
|
|
<?php
|
|
|
|
function f($a = g(new stdClass, g(...), ...)) {
|
|
return $a(1);
|
|
}
|
|
|
|
function g($a, $b, $c) {
|
|
return [$a, $b, $c];
|
|
}
|
|
|
|
var_dump(f());
|
|
|
|
?>
|
|
--EXPECTF--
|
|
array(3) {
|
|
[0]=>
|
|
object(stdClass)#%d (0) {
|
|
}
|
|
[1]=>
|
|
object(Closure)#%d (2) {
|
|
["function"]=>
|
|
string(1) "g"
|
|
["parameter"]=>
|
|
array(3) {
|
|
["$a"]=>
|
|
string(10) "<required>"
|
|
["$b"]=>
|
|
string(10) "<required>"
|
|
["$c"]=>
|
|
string(10) "<required>"
|
|
}
|
|
}
|
|
[2]=>
|
|
int(1)
|
|
}
|