fix(TPC): 继承链 vtable 状态追溯 + 默认参数检查信息缺失保护
- _resolve_class_flags 沿 class_parent 链追溯 vtable 状态:Stmt/ExprNode 空中间基类(@t.CVTable 无方法)跨模块未注册 class_vtable,子类 IsCVTable 误判为 False → __before_init__ base=0 不写 vtable → 实例 vtable=null → 虚调用段错误。改为沿链查找任一祖先有 vtable 即继承。 - 函数调用严格参数检查:默认参数信息缺失(跨模块 stub 加载/并行编译时序未同步)时跳过检查,避免 fatal_error 误报缺少必需参数。
This commit is contained in:
1 parent
a941179826
commit
d687216772
2 files changed
+32
-8
No files matched your search
@@ -442,8 +442,23 @@ class ClassHandle(BaseHandle):
|
||||
# 继承链统一 vtable(与 TPV _detect_vtable_status 一致):
|
||||
# 父类有 vtable → 子类启用;父类无 vtable → 子类不启用(静态);
|
||||
# 父类 vtable 状态未知(跨模块/未注册)→ 保守启用。
|
||||
parent_has_vtable: bool = (ParentClassName in Gen.class_vtable
|
||||
or ParentClassName in Gen._cross_module_vtable_classes)
|
||||
# 沿继承链追溯父类的 vtable 状态(支持空中间基类 Stmt/ExprNode):
|
||||
# Stmt/ExprNode 无方法但 @t.CVTable,跨模块加载时 _has_methods_prescan=False
|
||||
# 未注册 class_vtable,若只查直接父类会误判子类为静态类 →
|
||||
# __before_init__ base=0 不写 vtable → 实例 vtable 为 null → 虚调用段错误。
|
||||
# 修复:沿 class_parent 链向上查,任一祖先有 vtable 即判定子类有 vtable。
|
||||
_parent_has_vtable: bool = False
|
||||
_p_chain: str | None = ParentClassName
|
||||
_p_visited_chain: set[str] = {ClassName}
|
||||
_class_parent_map: dict = getattr(Gen, 'class_parent', {})
|
||||
while _p_chain and _p_chain not in _p_visited_chain:
|
||||
_p_visited_chain.add(_p_chain)
|
||||
if (_p_chain in Gen.class_vtable
|
||||
or _p_chain in Gen._cross_module_vtable_classes):
|
||||
_parent_has_vtable = True
|
||||
break
|
||||
_p_chain = _class_parent_map.get(_p_chain)
|
||||
parent_has_vtable: bool = _parent_has_vtable
|
||||
parent_known: bool = (ParentClassName in class_graph
|
||||
or ParentClassName in Gen.class_members
|
||||
or ParentClassName in Gen.structs)
|
||||
|
||||
Reference in new issue
Block a user