From 2b2b70e6362de047f69086a88ef64689ddda092e Mon Sep 17 00:00:00 2001 From: TermiNexus Date: Wed, 30 Sep 2026 20:58:02 +0800 Subject: [PATCH] =?UTF-8?q?fix(CallGenDispatch):=20=5F=5Fsizeof=5F=5F=20?= =?UTF-8?q?=E8=AE=A4=E5=BD=92=E4=B8=80=E5=90=8E=E7=9A=84=E6=8C=87=E9=92=88?= =?UTF-8?q?=E8=A7=84=E8=8C=83=E5=BD=A2=20T*=EF=BC=88=E5=B0=BE=E9=9A=8F=20*?= =?UTF-8?q?=20=E4=B8=80=E5=BE=8B=E6=8C=89=208=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 泛型实参归一为 T* 后,T.__sizeof__() 的实参串如 {sha}.AST* 既不命中 | 也不命中 rawptr[ 前缀,落回把接收者 Name(T) 当实例翻译 → NameError: 未定义名称 T(现场 Test/AstTest/App/main.vp:21 特化 list[ast.AST|t.CPtr] → includes/_list.vp:36)。在既有两条指针判据旁补尾随 * 判据(同一处、同一顺序,均在 dot-strip 之前)。 --- App/lib/core/Gen/Call/CallGenDispatch.vp | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/App/lib/core/Gen/Call/CallGenDispatch.vp b/App/lib/core/Gen/Call/CallGenDispatch.vp index d4e9c57..03d6de6 100644 --- a/App/lib/core/Gen/Call/CallGenDispatch.vp +++ b/App/lib/core/Gen/Call/CallGenDispatch.vp @@ -608,6 +608,15 @@ novirtual class CallGenDispatch(CallGenBase.CallGenBase): return llvmlite.const_int64(pool, 8) if string.strncmp(sz_cls_name, "rawptr[", 7) == 0: return llvmlite.const_int64(pool, 8) + # 归一后的指针唯一规范形 `T*`(TypeGenResolve._norm_type_arg_name + # 的指针书写归一:rawptr[T] ≡ t.CPtr[T] ≡ T|t.CPtr ≡ T*) + # ⇒ 尾随 '*' 一律按指针大小 8。缺这条时 `T.__sizeof__()` + # 的实参串 `{sha}.AST*` 既不命中 '|' 也不命中 'rawptr[', + # 落回把接收者 Name(T) 当实例翻译 → NameError: 未定义名称 'T' + # (现场 Test/AstTest/App/main.vp:21 特化 list[ast.AST|t.CPtr] + # → includes/_list.vp:36 `self.__elem_size__ = T.__sizeof__()`)。 + if string.strrchr(sz_cls_name, '*') is not None: + return llvmlite.const_int64(pool, 8) # 保存完整名(含模块前缀)供模块归属精确匹配:去前缀后 # get_struct_type 裸名全局匹配会误命中跨模块同名类 # (w32.win32base.SECURITY_ATTRIBUTES 根因)。