Files
Arnaud Le Blanc 2d359a40b7 [PFA 3/n] Support PFA in const exprs (#22785)
* 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
2026-07-27 17:59:25 +02:00

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)
}