fix(tpv): 拓宽方向统一为单一真源,并修 TypeStr 变参与 should_zext_widen 缺参
三项独立缺陷(均来自类型系统盘点 _Type.md D7): 1) should_zext_widen 签名缺 trans 形参,函数体内的 trans 退化为隐式全局(恒 None),而 translate_binop 两处调用早已在传第 5 实参(被静默丢弃)⇒ 注释所 述「源无符号 → zext」补救从未生效:Name/Subscript 形态的无符号源(uint16/ uint32 变量、数组元素)在比较/二元路径恒被 sext 扩展(ide.vp/timer.vp 根因)。 修:should_zext_widen 补 trans 形参并明确为拓宽方向的单一真源; translate_compare 两处补传 trans;ExprGenBase._zext_or_sext_val 改为委托 should_zext_widen(wide_val=None 使「宽侧常量」启发式自然失效)。 2) _translate_t_type_cast 原以「目标类型名符号性」决策整数拓宽,且 target_name 未知时默认 zext,与 coerce_to_type / should_zext_widen 的默认 sext 极性相反。 修:统一由源的符号性决定(与 coerce 同源),并删除已无使用点的 target_name 形参(1 处签名 + 7 处调用点)。 3) TypeStr 生成(FuncEntry.TypeStr 的唯一生产者)与其现算现用副本 (ClassGenVTable._format_func_type_str)都未打印变参后缀 ...,而 FuncGenDef 对 *args 会设 IsVarArg=1,且继承方法强制走 TypeStr 回退 ⇒ vtable 中的函数 指针类型与真实签名不符。修:按 llvmlite IR 打印规则补齐(有参 ", ...", 无参 "...")。
This commit is contained in:
1 parent
c71642dca0
commit
b8470c1cae
7 files changed
+56
-36
No files matched your search
@@ -105,6 +105,13 @@ class ClassGenVTable(ClassGenBase.ClassGenBase):
|
||||
self._vtable_strcat(buf, buf_size, param_buf)
|
||||
cur = llvmlite.param_get_next(cur)
|
||||
first = 0
|
||||
# 变参函数追加 ...(对齐 llvmlite IR 打印规则与 CallGenLeafKit._build_func_type_str:
|
||||
# 有参数时 ", ...",无参数时 "...")。此前遗漏 → 该回退文本生成的函数类型缺 ...。
|
||||
if func.IsVarArg == 1:
|
||||
if first != 0:
|
||||
self._vtable_strcat(buf, buf_size, "...")
|
||||
else:
|
||||
self._vtable_strcat(buf, buf_size, ", ...")
|
||||
self._vtable_strcat(buf, buf_size, ")")
|
||||
return 1
|
||||
# ============================================================
|
||||
|
||||
Reference in new issue
Block a user