TermiNexus
74ccd31c19
fix(tpc): 裸名解析处理同名冲突 + 声明阶段多轮,消除跨模块类型解析残余失败
承接上一条(两阶段加载)后仍有 11 个模块签名解析失败,两类根因:
① 同名冲突:平坦符号表(无前缀)一个名字只能留一个条目,不同模块可用不同类型
种类声明同名符号,且谁后插入谁占住裸名 —— stdint.vp:9 `INT: t.CTypedef = t.CInt`
与 argparse.vp:33 `define INT = 1`(sig: `INT: t.CDefine = 1`)撞名 ⇒ posix 的
`oflag: INT` 解析失败;llvmlite/__function.vp:77 `class Function` 与
ast/tokens.vp:95 枚举成员 `Function: t.State` 撞名 ⇒ 5 个模块的 `func: rawptr[Function]`
失败;ast/exprs.vp:18 `class Name` 同型(ast/parser.vp)。
修法:_resolve_name 在平坦条目不是 typedef/类/枚举时,跨 _namespaces 找回同名
typedef / 类 / 枚举(注解位置只可能是这三种)。
② 声明阶段的顺序依赖:typedef 右侧可引用其它模块的 typedef(win32base 的
`HANDLE: t.CTypedef = VOIDPTR`,VOIDPTR 在 stdint)⇒ 单轮仍与顺序有关。
修法:Phase2Translator 声明阶段多轮(未解析 typedef 的模块下一轮重 stage,
无进展即停,_CountUnresolvedTypedefs 判定),签名阶段仍是全部声明入表后统一跑。
③ 顺带修:两阶段是两个 TypeResolver 实例,签名阶段也须注入本模块类型名
(TypeResolver.inject_known_type_names 供两阶段共用)。
验证(TransPyV 全量 127 个 sig 模拟 ①→②):commit 失败数 11 → 0;
posix.open ret=i32 params=[i8*,i32]、read ret=i64 params=[i32,i8*,i64] 解析正确。
2026-09-28 18:25:57 +08:00
..
2026-09-14 13:42:14 +08:00
2026-09-28 18:25:57 +08:00
2026-09-28 13:57:04 +08:00
2026-09-28 18:25:57 +08:00
2026-09-26 19:27:22 +08:00
2026-09-26 19:27:22 +08:00
2026-09-12 11:51:42 +08:00
2026-09-28 13:49:28 +08:00
2026-09-26 19:27:22 +08:00
2026-08-17 09:36:38 +08:00
2026-08-17 09:36:38 +08:00