fix(call): super() void 命中用 hit_box 区分未命中 + CTypedef 预注册修复 mode_t NameError
- CallGenDispatch/CallGenMixin/ExprCallHandle: super() 命中 void 方法返回 None 属预期,用 hit_box 命中标志区分未命中,避免误走裸名调用报 'super 未定义' - HandlesAnnAssign.Handle + TranslatorGenMixin.handle_module_level_var: CTypedef 按需注册(翻译期表已被 clear_ctypedefs 清空),修复 posix.vp S_ISREG(mode: mode_t) 参数解析 NameError
This commit is contained in:
1 parent
65838da0dc
commit
55d4c4102a
5 files changed
+55
-10
No files matched your search
@@ -52,8 +52,16 @@ class CallGenDispatch(CallGenBase.CallGenBase):
|
||||
trans: HT.Translator | t.CPtr,
|
||||
func_name: str,
|
||||
cargs: list[ast.AST | t.CPtr] | t.CPtr,
|
||||
can: t.CSizeT) -> llvmlite.Value | t.CPtr:
|
||||
"""super()/ctraits 编译期检测(未命中返回 None)"""
|
||||
can: t.CSizeT,
|
||||
hit_box: t.CPtr = None) -> llvmlite.Value | t.CPtr:
|
||||
"""super()/ctraits 编译期检测(未命中返回 None)
|
||||
|
||||
hit_box: 命中标志字节([0]=1 表示被本 helper 拦截处理)。
|
||||
super().method() 命中后 _translate_super_call 对 void 方法(如
|
||||
__init__)经 build_call 返回 None 属预期(void call 无 SSA 值),
|
||||
必须用 hit_box 与"未命中"区分,否则 translate_call 会误判继续
|
||||
主路径 → 把内层 Call(super) 当裸名调用报"super 未定义"。
|
||||
"""
|
||||
# super() 语义(2026-08-10):super().method(args) → 静态调用父类方法
|
||||
# 形态: Call(func=Attribute(value=Call(func=Name('super')), attr=method))
|
||||
# 必须在 Attribute 分派前拦截——否则 value 的 Call(super) 被 translate_value
|
||||
@@ -65,6 +73,8 @@ class CallGenDispatch(CallGenBase.CallGenBase):
|
||||
if sup_cl.func is not None and sup_cl.func.kind() == ast.ASTKind.Name:
|
||||
sup_nm: ast.Name | t.CPtr = (ast.Name | t.CPtr)(sup_cl.func)
|
||||
if sup_nm.id is not None and string.strcmp(sup_nm.id, "super") == 0:
|
||||
if hit_box is not None:
|
||||
hit_box[0] = 1
|
||||
return ExprCallHandle._translate_super_call(
|
||||
pool, builder, mod, cl, func_name, trans)
|
||||
|
||||
|
||||
@@ -97,10 +97,24 @@ class CallGenMixin(CallGenBase.CallGenBase):
|
||||
if cargs is not None:
|
||||
can = len(cargs)
|
||||
|
||||
# super()/ctraits 检测:void 方法(如 __init__)命中后 build_call 返回
|
||||
# None 属预期(void call 无 SSA 值),必须用 hit_box 区分"命中已处理"
|
||||
# 与"未命中",否则 None 被误判继续主路径 → 内层 Call(super) 当裸名
|
||||
# 调用报"super 未定义且未导入"(SuperTest 根因)。
|
||||
h1_hit: t.CPtr = stdlib.malloc(4)
|
||||
if h1_hit is not None:
|
||||
h1_hit[0] = 0
|
||||
_tc_h1_super_ctraits_res: llvmlite.Value | t.CPtr = ExprCallHandle._tc_h1_super_ctraits(
|
||||
pool, builder, mod, cl, funcs_ptr, func_count, trans, func_name, cargs, can)
|
||||
pool, builder, mod, cl, funcs_ptr, func_count, trans, func_name, cargs, can, h1_hit)
|
||||
h1_hit_val: int = 0
|
||||
if h1_hit is not None:
|
||||
h1_hit_val = h1_hit[0]
|
||||
stdlib.free(h1_hit)
|
||||
if _tc_h1_super_ctraits_res is not None:
|
||||
return _tc_h1_super_ctraits_res
|
||||
if h1_hit_val != 0:
|
||||
# 命中 super()/ctraits 但无返回值(void 方法/宏调用):视为已处理
|
||||
return None
|
||||
|
||||
# ---- func_name is None:泛型实例化 + 类型转换 ----
|
||||
if func_name is None:
|
||||
|
||||
@@ -391,12 +391,19 @@ class TranslatorGenMixin:
|
||||
HandlesAnnAssign._register_cdefine_from_value(
|
||||
pool, nm_cd.id, aa_cd.value)
|
||||
return 0
|
||||
# CTypedef 注解(如 stdint.vp float64_t: t.CTypedef = t.CFloat64T):
|
||||
# 类型别名已由 ScanCTypedefDeclarations 注册到 CTypedef 表,
|
||||
# 不创建全局变量——否则每个包含 stdint 的模块生成
|
||||
# @float64_t 全局 → 链接 duplicate symbol warning
|
||||
# (跨 Mixin 经 HandlesAnnAssign 模块委托调用)
|
||||
# CTypedef 注解(如 posix.vp mode_t: t.CTypedef = t.CUInt32T):
|
||||
# 不创建全局变量——否则生成 @mode_t 符号 → 链接 duplicate
|
||||
# symbol warning。预注册阶段(forward_declare_functions
|
||||
# 之前)按需注册到 CTypedef 表:翻译期表已被 clear_ctypedefs
|
||||
# 清空(每文件隔离),若不在此时注册,S_ISREG(mode: mode_t)
|
||||
# 等函数参数注解在 FuncGenDef 正式翻译时查表失败 →
|
||||
# NameError: mode_t(AstTest/posix.vp 根因;模块级 AnnAssign
|
||||
# 经本函数分派,不经过 AnnAssignHandle.Handle 的注册分支)。
|
||||
if HandlesAnnAssign.is_ctypedef_annotation(aa_cd.annotation) != 0:
|
||||
ctd_str: str = HandlesType._get_type_name_from_annotation(
|
||||
pool, aa_cd.value)
|
||||
if ctd_str is not None:
|
||||
HandlesType.register_ctypedef(pool, nm_cd.id, ctd_str)
|
||||
return 0
|
||||
|
||||
# _declare_only=1(struct注册模式)时只处理 CDefine,不创建全局变量
|
||||
|
||||
@@ -147,12 +147,13 @@ def _tc_h1_super_ctraits(pool: memhub.MemBuddy | t.CPtr,
|
||||
trans: HT.Translator | t.CPtr,
|
||||
func_name: str,
|
||||
cargs: list[ast.AST | t.CPtr] | t.CPtr,
|
||||
can: t.CSizeT) -> llvmlite.Value | t.CPtr:
|
||||
can: t.CSizeT,
|
||||
hit_box: t.CPtr = None) -> llvmlite.Value | t.CPtr:
|
||||
"""super()/ctraits 编译期检测(委托到 gen._tc_h1_super_ctraits)"""
|
||||
import lib.core.Gen.Generator as Generator
|
||||
g: Generator.Generator | t.CPtr = (Generator.Generator | t.CPtr)(t.CVoid(HandlesExprCall._g_gen, t.CPtr))
|
||||
if g is not None:
|
||||
return g._tc_h1_super_ctraits(pool, builder, mod, cl, funcs_ptr, func_count, trans, func_name, cargs, can)
|
||||
return g._tc_h1_super_ctraits(pool, builder, mod, cl, funcs_ptr, func_count, trans, func_name, cargs, can, hit_box)
|
||||
return None
|
||||
def _tc_h2_c_special(pool: memhub.MemBuddy | t.CPtr,
|
||||
builder: llvmlite.IRBuilder | t.CPtr,
|
||||
|
||||
@@ -443,6 +443,19 @@ class AnnAssignHandle(HandlesBase.Mixin):
|
||||
_register_cdefine_from_value(pool_cd, nm.id, aa.value)
|
||||
return 0
|
||||
|
||||
# CTypedef 注解: 类型别名(mode_t: t.CTypedef = t.CUInt32T 等)。
|
||||
# 翻译期 CTypedef 表已被 clear_ctypedefs 清空(每文件隔离;表字符串
|
||||
# pool 分配,reset_to(mark1) 回收后悬空,不能跨文件累积),必须在此
|
||||
# 按需注册,否则 posix.vp S_ISREG(mode: mode_t) 等普通函数参数注解
|
||||
# 解析查表失败 → NameError: mode_t。仅登记类型表达式,不创建全局/
|
||||
# 局部存储——否则生成 @mode_t 符号,链接 duplicate symbol warning。
|
||||
if is_ctypedef_annotation(aa.annotation) != 0:
|
||||
pool_ct: memhub.MemBuddy | t.CPtr = self.Trans.Pool
|
||||
ctd_str: str = HandlesType._get_type_name_from_annotation(pool_ct, aa.value)
|
||||
if ctd_str is not None:
|
||||
HandlesType.register_ctypedef(pool_ct, nm.id, ctd_str)
|
||||
return 0
|
||||
|
||||
pool: memhub.MemBuddy | t.CPtr = self.Trans.Pool
|
||||
builder: llvmlite.IRBuilder | t.CPtr = self.Trans._cur_builder
|
||||
mod: llvmlite.LLVMModule | t.CPtr = self.Trans.Module
|
||||
|
||||
Reference in new issue
Block a user