自举实验失败,C1 编译 Test 成功,暂未达到自举收敛点

This commit is contained in:
2026-07-30 15:44:32 +08:00
parent 68481a5a7f
commit 32af3f93fa
22 changed files with 2158 additions and 442 deletions

View File

@@ -1700,15 +1700,14 @@ _generic_class_nodes: list[ast.ClassDef | t.CPtr] | t.CPtr = None
_generic_class_sha1s: list[str] | t.CPtr = None
def _is_generic_class(cd: ast.ClassDef | t.CPtr) -> int:
"""检查 ClassDef 是否有类型参数(泛型类),返回 1=是 / 0=否"""
if cd is None:
return 0
tp: list[str] | t.CPtr = cd.type_params
def _is_generic_class(tp: list[str] | t.CPtr) -> int:
"""检查 ClassDef 是否有类型参数(泛型类),返回 1=是 / 0=否
接收 type_params 而非 cd避免 cd.type_params 属性访问
因跨模块类型推断失败返回 None。
"""
if tp is None:
return 0
if tp.__len__() == 0:
return 0
return 1
@@ -1721,29 +1720,37 @@ def _register_generic_template(pool: memhub.MemBuddy | t.CPtr,
_generic_class_names = list[str](pool, 8)
_generic_class_nodes = list[ast.ClassDef | t.CPtr](pool, 8)
_generic_class_sha1s = list[str](pool, 8)
# 检查是否已注册
cn: t.CSizeT = _generic_class_names.__len__()
# 用局部变量接收 global list触发类型推断避免 global 变量 __len__ 失败)
names_local: list[str] | t.CPtr = _generic_class_names
cn: t.CSizeT = names_local.__len__()
i: t.CSizeT
for i in range(cn):
nm: str = _generic_class_names.get(i)
nm: str = names_local.get(i)
if nm is not None and string.strcmp(nm, cd.name) == 0:
return
_generic_class_names.append(cd.name)
_generic_class_nodes.append(cd)
_generic_class_sha1s.append(module_sha1)
# 诊断日志:确认泛型模板注册
fb_rg: t.CChar | t.CPtr = VLogger.fmt_buf()
if fb_rg is not None:
viperlib.snprintf(fb_rg, 1024, "注册泛型模板: %s (module=%s)", cd.name, module_sha1)
VLogger.info(fb_rg, "SPEC")
def _find_generic_template(class_name: str) -> ast.ClassDef | t.CPtr:
"""查找泛型类模板,返回 ClassDef 节点或 None"""
if _generic_class_names is None or class_name is None:
return None
cn: t.CSizeT = _generic_class_names.__len__()
# 用局部变量接收 global list触发类型推断避免 global 变量 __len__ 失败)
names_local: list[str] | t.CPtr = _generic_class_names
nodes_local: list[ast.ClassDef | t.CPtr] | t.CPtr = _generic_class_nodes
cn: t.CSizeT = names_local.__len__()
i: t.CSizeT
for i in range(cn):
nm: str = _generic_class_names.get(i)
nm: str = names_local.get(i)
if nm is not None and string.strcmp(nm, class_name) == 0:
# 用局部变量接收 list.get() 结果,触发旧编译器 inttoptr 类型转换
node: ast.ClassDef | t.CPtr = _generic_class_nodes.get(i)
node: ast.ClassDef | t.CPtr = nodes_local.get(i)
return node
return None
@@ -1752,13 +1759,15 @@ def _find_generic_template_sha1(class_name: str) -> str:
"""查找泛型类模板的来源模块 SHA1未找到返回 None"""
if _generic_class_names is None or class_name is None:
return None
cn: t.CSizeT = _generic_class_names.__len__()
# 用局部变量接收 global list触发类型推断
names_local: list[str] | t.CPtr = _generic_class_names
sha1s_local: list[str] | t.CPtr = _generic_class_sha1s
cn: t.CSizeT = names_local.__len__()
i: t.CSizeT
for i in range(cn):
nm: str = _generic_class_names.get(i)
nm: str = names_local.get(i)
if nm is not None and string.strcmp(nm, class_name) == 0:
# 用局部变量接收 list.get() 结果,触发旧编译器 inttoptr 类型转换
sha1_val: str = _generic_class_sha1s.get(i)
sha1_val: str = sha1s_local.get(i)
return sha1_val
return None
@@ -2191,7 +2200,9 @@ def translate_class_def(trans: HT.Translator | t.CPtr,
return _translate_renum_def(trans, cd)
# 泛型类:存储为模板,不发射 IR等实例化时特化
if _is_generic_class(cd) == 1:
# 用局部变量接收 cd.type_params触发类型推断
tp_val: list[str] | t.CPtr = cd.type_params
if _is_generic_class(tp_val) == 1:
_register_generic_template(pool, cd, trans.ModuleSha1)
return 0