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:
1 parent
75ea6fb9b2
commit
13080f646f
24 files changed
+118
-114
No files matched your search
@@ -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)
|
||||
|
||||
Reference in new issue
Block a user