fix: 恢复 _TopoSortFiles 被污染的循环,修复 vtable 'AST.accept' 找不到

上一提交(2ef6a55)编辑串位:把 1a-pre import 扫描的 scan_mark_a/
entry_addr_a 错误注入到 _TopoSortFiles 的 sha1 收集循环,循环内引用
未定义的 entry(恒为 null)→ 全部 continue → file_count=0 → 拓扑排序
结果为空 → 1b 回退字母序 → astaux.vp(ExceptHandler(AST))先于
base.vp(定义 AST.accept)翻译 → accept 未注册全局函数 → vtable
生成 'AST.accept' 找不到函数实现(InternalCompilerError)。

恢复 _TopoSortFiles 原始 entry_addr/entry 逻辑(拓扑排序恢复后
base.vp 先翻译,accept 注册,vtable 引用解析正常)。1a-pre 循环的
scan_mark_a/reset 保持不变。
This commit is contained in:
TermiNexus committed 2026-08-14 17:42:42 +08:00
1 parent 2ef6a55ead
commit f7c2fe4534
1 file changed
+2 -6
+2 -6
View File
@@ -588,12 +588,8 @@ def _TopoSortFiles(mb: memhub.MemBuddy | t.CPtr,
file_count: int = 0
# sha1→file_index 映射(简单线性查找,文件数不多)
for i in range(result.Count):
# 文件级 mark:import 依赖收集完(deps 写盘 + PopulateIncludesDeps
# 内部 stdlib 深拷贝)后立即回收本文件 AST——98 includes 全量 parse
# 的 AST 若驻留到 mark1 → 1GB 主池耗尽 OOM 根因之一
scan_mark_a: t.CSizeT = mb.mark()
entry_addr_a: t.CUInt64T = t.CUInt64T(result.Entries) + i * entry_size
entry_a: IncludesScanner.FileEntry | t.CPtr = (IncludesScanner.FileEntry | t.CPtr)(t.CVoid(entry_addr_a, t.CPtr))
entry_addr: t.CUInt64T = t.CUInt64T(result.Entries) + i * entry_size
entry: IncludesScanner.FileEntry | t.CPtr = (IncludesScanner.FileEntry | t.CPtr)(t.CVoid(entry_addr, t.CPtr))
if entry is None or entry.Sha1 is None:
continue