fix(compiler): __sizeof__ fast-fail 改为 Python traceback 风格
- __sizeof__ 处理器两个错误分支(已注册但大小 0 / 类型未注册)从 VLogger.critical(╠ 树形格式)改为 HandlesType.fatal_error(TypeError + File/line + 源码行 + 立即终止) - 修复: 原 CRITICAL 不退出,会继续走到 _fail_method_ret_ty 二次报错,掩盖根因
This commit is contained in:
1 parent
e0303c46f6
commit
51d0ef2c18
1 file changed
+10
-14
@@ -4958,20 +4958,16 @@ def translate_call(pool: memhub.MemBuddy | t.CPtr,
|
|||||||
sz_val: int = HandlesClassDef._get_type_size(sz_struct_ty)
|
sz_val: int = HandlesClassDef._get_type_size(sz_struct_ty)
|
||||||
if sz_val > 0:
|
if sz_val > 0:
|
||||||
return llvmlite.const_int64(pool, sz_val)
|
return llvmlite.const_int64(pool, sz_val)
|
||||||
# 类型已注册但大小为 0(opaque struct 或字段链表未填充):报错终止
|
# 类型已注册但大小为 0(opaque struct 或字段链表未填充):Python 风格报错终止
|
||||||
fb_sz1: t.CChar | t.CPtr = VLogger.fmt_buf()
|
HandlesType.fatal_error(
|
||||||
if fb_sz1 is not None:
|
sz_at, f"类型 '{sz_cls_name}' 已注册但大小为 0(字段链表未填充),无法计算大小",
|
||||||
viperlib.snprintf(fb_sz1, 1024,
|
"TypeError")
|
||||||
"类型 '%s' 已注册但大小为 0(字段链表未填充),立即终止编译",
|
# 类型未注册:Python 风格报错终止,不静默返回 0(会导致 malloc(0)/alloc(0) 堆溢出)。
|
||||||
sz_cls_name)
|
# 注意:__sizeof__ 的接收者若是变量名(如 self.__sizeof__()),sz_cls_name 是
|
||||||
VLogger.critical(fb_sz1, "__sizeof__")
|
# 字面变量名("self")而非类型名,此报错即由此类误用触发(见 G5/GenericTest2)。
|
||||||
# 类型未注册:报错终止,不静默返回 0(会导致 malloc(0)/alloc(0) 堆溢出)
|
HandlesType.fatal_error(
|
||||||
fb_sz2: t.CChar | t.CPtr = VLogger.fmt_buf()
|
sz_at, f"类型 '{sz_cls_name}' 未在结构体表中注册,无法计算大小",
|
||||||
if fb_sz2 is not None:
|
"TypeError")
|
||||||
viperlib.snprintf(fb_sz2, 1024,
|
|
||||||
"类型 '%s' 未在结构体表中注册,无法计算大小,立即终止编译",
|
|
||||||
sz_cls_name)
|
|
||||||
VLogger.critical(fb_sz2, "__sizeof__")
|
|
||||||
|
|
||||||
# 检测 obj.__len__() — 返回 list 对象的 __count__ 字段(偏移 8,i64)
|
# 检测 obj.__len__() — 返回 list 对象的 __count__ 字段(偏移 8,i64)
|
||||||
# __len__ 是 list[T] 的内置方法,list 是泛型类不注册 struct
|
# __len__ 是 list[T] 的内置方法,list 是泛型类不注册 struct
|
||||||
|
|||||||
Reference in new issue
Block a user