feat(php): 支持 func_num_args 函数优化

- 从 UNSUPPORTED_FUNCTIONS 列表中移除 func_num_args
- 添加 func_num_args 函数的运行时测试用例
- 实现 func_num_args 函数调用优化逻辑
- 支持通过 argInfoList 计算函数参数数量
- 添加对可变参数函数的支持
pull/1/head
韩天峰 5 months ago
parent d919ee280c
commit 898cbe2553
  1. 1
      src/Php/Constants.php
  2. 12
      src/Php/FuncCallOptimizer.php
  3. 29
      tests/aot/functions/func_num_args.phpt

@ -59,7 +59,6 @@ class Constants
public const UNSUPPORTED_FUNCTIONS = [
'compact',
'extract',
'func_num_args',
'func_get_arg',
'func_get_args',
];

@ -56,6 +56,18 @@ trait FuncCallOptimizer
if ($name === 'array_key_exists') {
return $getArg(1) . '.offsetExists(' . $getArg(0) . ')';
}
if ($name === 'func_get_args') {
}
if ($name === 'func_num_args') {
$funcDef = $this->functionDef;
foreach ($funcDef->argInfoList as $i => $argInfo) {
if ($argInfo->variadic) {
return '(' . $argInfo->name . '.count() + ' . $i . ')';
}
}
return count($funcDef->argInfoList);
}
if ($name === 'function_exists') {
$funcName = $expr->args[0]->value;
if ($this->isScalarString($funcName)) {

@ -0,0 +1,29 @@
--TEST--
func_num_args
--FILE--
<?php
function foo1($a, $b, $c = 10)
{
var_dump(func_num_args());
}
function foo2(...$args) {
var_dump(func_num_args());
}
function foo3($a, $b, $c, ...$args) {
var_dump(func_num_args());
}
function main()
{
foo1(2.5, 3);
foo2(1, 3, 5, 8, 10);
foo3(1, 3, 5, 8, 10, 12);
}
?>
--EXPECT--
int(3)
int(5)
int(6)
Loading…
Cancel
Save