diff --git a/App/lib/Stub/StubGen/VpiReader.vp b/App/lib/Stub/StubGen/VpiReader.vp index 740b3fe..f7d9553 100644 --- a/App/lib/Stub/StubGen/VpiReader.vp +++ b/App/lib/Stub/StubGen/VpiReader.vp @@ -2643,6 +2643,20 @@ def _inject_class_struct_declare(pool: memhub.MemBuddy*, # 该行为显式化,避免将来 REnum 带直接字段时被误注册为普通 struct。 if _vpi_class_is_renum(class_cd) != 0: return 0 + # 规则 5.5 的证据前置(**必须早于**下方字段注解解析): + # 本函数在**注入期**解析字段注解(GenApi.resolve_annotation_type → + # _norm_type_arg_name),此刻被注入的类尚未 register_struct,且注入期**没有 + # "类定义窗口"**(CurDefModuleSha1=None)⇒ 规则 5.5 的入口闸门 + # (`_def_sha1 is None and _def_mod is not None`)整条关闭、四条证据一条都查不到 + # ⇒ 注解里的裸类名实参取不到定义模块 SHA1(如 `children: list[rawptr[AST]]` + # 里的 AST)⇒ 特化名被冻结成**裸名版本**,与该类在自身翻译期(类已注册)解析出的 + # 带前缀形式分裂成两个特化名,最终以"非基本类型指针不可隐式转换"报出。现场: + # includes/ast/base.vp:359 `_append_child(self.children, node, self.pool)` + # 源 %"…list[rawptr[AST]]"* vs 目标 %"…list[rawptr<定义模块SHA1>.AST]"*。 + # mark_module_class 一次调用同时完成两件事: + # ① 登记"{src_sha1}.{cls_name}"(名字归属,与 struct 注册状态无关); + # ② 把 CurDefModuleSha1/CurDefClassName 指向本次注入的模块与类(规则 5.5 的闸门)。 + GenApi.mark_module_class(pool, src_sha1, cls_name) # 2. 收集字段类型(AnnAssign 子节点,仿 ClassGenDef.translate_class_def) field_names_buf: sizet* = pool.alloc(8 * GenTypes.FIELD_MAX) field_types_buf: sizet* = pool.alloc(8 * GenTypes.FIELD_MAX) diff --git a/App/lib/core/Gen/GenApi.vp b/App/lib/core/Gen/GenApi.vp index 1393a96..39aea0a 100644 --- a/App/lib/core/Gen/GenApi.vp +++ b/App/lib/core/Gen/GenApi.vp @@ -338,6 +338,16 @@ def find_struct_by_module(name: str, sha1: str) -> GenTypes.StructEntry*: return None +# ---------------- mark_module_class(委托 StructGenMixin.mark_module_class) ---------------- +def mark_module_class(pool: memhub.MemBuddy*, sha1: str, name: str) -> None: + """登记"{sha1}.{类名}"(= 该模块声明了这个类),并把 CurDefModuleSha1/CurDefClassName + 指向它。注入期(VpiReader)没有"类定义窗口",必须靠这一步让 + `_norm_type_arg_name` 规则 5.5 的证据链能被查询(否则裸类名实参取不到定义模块 + SHA1 ⇒ 特化名冻结成裸名版本,与该类自身翻译期的带前缀形式分裂)。""" + if _g_gen is not None: + _g_gen.StructGen.mark_module_class(pool, sha1, name) + + # ---------------- find_struct_by_type(委托 StructGenMixin.find_struct_by_type) ---------------- def find_struct_by_type(struct_ty: llvmlite.LLVMType*) -> GenTypes.StructEntry*: """委托到 gen.find_struct_by_type(原 Handles 壳)"""