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

44 lines
778 B
PHP

--TEST--
PFA in constexpr: error during arg list evaluation
--FILE--
<?php
function f($a = g(strlen(?), e: strlen(?), a: strlen(?), ...)) {
}
function g($a, $b, $c, $d, $e) {
}
function h($a = i(strlen(?), a: strlen(?), b: invalid(?), ...)) {
}
function i(...$args) {
}
function j($a = g(c: new stdClass, ...), $b = g(c: MISSING_CONST + 1, ...)) {
}
try {
f();
} catch (Error $e) {
echo $e::class, ": ", $e->getMessage(), "\n";
}
try {
h();
} catch (Error $e) {
echo $e::class, ": ", $e->getMessage(), "\n";
}
try {
j();
} catch (Error $e) {
echo $e::class, ": ", $e->getMessage(), "\n";
}
?>
--EXPECT--
Error: Named parameter $a overwrites previous argument
Error: Call to undefined function invalid()
Error: Undefined constant "MISSING_CONST"