diff --git a/App/lib/core/Gen/CallGenDispatch.vp b/App/lib/core/Gen/CallGenDispatch.vp index 54e4f02..ec20086 100644 --- a/App/lib/core/Gen/CallGenDispatch.vp +++ b/App/lib/core/Gen/CallGenDispatch.vp @@ -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) diff --git a/App/lib/core/Gen/CallGenMixin.vp b/App/lib/core/Gen/CallGenMixin.vp index 57c68a1..0c5ea1f 100644 --- a/App/lib/core/Gen/CallGenMixin.vp +++ b/App/lib/core/Gen/CallGenMixin.vp @@ -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: diff --git a/App/lib/core/Gen/TranslatorGenMixin.vp b/App/lib/core/Gen/TranslatorGenMixin.vp index 776b621..4601b43 100644 --- a/App/lib/core/Gen/TranslatorGenMixin.vp +++ b/App/lib/core/Gen/TranslatorGenMixin.vp @@ -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,不创建全局变量 diff --git a/App/lib/core/Handles/ExprCallHandle.vp b/App/lib/core/Handles/ExprCallHandle.vp index b2e1967..3cde168 100644 --- a/App/lib/core/Handles/ExprCallHandle.vp +++ b/App/lib/core/Handles/ExprCallHandle.vp @@ -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, diff --git a/App/lib/core/Handles/HandlesAnnAssign.vp b/App/lib/core/Handles/HandlesAnnAssign.vp index e4d72de..83007a7 100644 --- a/App/lib/core/Handles/HandlesAnnAssign.vp +++ b/App/lib/core/Handles/HandlesAnnAssign.vp @@ -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