fix(HandlesImports): _seen_flat_cls 移到父类循环外,菱形去重真正生效

b021c5b 的递归展平把 _seen_flat_cls 定义在 for _ParentClass 循环内,每个父类新建 seen → 菱形祖先(ClassGenBase)被每个继承它的 ClassGen* 父类各展平一次 → Generator class_members 707 字段(与 struct 114 不一致) → this_adjust sub_off 索引越界 → 继承方法不调整 → register_reexport 写 0x3f 崩溃。运行时诊断确认(707→114),register_reexport 调用生成正确 this_adjust(GEP +776)。已移除全部临时诊断。
This commit is contained in:
TermiNexus committed 2026-08-18 14:04:33 +08:00
1 parent b021c5b527
commit 858aba46d0
1 file changed
+4 -1
+4 -1
View File
@@ -1920,6 +1920,10 @@ class ImportHandle(BaseHandle):
# 同时处理父类 class_members 全为占位符的情况(清除后重新加载)。
_any_parent_loaded: bool = False
_all_inherited: list[tuple] = []
# 按继承源去重的跨父类共享 seen 集合(必须在 for 循环外,跨所有父类
# 共享——否则每个父类新建 seen,菱形祖先(如 ClassGenBase)被每个
# 继承它的 ClassGen* 父类各展平一次 → 重复(Generator 曾 707 字段)
_seen_flat_cls: set[str] = set()
for _ParentClass in _ParentClasses:
if not _ParentClass:
continue
@@ -1954,7 +1958,6 @@ class ImportHandle(BaseHandle):
# stub struct 布局不一致 → 并行 worker 里 this_adjust 算不出偏移 → 继承
# 方法 self 不调整 → 运行时错位崩溃(register_reexport 写 0x3f)。
# 递归每类只处理一次,每类只贡献非祖先字段。
_seen_flat_cls: set[str] = set()
def _FlattenExt(cls_name: str) -> None:
if cls_name in _seen_flat_cls:
return