refactor(compiler): 重构PHP编译器参数类型解析逻辑

- 移除未使用的 $varTypes 属性
- 将 parseType 方法重命名为 parseParameterType 并添加参数支持
- 修复 void 类型作为参数类型的错误处理
- 更新模块注册方式从临时模块到持久模块
- 添加目标名称中特殊字符的替换处理
- 为参数类型解析添加更准确的对象类型映射
pull/1/head
韩天峰 7 months ago
parent 11828d3b5a
commit f38098523f
  1. 11
      src/Php/CompilerBase.php
  2. 1
      src/Php/Translator.php
  3. 2
      src/cpp/main.cc
  4. 23
      tests/aot/class_args.phpt

@ -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;
}
}

@ -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);

@ -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);
}

@ -0,0 +1,23 @@
--TEST--
any
--FILE--
<?php
class TestX {
public function run() {
var_dump(__CLASS__);
var_dump(__METHOD__);
}
}
function test(TestX $o) {
$o->run();
}
function main()
{
$obj = new TestX();
test($obj);
}
?>
--EXPECT--
string(5) "TestX"
string(10) "TestX::run"
Loading…
Cancel
Save