diff --git a/lib/core/Handles/HandlesClassDef.py b/lib/core/Handles/HandlesClassDef.py index 8794dc3..342b73e 100644 --- a/lib/core/Handles/HandlesClassDef.py +++ b/lib/core/Handles/HandlesClassDef.py @@ -823,7 +823,24 @@ class ClassHandle(BaseHandle): continue _FlattenInherited(ParentClass, _seen_cls, _flat, Gen) if _flat: - Gen.class_members[ClassName] = Gen.class_members[ClassName] + _flat + # 【幂等(2026-09-30)】该祖先块已作为**连续整段**存在于本表时不再追加: + # 本处是**追加**(`class_members + _flat`),与导入侧的 + # `PrependInheritedBlock`(前置,自带表头判据)判据不对称,"块已在表中段/ + # 尾部"的情形谁都不判 ⇒ 整块再插一次,表里多出 len(_flat) 条重复条目, + # body 随之多出同名槽(现场:output/.stub.ll 的 TypeGenCType 73 槽 + # = temp 声明 41 槽 + 其 [9:41] 的原样副本;同族 7 个类, + # 下游即 Repl.vp:802 的"基座 pointee 未匹配任何 struct")。 + # 判据(名字 + IR 类型逐项连续匹配)与成因见 + # HandlesImports.InheritedBlockAlreadyPresent;只跳过重复、不改其余布局。 + from lib.core.Handles.HandlesImports import InheritedBlockAlreadyPresent as _BlkPresent + if _BlkPresent(list(Gen.class_members[ClassName]), _flat): + _vlog().warning( + f"[成员展平] 类 '{ClassName}' 的祖先块({len(_flat)} 项)已存在于成员表" + f"(表 {len(Gen.class_members[ClassName])} 项)⇒ 跳过重复追加" + f"(重复会让 body 多出同名槽、与 Phase 1 声明布局分叉)", + "成员展平") + else: + Gen.class_members[ClassName] = Gen.class_members[ClassName] + _flat # ============================================================ # 多继承方法合并:遍历所有父类(声明顺序)收集方法(短名去重,先声明父类优先), # vtable 槽/方法名用"实际定义类.方法"(如 B.get_b,与 TPV 一致),