revert(transpyv): 回滚跨模块链表 Next 改访问器(改由编译器沿继承链解析字段名)

回滚 13080f6 的 110 处访问器调用,恢复裸字段访问 `x.Next`。

理由:该批访问器是把访问移到定义模块内执行,**绕开**了"继承字段名解析",
属于规避而非修复;缺陷本体在 TPC 侧(导入侧继承展平把泛型基类的继承字段
记成 __inherited_N 占位名,名字丢失)。TPC 已按语义修正:
  · e6451a07 继承展平沿继承链取真实字段名(泛型特化回退模板名),
    展平表直接落 `[("Next", <槽位类型>), ...]`,属性访问是普通表命中;
  · 3ca46c01 顺带修掉 _get_or_create_struct 里"同名枚举成员遮蔽类定义"的 i32 出口。
因此源码侧恢复为唯一写法(裸字段访问),由编译器负责解析。

注:本 commit 只回滚访问器;13080f6 里夹带的 CallGenProp.vp 续行合并(非访问器改动)
已在工作区保留(未提交)。
This commit is contained in:
TermiNexus committed 2026-09-28 21:48:53 +08:00
1 parent 13080f646f
commit aa52cf157d
24 files changed
+114 -118

No files matched your search

+5 -5
View File
@@ -152,7 +152,7 @@ novirtual class ExprGenOps(ExprGenBase.ExprGenBase):
# 之前错误写成 inc2.Next = inc1,导致 build_phi 从 inc1 遍历时
# inc1.Next 为 None,只输出一个 phi 条目,引发 LLVM 验证错误:
# "PHINode should have one entry for each predecessor"
llvmlite.phiincoming_set_next(inc1, inc2)
inc1.Next = inc2
return llvmlite.build_phi(builder, phi_ty, inc1, 2)
# ============================================================
# 翻译比较表达式 Compare(left, ops, comparators)
@@ -547,8 +547,8 @@ novirtual class ExprGenOps(ExprGenBase.ExprGenBase):
cn_self = llvmlite.build_bitcast(builder, rhs, cn_self_ty)
if cn_self is not None:
# 参数链表: self → key(独立 null 结尾)
llvmlite.value_set_next(cn_self, lhs)
llvmlite.value_set_next(lhs, None)
cn_self.Next = lhs
lhs.Next = None
cn_res: llvmlite.Value* = llvmlite.build_call(builder, cn_fn_name, cn_self, 2, cn_ret, 0)
if cn_res is not None:
# 归一化到 i1(__contains__ 返回 int/i32 等)
@@ -1022,7 +1022,7 @@ novirtual class ExprGenOps(ExprGenBase.ExprGenBase):
phi_head = inc
phi_tail = inc
else:
llvmlite.phiincoming_set_next(phi_tail, inc)
phi_tail.Next = inc
phi_tail = inc
# 定位到 next BB,求值下一个值
@@ -1051,7 +1051,7 @@ novirtual class ExprGenOps(ExprGenBase.ExprGenBase):
if phi_head is None:
phi_head = inc
else:
llvmlite.phiincoming_set_next(phi_tail, inc)
phi_tail.Next = inc
phi_count += 1
# 定位到 merge,创建 phi 合并所有入边