feat(generator): 优化属性默认值代码生成逻辑

- 替换原有的 ZVAL_UNDEF 初始化方式为类型特定的默认值设置
- 添加 getTypeDefaultValueCode 方法处理各种数据类型的默认值
- 支持整型、浮点型、布尔型、字符串、数组等类型的默认值初始化
- 为测试用例添加对象整型属性优化功能
- 确保可空类型正确初始化为 NULL 值
pull/1/head
韩天峰 3 months ago
parent 46800d9dc9
commit 403991357e
  1. 29
      src/gen_stub.php
  2. 22
      tests/aot/optimizations/object-int-prop-02.phpt

@ -3257,7 +3257,8 @@ class PropertyInfo extends VariableLike
$zvalName = "property_{$propertyName}_default_value";
if ($this->defaultValue === null && $this->type !== null) {
$code .= "\tzval $zvalName;\n\tZVAL_UNDEF(&$zvalName);\n";
$code .= "\tzval $zvalName;\n";
$code .= $this->getTypeDefaultValueCode($zvalName);
} else {
$code .= $defaultValue->initializeZval($zvalName, varName: $this->name->__toString());
}
@ -3344,6 +3345,32 @@ class PropertyInfo extends VariableLike
$fieldsynopsisElement->appendChild($doc->createElement("modifier", "readonly"));
}
}
private function getTypeDefaultValueCode(string $zvalName): string
{
if ($this->type->isNullable()) {
return "\tZVAL_NULL(&$zvalName);\n";
}
$simpleType = $this->type->tryToSimpleType();
if ($simpleType !== null) {
if ($simpleType->isInt()) {
return "\tZVAL_LONG(&$zvalName, 0);\n";
}
if ($simpleType->isFloat()) {
return "\tZVAL_DOUBLE(&$zvalName, 0.0);\n";
}
if ($simpleType->isBool()) {
return "\tZVAL_FALSE(&$zvalName);\n";
}
if ($simpleType->isString()) {
return "\tZVAL_EMPTY_STRING(&$zvalName);\n";
}
if ($simpleType->isArray()) {
return "\tZVAL_EMPTY_ARRAY(&$zvalName);\n";
}
}
return "\tZVAL_NULL(&$zvalName);\n";
}
}
class EnumCaseInfo {

@ -0,0 +1,22 @@
--TEST--
SSA: int
--FILE--
<?php
use native_types;
class Foo {
public int $b;
function assign_add_prop($n) {
for ($i = 0; $i < $n; ++$i) {
$this->b += 2;
}
}
}
function main(): void {
$o = new Foo();
$o->assign_add_prop(100000);
var_dump($o->b);
}
?>
--EXPECT--
int(200000)
Loading…
Cancel
Save