From 41ed7176e97d7f78d49b245b47718c1385423d09 Mon Sep 17 00:00:00 2001 From: TermiNexus Date: Mon, 7 Sep 2026 15:31:18 +0800 Subject: [PATCH] =?UTF-8?q?fix(codegen):=20=5F=5Fsizeof=5F=5F=20=E7=BC=BA?= =?UTF-8?q?=20rowptr[X]=20=E6=8C=87=E9=92=88=E5=B0=BA=E5=AF=B8=E5=88=86?= =?UTF-8?q?=E6=94=AF=EF=BC=8C=E6=B3=9B=E5=9E=8B=E7=89=B9=E5=8C=96=20T.=5F?= =?UTF-8?q?=5Fsizeof=5F=5F()=20=E6=8A=A5=E6=9C=AA=E5=AE=9A=E4=B9=89?= =?UTF-8?q?=E5=90=8D=E7=A7=B0=20'T'?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit list[rowptr[AST]] 特化翻译 list.__init__ 的 T.__sizeof__() 时,T 解析为新一代指针包装 rowptr[AST],尺寸表全部 miss 后落回把接收者 Name(T) 当实例翻译 → NameError: 未定义名称 'T'(SlotsBugTest ast 包 rowptr[list[rowptr[AST]]] 泛型特化根因)。在旧语法联合 X|t.CPtr → 8 分支旁补 rowptr[ 前缀 → 8(指针大小),与联合类型口径对齐。 --- App/lib/core/Gen/Call/CallGenDispatch.vp | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/App/lib/core/Gen/Call/CallGenDispatch.vp b/App/lib/core/Gen/Call/CallGenDispatch.vp index cbaf9c2..bc06936 100644 --- a/App/lib/core/Gen/Call/CallGenDispatch.vp +++ b/App/lib/core/Gen/Call/CallGenDispatch.vp @@ -632,6 +632,12 @@ class CallGenDispatch(CallGenBase.CallGenBase): # 对应 TPC 中对 BinOp/BitOr 联合类型的特殊处理 if string.strstr(sz_cls_name, "|") is not None: return llvmlite.const_int64(pool, 8) + # 新一代指针包装 rowptr[X](等价旧语法 X | t.CPtr,指针大小 8): + # list[T].__init__ 的 T.__sizeof__() 特化 T→rowptr[AST] 时,若 + # 不识别会落回把接收者 Name(T) 当实例翻译 → NameError: 未定义名称 + # 'T'(SlotsBugTest ast 包 rowptr[list[rowptr[AST]]] 泛型特化根因)。 + if string.strncmp(sz_cls_name, "rowptr[", 7) == 0: + return llvmlite.const_int64(pool, 8) # [阶段3] 统一尺寸口径:库 typedef(BYTE/DWORD 等)先经正常 # 库分析解析(resolve_typedef_or_map → 位宽/8),miss 才走 # 下方硬编码尺寸表(t/c 核心原语)。