- Replace ArgList with VarList for fixed argument arrays to avoid dynamic Args allocation - Add call argument limit assertion to prevent unbounded call generation - Implement direct static method calls using callStaticMethod when possible - Add alternating dynamic static call benchmarks for class and method variations - Update documentation on request-local call slot destruction requirements - Fix dynamic static call target evaluation order to precede argument evaluation - Add tests for call argument limits and dynamic class evaluation orderingmaster
parent
30e2bb6121
commit
b69eb1dee6
13 changed files with 251 additions and 22 deletions
@ -0,0 +1,55 @@ |
||||
--TEST-- |
||||
dynamic static class target is evaluated before call arguments |
||||
--FILE-- |
||||
<?php |
||||
|
||||
class DynamicClassFirst |
||||
{ |
||||
public static function render(string $value): string |
||||
{ |
||||
return 'first:' . $value; |
||||
} |
||||
} |
||||
|
||||
class DynamicClassSecond |
||||
{ |
||||
public static function render(string $value): string |
||||
{ |
||||
return 'second:' . $value; |
||||
} |
||||
} |
||||
|
||||
function replace_dynamic_class(string &$class): string |
||||
{ |
||||
echo "argument\n"; |
||||
$class = DynamicClassSecond::class; |
||||
return 'value'; |
||||
} |
||||
|
||||
function choose_dynamic_class(): string |
||||
{ |
||||
echo "class\n"; |
||||
return DynamicClassFirst::class; |
||||
} |
||||
|
||||
function make_dynamic_class_argument(): string |
||||
{ |
||||
echo "argument\n"; |
||||
return 'value'; |
||||
} |
||||
|
||||
function main(): void |
||||
{ |
||||
$class = DynamicClassFirst::class; |
||||
var_dump($class::render(replace_dynamic_class($class))); |
||||
var_dump($class::render('next')); |
||||
var_dump(choose_dynamic_class()::render(make_dynamic_class_argument())); |
||||
} |
||||
?> |
||||
--EXPECT-- |
||||
argument |
||||
string(11) "first:value" |
||||
string(11) "second:next" |
||||
class |
||||
argument |
||||
string(11) "first:value" |
||||
Loading…
Reference in new issue