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:
TermiNexus committed 2026-08-20 00:05:32 +08:00
1 parent dc5bb2111b
commit e770fef0f7
4 files changed
+54 -9

No files matched your search

+44 -6
View File
@@ -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:
return bname
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,9 +927,12 @@ 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:
parents_buf[count] = t.CSizeT(bname)
count += 1
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
def _field_name_exists(self, names_buf: t.CSizeT | t.CPtr,
count: int, name: str) -> int:
+1 -1
View File
@@ -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:
+6
View File
@@ -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 值语义:
+3 -2
View File
@@ -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