fix(compiler): 修复返回语句缺少分号及未定义变量错误提示问题

- 修复了编译器中return语句缺少分号的问题
- 修正了未定义变量错误提示中的变量名显示格式
- 统一使用errorUndefinedVariable方法处理闭包中未定义变量的情况
- 添加了对closure_011和closure_013测试用例的支持
pull/1/head
韩天峰 7 months ago
parent 67427f342d
commit bd06dcf0a5
  1. 8
      src/Php/CompilerBase.php
  2. 14
      tests/zend/closures/closure_011.phpt
  3. 28
      tests/zend/closures/closure_013.phpt

@ -1269,9 +1269,9 @@ class CompilerBase extends \PhpAot\Core\Translator
// 必须提前声明变量,否则在末尾声明并 return 可能会被 gcc 优化掉 // 必须提前声明变量,否则在末尾声明并 return 可能会被 gcc 优化掉
$this->addLocalVar($tmpVar, $type); $this->addLocalVar($tmpVar, $type);
$code = $tmpVar . ' = ' . $exprCode . ';' . PHP_EOL; $code = $tmpVar . ' = ' . $exprCode . ';' . PHP_EOL;
$code .= $this->getIndent() . 'return ' . $tmpVar; $code .= $this->getIndent() . 'return ' . $tmpVar . ';';
} else { } else {
$code = 'return ' . $exprCode; $code = 'return ' . $exprCode . ';';
} }
return $code; return $code;
@ -1741,7 +1741,7 @@ class CompilerBase extends \PhpAot\Core\Translator
protected function errorUndefinedVariable(Variable $node): never 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 protected function dump(NodeAbstract $v): void
@ -3570,7 +3570,7 @@ class CompilerBase extends \PhpAot\Core\Translator
foreach ($expr->uses as $useItem) { foreach ($expr->uses as $useItem) {
$var = $this->parseIdentifier($useItem->var); $var = $this->parseIdentifier($useItem->var);
if ($this->isVarExpr($useItem->var) and !$this->hasVar($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) { if ($useItem->byRef) {
$useVars [] = $this->convertToRef($useItem->var); $useVars [] = $this->convertToRef($useItem->var);

@ -0,0 +1,14 @@
--TEST--
Closure 011: Lexical copies not static in closure
--FILE--
<?php
$i = 1;
$lambda = function () use ($i) {
return ++$i;
};
$lambda();
echo $lambda()."\n";
//early prototypes gave 3 here because $i was static in $lambda
?>
--EXPECT--
2

@ -0,0 +1,28 @@
--TEST--
Closure 013: __invoke() on temporary result
--FILE--
<?php
class Foo {
function __invoke() {
echo "Hello World!\n";
}
}
function foo() {
return function() {
echo "Hello World!\n";
};
}
function main() {
$test = new Foo;
$test->__invoke();
$test = foo();
$test->__invoke();
$test = foo()->__invoke();
}
?>
--EXPECT--
Hello World!
Hello World!
Hello World!
Loading…
Cancel
Save