TermiNexus
|
05f4adb233
|
fix(tpc): 符号表加载改两阶段,消除模块加载顺序依赖
a 类(编译器缺陷/机制漏豁免):签名解析要通过符号表查其它模块的类型名
(from X import * 的裸名如 posix 的 INT;跨模块类如 rawptr[Constant]),而加载器
按 os.listdir 字典序逐个「提取→解析→插入」⇒ posix 排在 stdint 之前时 INT 查不到。
旧口径静默降级 i32 掩盖了它,fail-fast 后暴露。
修法:加载拆两趟 —— ① StageModuleSymbols:提取 + 只解析/插入声明
(类/枚举/typedef/匿名类型)② CommitModuleSymbols:解析签名 + 插入函数/define +
命名空间重导出。批量加载器(Phase2Translator._build_shared_symbol_data)先收集全部
模块、跑完所有①再统一跑② ⇒ 任一模块的签名都能看到全部声明,与顺序无关。
单模块 LoadModuleSymbols 语义不变(①紧接②)。
验证(探针,posix 先 stage、stdint 后 stage 的“坏顺序”):
posix.open ret=i32 params=[i8*,i32](INT=stdint 的 typedef);read ret=i64 params=[i32,i8*,i64];
同样顺序走旧的单模块路径则 RAISE(对照组)。
|
2026-09-28 18:14:45 +08:00 |
|