fix(structgen): 跨模块 struct 兜底命名改查 _struct_sha1_map,修复 7cadfe07e983fd90.Translator 前缀错位

泛型特化 _specialize_generic_class 把 Gen.module_sha1 切换到模板定义模块
(_list=7cadfe07e983fd90)的窗口内,_generate_structs Step 1 对不在
class_sha1_map 的类(因 LlvmGenerator 共享 class_methods 跨文件泄漏而
缺条目)用 _mangle_name 兜底,错误注册为 7cadfe07e983fd90.Translator 等
跨模块类型 → Translator.__before_init__ self 类型错前缀,与构造 result
(6ccfee1e5bd522ed.Translator*)不匹配,llvm 报 Type of #1 arg mismatch。
兜底改为优先查 _struct_sha1_map(Phase2 从 vpi 扫描构建的正确类→模块映射),
特化类自身仍走 _mangle_name(用模板 sha1 命名是设计意图)。
This commit is contained in:
TermiNexus committed 2026-08-17 20:55:47 +08:00
1 parent 7e710d1e9a
commit 3b5f2af838
1 file changed
+8
+8
View File
@@ -253,6 +253,14 @@ class StructGenMixin:
# 否则会创建缺少基类字段(如 GSListNode.Next)的本地类型定义,
# 导致字段索引错位 → 访问违规崩溃。
_imported_sha1: str = self.class_sha1_map.get(ClassName, '')
if not _imported_sha1:
# 兜底查全局类→模块映射:class_sha1_map 可能因共享 class_methods
# 跨文件泄漏而缺失条目(LlvmGenerator 共享赋值),此时若处于
# 泛型特化窗口(module_sha1 被切为模板定义模块如 _list 的 sha1),
# _mangle_name 会用错误前缀注册其它模块的类
# (7cadfe07e983fd90.Translator 跨模块类型错位根因)。
# _struct_sha1_map 由 Phase2 从 vpi 扫描构建,含全部类的正确模块映射。
_imported_sha1 = self._struct_sha1_map.get(ClassName, '')
if _imported_sha1:
mangled_name: str = f"{_imported_sha1}.{ClassName}"
else: