From 401429ccdf1f277ab6f91c2b936b1ab64ed77521 Mon Sep 17 00:00:00 2001 From: TermiNexus Date: Mon, 17 Aug 2026 21:44:40 +0800 Subject: [PATCH] =?UTF-8?q?fix(generic):=20=E7=89=B9=E5=8C=96=20T=20?= =?UTF-8?q?=E6=9B=BF=E6=8D=A2=E5=88=A4=E6=8D=AE=E4=BF=AE=E6=AD=A3=E2=80=94?= =?UTF-8?q?=E2=80=94t=20=E6=A8=A1=E5=9D=97=E5=86=85=E5=BB=BA=E7=B1=BB?= =?UTF-8?q?=E5=9E=8B=EF=BC=88=E8=A3=B8=E5=90=8D=E6=88=96=20t.=20=E5=89=8D?= =?UTF-8?q?=E7=BC=80=EF=BC=89=E4=BB=8D=E7=94=A8=20type=5Fname?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 上一提交对类类型参数改用 mangled type_arg 替换 T,但 type_name 为 't.CInt'(带 t. 前缀、不在 _BUILTIN_TYPE_NAMES 裸名集合)时被误判为 类类型,改用 type_arg='i32' 替换 → list[t.CInt] 特化方法体出现 'i32.__sizeof__'(源码无此名)→ [FATAL][__sizeof__] 类型 'i32' 无法 解析 + self 类型错乱(list[i32] 中找不到 CifEvalOk,StmtGenCifMixin 编译崩溃)。判据改为取裸名(去掉 t. 前缀)判断内建,内建仍用 type_name, 只有真正的类类型参数(AST/ast.AST 等)才用 mangled type_arg。 --- lib/core/Handles/HandlesClassDef.py | 20 +++++++++++++------- 1 file changed, 13 insertions(+), 7 deletions(-) diff --git a/lib/core/Handles/HandlesClassDef.py b/lib/core/Handles/HandlesClassDef.py index c4ac825..5bb66a7 100644 --- a/lib/core/Handles/HandlesClassDef.py +++ b/lib/core/Handles/HandlesClassDef.py @@ -129,13 +129,19 @@ class ClassHandle(BaseHandle): for i, tp_name in enumerate(type_param_names): if type_names and i < len(type_names): tn: str = type_names[i] - # 类类型参数(非内建)用 mangled type_arg 替换 T(带 sha1 前缀 + - # ptr 后缀,如 'f467978339422f32.ASTptr'),避免模板内部嵌套注解 - # (如 list[T].__iter__ 返回 list[T])被替换成裸短名('AST')后 - # 重新特化出只有 declare、无方法体的错误特化(list[AST].__len__ - # undefined symbol 根因)。_make_replacement_node 会把它还原为 - # 'sha1.AST | t.CPtr',重新解析时拼回一致的 mangled 名。 - if tn not in _BUILTIN_TYPE_NAMES and i < len(type_args): + # 判断是否为 t 模块内建类型(裸名或 't.' 前缀,如 'CInt'/'t.CInt'): + # 内建类型必须用源码名(type_name)替换 T(t.CInt → i32),否则 + # 用 mangled type_arg(如 'i32')替换会产生 'i32.__sizeof__' 这类 + # 源码中不存在的名称([FATAL][__sizeof__] 类型 'i32' 无法解析)。 + # 真正的类类型参数(如 'AST'/'ast.AST')才用 mangled type_arg + # (带 sha1 前缀 + ptr 后缀),避免模板内部嵌套注解被替换成裸短名 + # 后重新特化出只有 declare、无方法体的错误特化(list[AST].__len__ + # undefined symbol 根因)。_make_replacement_node 会把 mangled 名 + # 还原为 'sha1.AST | t.CPtr',重新解析时拼回一致的 mangled 名。 + tn_bare: str = tn.split('.')[-1] if '.' in tn else tn + if tn_bare in _BUILTIN_TYPE_NAMES: + type_map[tp_name] = tn + elif i < len(type_args): type_map[tp_name] = type_args[i] else: type_map[tp_name] = tn