From 3b5f2af838d39dfb354b9d1360fa5e0bf1f47fdb Mon Sep 17 00:00:00 2001 From: TermiNexus Date: Mon, 17 Aug 2026 20:55:47 +0800 Subject: [PATCH] =?UTF-8?q?fix(structgen):=20=E8=B7=A8=E6=A8=A1=E5=9D=97?= =?UTF-8?q?=20struct=20=E5=85=9C=E5=BA=95=E5=91=BD=E5=90=8D=E6=94=B9?= =?UTF-8?q?=E6=9F=A5=20=5Fstruct=5Fsha1=5Fmap=EF=BC=8C=E4=BF=AE=E5=A4=8D?= =?UTF-8?q?=207cadfe07e983fd90.Translator=20=E5=89=8D=E7=BC=80=E9=94=99?= =?UTF-8?q?=E4=BD=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 泛型特化 _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 命名是设计意图)。 --- lib/core/LLVMCG/StructGen.py | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/lib/core/LLVMCG/StructGen.py b/lib/core/LLVMCG/StructGen.py index 9de4ac4..cb5cb40 100644 --- a/lib/core/LLVMCG/StructGen.py +++ b/lib/core/LLVMCG/StructGen.py @@ -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: