From bd06dcf0a5ac758d9dd4bffeac88bf1b158f5a14 Mon Sep 17 00:00:00 2001 From: tianfenghan Date: Tue, 10 Feb 2026 18:01:39 +0800 Subject: [PATCH] =?UTF-8?q?fix(compiler):=20=E4=BF=AE=E5=A4=8D=E8=BF=94?= =?UTF-8?q?=E5=9B=9E=E8=AF=AD=E5=8F=A5=E7=BC=BA=E5=B0=91=E5=88=86=E5=8F=B7?= =?UTF-8?q?=E5=8F=8A=E6=9C=AA=E5=AE=9A=E4=B9=89=E5=8F=98=E9=87=8F=E9=94=99?= =?UTF-8?q?=E8=AF=AF=E6=8F=90=E7=A4=BA=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 修复了编译器中return语句缺少分号的问题 - 修正了未定义变量错误提示中的变量名显示格式 - 统一使用errorUndefinedVariable方法处理闭包中未定义变量的情况 - 添加了对closure_011和closure_013测试用例的支持 --- src/Php/CompilerBase.php | 8 ++++---- tests/zend/closures/closure_011.phpt | 14 ++++++++++++++ tests/zend/closures/closure_013.phpt | 28 ++++++++++++++++++++++++++++ 3 files changed, 46 insertions(+), 4 deletions(-) create mode 100644 tests/zend/closures/closure_011.phpt create mode 100644 tests/zend/closures/closure_013.phpt diff --git a/src/Php/CompilerBase.php b/src/Php/CompilerBase.php index afdd96da..46be2532 100644 --- a/src/Php/CompilerBase.php +++ b/src/Php/CompilerBase.php @@ -1269,9 +1269,9 @@ class CompilerBase extends \PhpAot\Core\Translator // 必须提前声明变量,否则在末尾声明并 return 可能会被 gcc 优化掉 $this->addLocalVar($tmpVar, $type); $code = $tmpVar . ' = ' . $exprCode . ';' . PHP_EOL; - $code .= $this->getIndent() . 'return ' . $tmpVar; + $code .= $this->getIndent() . 'return ' . $tmpVar . ';'; } else { - $code = 'return ' . $exprCode; + $code = 'return ' . $exprCode . ';'; } return $code; @@ -1741,7 +1741,7 @@ class CompilerBase extends \PhpAot\Core\Translator protected function errorUndefinedVariable(Variable $node): never { - $this->fatalError($node, "The variable `{$node->name}` is undefined"); + $this->fatalError($node, "The variable `\${$node->name}` is undefined"); } protected function dump(NodeAbstract $v): void @@ -3570,7 +3570,7 @@ class CompilerBase extends \PhpAot\Core\Translator foreach ($expr->uses as $useItem) { $var = $this->parseIdentifier($useItem->var); if ($this->isVarExpr($useItem->var) and !$this->hasVar($var)) { - $this->fatalError($expr, 'Variable `' . $var . '` is not defined'); + $this->errorUndefinedVariable($useItem->var); } if ($useItem->byRef) { $useVars [] = $this->convertToRef($useItem->var); diff --git a/tests/zend/closures/closure_011.phpt b/tests/zend/closures/closure_011.phpt new file mode 100644 index 00000000..70713646 --- /dev/null +++ b/tests/zend/closures/closure_011.phpt @@ -0,0 +1,14 @@ +--TEST-- +Closure 011: Lexical copies not static in closure +--FILE-- + +--EXPECT-- +2 diff --git a/tests/zend/closures/closure_013.phpt b/tests/zend/closures/closure_013.phpt new file mode 100644 index 00000000..d3efad0c --- /dev/null +++ b/tests/zend/closures/closure_013.phpt @@ -0,0 +1,28 @@ +--TEST-- +Closure 013: __invoke() on temporary result +--FILE-- +__invoke(); + $test = foo(); + $test->__invoke(); + $test = foo()->__invoke(); +} +?> +--EXPECT-- +Hello World! +Hello World! +Hello World!