feat(php): 优化 strlen 函数的编译时折叠

- 修改 CompilerBase.php 中的条件判断逻辑,确保代码生成正确返回
- 在 FuncCallOptimizer.php 中为 strlen 函数添加常量字符串优化
- 当传入参数为字符串字面量时直接计算长度并生成常量值
- 添加编译时 strlen 常量折叠的测试用例验证功能
pull/1/head
韩天峰 3 months ago
parent abccfc2c8b
commit d377777571
  1. 2
      src/Php/CompilerBase.php
  2. 3
      src/Php/FuncCallOptimizer.php
  3. 18
      tests/aot/optimizations/strlen-const.phpt

@ -2755,7 +2755,7 @@ class CompilerBase extends \PhpAot\Core\Translator
// 动态调用的函数,转换函数名为带有命名空间的全限定名称
$name = $this->getNamespacedFuncName($name);
$code = $this->parseFuncCallWithOptimizer($name, $expr);
if ($code) {
if ($code !== false) {
return $code;
}
$placeHolder = $this->identifierToStr($expr->name);

@ -152,6 +152,9 @@ trait FuncCallOptimizer
}
}
if ($name === 'strlen') {
if ($expr->args[0]->value instanceof Node\Scalar\String_) {
return strlen($expr->args[0]->value->value) . $this->getPlatform()->getIntegerLiteralSuffix();
}
return 'php::fn::strlen(' . $getArg(0) . ')';
}
if ($name === 'ord') {

@ -0,0 +1,18 @@
--TEST--
strlen(constant_string) compile-time folding
--FILE--
<?php
function main(): void {
var_dump(strlen("hello"));
var_dump(strlen(""));
var_dump(strlen("hello world"));
var_dump(strlen("你好世界"));
var_dump(strlen("a" . "b"));
}
?>
--EXPECT--
int(5)
int(0)
int(11)
int(12)
int(2)
Loading…
Cancel
Save