From f38098523fc13f4919f5b9b308feb74170f254c7 Mon Sep 17 00:00:00 2001 From: tianfenghan Date: Mon, 26 Jan 2026 18:58:50 +0800 Subject: [PATCH] =?UTF-8?q?refactor(compiler):=20=E9=87=8D=E6=9E=84PHP?= =?UTF-8?q?=E7=BC=96=E8=AF=91=E5=99=A8=E5=8F=82=E6=95=B0=E7=B1=BB=E5=9E=8B?= =?UTF-8?q?=E8=A7=A3=E6=9E=90=E9=80=BB=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 移除未使用的 $varTypes 属性 - 将 parseType 方法重命名为 parseParameterType 并添加参数支持 - 修复 void 类型作为参数类型的错误处理 - 更新模块注册方式从临时模块到持久模块 - 添加目标名称中特殊字符的替换处理 - 为参数类型解析添加更准确的对象类型映射 --- src/Php/CompilerBase.php | 11 +++++++---- src/Php/Translator.php | 1 + src/cpp/main.cc | 2 +- tests/aot/class_args.phpt | 23 +++++++++++++++++++++++ 4 files changed, 32 insertions(+), 5 deletions(-) create mode 100644 tests/aot/class_args.phpt diff --git a/src/Php/CompilerBase.php b/src/Php/CompilerBase.php index 2e8b6334..37ed2777 100644 --- a/src/Php/CompilerBase.php +++ b/src/Php/CompilerBase.php @@ -145,7 +145,6 @@ class CompilerBase extends \PhpAot\Core\Translator */ protected array $objects = []; protected array $localVars = []; - protected array $varTypes = []; protected array $objectWrappers = []; protected bool $strictTypes = false; @@ -420,8 +419,8 @@ class CompilerBase extends \PhpAot\Core\Translator if ($this->stubFile and !$param->type) { throw new RuntimeException('No type for ' . $this->parseIdentifier($param->var)); } - $type = $this->parseType($param->type); $name = $this->parseIdentifier($param->var); + $type = $this->parseParameterType($param, $name); $list[] = $type . ' ' . $name; $argInfo = new ArgInfo(); $argInfo->name = $name; @@ -1138,8 +1137,9 @@ class CompilerBase extends \PhpAot\Core\Translator '}'; } - protected function parseType($type): string + protected function parseParameterType(Node\Param $param, string $var): string { + $type = $param->type; if ($type == null) { return self::TYPE_VAR; } @@ -1158,8 +1158,11 @@ class CompilerBase extends \PhpAot\Core\Translator return self::TYPE_BOOL; case 'string': return self::TYPE_STR; + case 'void': + $this->fatalError($param, 'Cannot use `void` as a parameter type.'); + break; default: - $this->varTypes[$name] = $name; + $this->objects[$var] = $name; return self::TYPE_OBJECT; } } diff --git a/src/Php/Translator.php b/src/Php/Translator.php index 630ae539..dad53cf8 100644 --- a/src/Php/Translator.php +++ b/src/Php/Translator.php @@ -191,6 +191,7 @@ class Translator extends Preprocessor if ($this->climate->arguments->defined('output')) { $name = $this->climate->arguments->get('output'); } + $name = str_replace(['-', '*'], '_', $name); if (!preg_match('/^[a-zA-Z0-9_]+$/', $name)) { $this->climate->red('The target name must be a valid identifier'); exit(1); diff --git a/src/cpp/main.cc b/src/cpp/main.cc index c990b9e7..9c07aa3c 100644 --- a/src/cpp/main.cc +++ b/src/cpp/main.cc @@ -20,7 +20,7 @@ int main(int cpp_argc, char **cpp_argv) { zend_throw_exception_hook = throw_exception; zend_module_entry *module = php_embed_get_module(); - if (zend_register_module_ex(module, MODULE_TEMPORARY) == NULL) { + if (zend_register_module_ex(module, MODULE_PERSISTENT) == NULL) { zend_error(E_ERROR, "Failed to register module [%s]", module->name); } diff --git a/tests/aot/class_args.phpt b/tests/aot/class_args.phpt new file mode 100644 index 00000000..268145a2 --- /dev/null +++ b/tests/aot/class_args.phpt @@ -0,0 +1,23 @@ +--TEST-- +any +--FILE-- +run(); +} +function main() +{ + $obj = new TestX(); + test($obj); +} +?> +--EXPECT-- +string(5) "TestX" +string(10) "TestX::run" +