fix(transpyv): 跨模块链表 Next 字段改用访问器(消除 __inherited_N 占位名 fail-fast)

c 源码违规:llvmlite 的 Value/ParamNode/Function/Param/GlobalVariable/PhiIncoming/
SwitchCase 的 Next 继承自泛型基类 GSListNode[T],而其泛型特化体不在任何 .vpi 中
⇒ 导入侧 class_members 只有 __inherited_N 占位名;严格属性解析(回退已移除)下
裸写 `x.Next` fail-fast。现场:CallGenCall.vp `cur_fb = cur_fb.Next` 报
"[fast-fail] 属性 Next 在类 ParamNode 中找不到(class_members=[__inherited_0, Ty])"。

按仓库既有约定(_Type.md:链表遍历用 paramnode_get_next/paramnode_set_next;
VarGenMixin/TypeSpec/StructGenMixin/VpiReader 等已如此书写)统一改为访问器:
  value_get_next/value_set_next、paramnode_get_next/paramnode_set_next、
  function_get_next、param_get_next、globalvariable_get_next、
  phiincoming_set_next、switchcase_set_next
覆盖 24 个文件共 110 处(含 CallGenProp.vp:122 的嵌套读 cur_arg_pc.Next)。

访问器在 includes 侧为定义模块内直通实现(None 守卫 + x.Next),语义等价、零行为
变化。已全量扫描 core\Gen 全 47 文件与 Stub/Phase/core/main:App 侧已无裸继承字段
访问(剩余 .Next 命中全部在注释里)。
This commit is contained in:
TermiNexus committed 2026-09-28 21:20:58 +08:00
1 parent 75ea6fb9b2
commit 13080f646f
24 files changed
+118 -114

No files matched your search

+8 -8
View File
@@ -549,12 +549,12 @@ novirtual class CallGenMixin(CallGenBase.CallGenBase):
av_an: llvmlite.Value* = self.Gen.ExprGen.translate_value(builder, pool, mod, cl.args.get(j_an), None, 0, trans)
if av_an is None:
av_an = llvmlite.const_int32(pool, 0)
av_an.Next = None
llvmlite.value_set_next(av_an, None)
if arg_head_an is None:
arg_head_an = av_an
arg_tail_an = av_an
else:
arg_tail_an.Next = av_an
llvmlite.value_set_next(arg_tail_an, av_an)
arg_tail_an = av_an
arg_cnt_an = arg_cnt_an + 1
child_an: llvmlite.Value* = llvmlite.build_call(builder, create_an, arg_head_an, arg_cnt_an, ret_ptr_ty_an, 0)
@@ -1096,11 +1096,11 @@ novirtual class CallGenMixin(CallGenBase.CallGenBase):
arg_val = llvmlite.build_sext(builder, arg_val, i64_va)
elif af_va == 32:
arg_val = llvmlite.build_fpext(builder, arg_val, llvmlite.Double(pool))
arg_val.Next = None
llvmlite.value_set_next(arg_val, None)
if head is None:
head = arg_val
else:
tail.Next = arg_val
llvmlite.value_set_next(tail, arg_val)
tail = arg_val
# memcpy 专用: 保存前三个参数的独立引用
if ai == 0:
@@ -1208,11 +1208,11 @@ novirtual class CallGenMixin(CallGenBase.CallGenBase):
if df_default_node is not None:
df_arg_val = self.Gen.ExprGen.translate_value(builder, pool, mod, df_default_node, None, 0, trans)
if df_arg_val is not None:
df_arg_val.Next = None
llvmlite.value_set_next(df_arg_val, None)
if head is None:
head = df_arg_val
else:
tail.Next = df_arg_val
llvmlite.value_set_next(tail, df_arg_val)
tail = df_arg_val
# 追加的默认实参必须计入实参数:下方
# _coerce_args_to_def_params/_ensure_method_declare 等
@@ -1242,11 +1242,11 @@ novirtual class CallGenMixin(CallGenBase.CallGenBase):
zero_ty_z: llvmlite.LLVMType* = llvmlite.param_get_ty(fp_z)
zero_val_z: llvmlite.Value* = llvmlite.ConstZero(pool, zero_ty_z)
if zero_val_z is not None:
zero_val_z.Next = None
llvmlite.value_set_next(zero_val_z, None)
if head is None:
head = zero_val_z
else:
tail.Next = zero_val_z
llvmlite.value_set_next(tail, zero_val_z)
tail = zero_val_z
can += 1 # 零值兜底实参同样计入实参数(同默认实参)
fp_z = llvmlite.param_get_next(fp_z)