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:
1 parent
2f0d52e736
commit
6ff76f3cb6
1 file changed
+7
@@ -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":
|
||||
|
||||
Reference in new issue
Block a user