fix(gentype): t.CPtr.__sizeof__() 返回 8 修复 list[CPtr] elem_size=0

CPtr 无显式 Size(t.py class CPtr 未设 Size)→ GetClassByName 路径
size_bits=0 → t.CPtr.__sizeof__() 返回 0 → list[t.CPtr](_mbuddy) 单参
构造时 elem_size=0(T.__sizeof__() 分支)→ append 崩溃(ASAN: 读 0xf8
零页,pool.alloc 处)。GetClassByName 路径补 POINTER 判断:HasPosition
(POINTER) 且 size_bytes==0 → 8(指针大小,与 str/bytes 一致)。
This commit is contained in:
TermiNexus committed 2026-08-19 22:49:37 +08:00
1 parent 2f0d52e736
commit 6ff76f3cb6
1 file changed
+7
+7
View File
@@ -3654,6 +3654,13 @@ class ExprCallHandle(BaseHandle):
ctype_inst = ctype_cls()
size_bits = getattr(ctype_inst, 'Size', 0) or 0
size_bytes = size_bits // 8
# POINTER 类型(CPtr 等)Size 为 None/0 → 指针大小 8。
# 根因:t.CPtr.__sizeof__() 返回 0 → list[t.CPtr]
# elem_size=0 → append 全写同槽/alloc(0) → 崩溃。
if getattr(ctype_inst, 'HasPosition', None) \
and ctype_inst.HasPosition(CType.POINTER) \
and size_bytes == 0:
size_bytes = 8
return ir.Constant(ir.IntType(64), size_bytes)
except Exception as _e:
if _config_mode == "strict":