fix(gen): 恢复 ClassGenBase 基类别名解析(_resolve_base_alias)
ClassGenMixin 拆分(47ac2dd)时 _resolve_base_alias 丢失:_get_parent_class
/_collect_parents 不再解析 from-import 别名基类(from t import CStruct as cs
→ class CsPoint(cs)),'cs' 被当真实父类 → find_struct('cs') 失败 → 类 defer
永不注册 → 变量注解解析失败(EdgeCaseTest Test12 回归)。恢复
_resolve_base_alias 并在两处调用;_collect_parents 增 trans 参数透传(别名
解析需 from_imports)。TypeGenResolve 增 [DBG-ANNOT] 插桩待验证后移除。
This commit is contained in:
1 parent
dc5bb2111b
commit
e770fef0f7
4 files changed
+51
-6
No files matched your search
@@ -872,13 +872,48 @@ class ClassGenBase:
|
||||
if base_node is None:
|
||||
continue
|
||||
bname: str = self._get_base_name(base_node, pool)
|
||||
if bname is not None and self._is_marker_base(bname) == 0:
|
||||
if bname is not None:
|
||||
# 基类别名解析(from t import CStruct as cs → cs 实际是 CStruct)。
|
||||
# ClassGen 拆分(47ac2dd)时丢失,EdgeCaseTest Test12 class
|
||||
# CsPoint(cs) 回归根因:'cs' 被当真实父类 → find_struct("cs")
|
||||
# 失败 → 类 defer 永不注册 → 变量注解解析失败。
|
||||
bname = self._resolve_base_alias(bname, trans)
|
||||
if self._is_marker_base(bname) == 0:
|
||||
return bname
|
||||
return None
|
||||
def _resolve_base_alias(self, base_name: str,
|
||||
trans: HT.Translator | t.CPtr = None) -> str:
|
||||
"""解析基类别名:from t import CStruct as cs → 基类 cs 实际是 CStruct。
|
||||
|
||||
别名不解析时 "cs" 会被当作真实父类名 → find_struct("cs") 失败 →
|
||||
PhaseA 预注册把整类 defer(永不注册)→ 变量注解 X 解析失败
|
||||
(EdgeCaseTest Test12 class CsPoint(cs): 根因)。
|
||||
"""
|
||||
if base_name is None or trans is None or trans._from_imports is None:
|
||||
return base_name
|
||||
orig: str = HandlesImports.lookup_from_import_original(
|
||||
trans._from_imports, base_name)
|
||||
if orig is not None:
|
||||
# lookup_from_import_original 返回 from_imports 内部指针且未 NUL 结尾
|
||||
# (如 "CStruct myint:t:CInt CChar:t CPtr:t" 整串直到真正的 NUL)。
|
||||
# 复制到独立缓冲并按空格截断出干净原始名——否则 _is_marker_base 的
|
||||
# strcmp 对整串比较失败 → 别名基类(CStruct as cs)被当真实父类 →
|
||||
# find_struct 失败 → 整类 defer 永不注册 → 变量注解解析失败。
|
||||
og_len: t.CSizeT = 0
|
||||
while orig[og_len] != ' ' and orig[og_len] != '\0':
|
||||
og_len += 1
|
||||
if og_len > 0:
|
||||
og_buf: str = CompilerFactory.get_perm_pool().alloc(og_len + 1)
|
||||
if og_buf is not None:
|
||||
string.strncpy(og_buf, orig, og_len)
|
||||
og_buf[og_len] = '\0'
|
||||
return og_buf
|
||||
return base_name
|
||||
def _collect_parents(self, pool: memhub.MemBuddy | t.CPtr,
|
||||
cd: ast.ClassDef | t.CPtr,
|
||||
parents_buf: t.CSizeT | t.CPtr,
|
||||
max_parents: int) -> int:
|
||||
max_parents: int,
|
||||
trans: HT.Translator | t.CPtr = None) -> int:
|
||||
"""收集所有非 marker 父类名到 parents_buf,返回数量"""
|
||||
if pool is None or cd is None or cd.bases is None or parents_buf is None:
|
||||
return 0
|
||||
@@ -892,7 +927,10 @@ class ClassGenBase:
|
||||
if base_node is None:
|
||||
continue
|
||||
bname: str = self._get_base_name(base_node, pool)
|
||||
if bname is not None and self._is_marker_base(bname) == 0:
|
||||
if bname is not None:
|
||||
# 基类别名解析(同 _get_parent_class,见 _resolve_base_alias)
|
||||
bname = self._resolve_base_alias(bname, trans)
|
||||
if self._is_marker_base(bname) == 0:
|
||||
parents_buf[count] = t.CSizeT(bname)
|
||||
count += 1
|
||||
return count
|
||||
|
||||
@@ -151,7 +151,7 @@ class ClassGenDef(ClassGenBase.ClassGenBase):
|
||||
parents_buf: t.CSizeT | t.CPtr = pool.alloc(8 * HandlesStruct.PARENT_MAX)
|
||||
parents_count: int = 0
|
||||
if parents_buf is not None:
|
||||
parents_count = HandlesClassDef._collect_parents(pool, cd, parents_buf, HandlesStruct.PARENT_MAX)
|
||||
parents_count = HandlesClassDef._collect_parents(pool, cd, parents_buf, HandlesStruct.PARENT_MAX, trans)
|
||||
is_novtable_deco: int = 0
|
||||
if cd.decorator_list is not None:
|
||||
if HandlesClassDef._has_decorator(cd.decorator_list, "NoVTable") == 1:
|
||||
|
||||
@@ -1016,6 +1016,12 @@ class TypeGenResolve(TypeGenBase.TypeGenBase):
|
||||
# 本模块未定义时回退按裸名全局查找(import 来的类走此路径)。
|
||||
if trans is not None and trans.ModuleSha1 is not None:
|
||||
own_entry: HandlesStruct.StructEntry | t.CPtr = HandlesStruct.find_struct_by_module(nm.id, trans.ModuleSha1)
|
||||
#region debug-point ANNOT
|
||||
stdio.printf("[DBG-ANNOT] resolve Name=%s modsha=%s own=%d vis=%d\n",
|
||||
nm.id, trans.ModuleSha1,
|
||||
(1 if own_entry is not None else 0),
|
||||
(1 if HandlesStruct.is_struct_visible(nm.id) != 0 else 0))
|
||||
#endregion
|
||||
if own_entry is not None and own_entry.Ty is not None:
|
||||
# 有 __new__ 的类(堆对象)注解 → Ptr(struct)(引用语义,对齐 TPC)。
|
||||
# 否则无 __new__ 的类(栈对象,如 Point)保持 struct 值语义:
|
||||
|
||||
@@ -390,12 +390,13 @@ def _get_parent_class(cd: ast.ClassDef | t.CPtr,
|
||||
def _collect_parents(pool: memhub.MemBuddy | t.CPtr,
|
||||
cd: ast.ClassDef | t.CPtr,
|
||||
parents_buf: t.CSizeT | t.CPtr,
|
||||
max_parents: int) -> int:
|
||||
max_parents: int,
|
||||
trans: HT.Translator | t.CPtr = None) -> int:
|
||||
"""收集所有非 marker 父类名到 parents_buf,返回数量(委托到 gen._collect_parents)"""
|
||||
import lib.core.Gen.Generator as Generator
|
||||
g: Generator.Generator | t.CPtr = (Generator.Generator | t.CPtr)(t.CVoid(_g_gen, t.CPtr))
|
||||
if g is not None:
|
||||
return g._collect_parents(pool, cd, parents_buf, max_parents)
|
||||
return g._collect_parents(pool, cd, parents_buf, max_parents, trans)
|
||||
return 0
|
||||
|
||||
|
||||
|
||||
Reference in new issue
Block a user