TermiNexus
716cd61a75
fix(tpc): 属性取值失败的报文补"基址诊断" + 补掉声明加载去重签名的真实缺口
类别:a(编译器缺陷)—— 两者都是"缺事实/漏输入",不是放宽判定。
【一】`_RaiseUnresolvedExpr` 增打基址事实(HandlesBase)
现场:TransPyV/App/lib/core/Gen/MatchGenMixin.vp:231
`val: ast.AST* = expr_node.value`(base 是 `expr_node: rawptr[ast.Expr]`)
→ Attribute 取值返回 None → 本报文 + sys.exit(1)。
属性读回 None 的根因只有两类:① 类名登记退化(var_struct_class 存 'rawptr' /
'rawptr[X]' / 折叠态,或压根没登记);② 登记名与 Gen.structs / class_members 的键
不同源(短名 vs sha1 全名)。原报文只有"目标变量 + 注解 + 源码",不含任何一项事实
⇒ 只能从"求值为空"反推。现追加一行(仅 Attribute + Name 基址时,其余形态逐字不变):
基址诊断: 'expr_node' 的 var_struct_class=<...>;alloca 类型=<...>;
该名在 Gen.structs=<是/否>;class_members=<N 个字段/无该键>
与 `_DescribeMemberSlot` 同口径:列数据、不猜。
【二】`_ClassMembersReloadSignature` 的"类数"改为"逐类 (键, 表长) 元组"(HandlesImports)
上一轮 3399b44c 的签名里全局进度只记 `len(class_members)`(键数)。缺口:**某已有类的
成员表继续增长时键数不变**(典型=父类成员后到),而父类成员正是继承前缀的唯一来源
⇒ 极端时序下会漏掉一次必要重跑。改为逐类 (键, 长度) 元组,并补记
`len(class_parents)` / `len(class_parent)`(父链登记本身也是输入)。
代价 O(类数)(约 300 项/次调用),仍远低于一次重跑的成本。
验证:GetDiagnostics 干净;py 层 import + 既有 16 例类型判定 smoke test 全过。
未跑编译器(无 includes 改动,无需重编)。
2026-09-29 16:50:51 +08:00
..
2026-09-14 13:42:14 +08:00
2026-09-29 16:50:51 +08:00
2026-09-28 13:57:04 +08:00
2026-09-29 16:26:44 +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