fix(CallGenDispatch): __sizeof__ 认归一后的指针规范形 T*(尾随 * 一律按 8)
泛型实参归一为 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 之前)。
This commit is contained in:
1 parent
83baf5a4b6
commit
2b2b70e636
1 file changed
+9
@@ -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 根因)。
|
||||
|
||||
Reference in new issue
Block a user