feat(type): rawptr[T]/t.CPtr[T] 下标形也走前向声明,并覆盖同文件前向引用
承接 c0d3231(X | t.CPtr 已改前向声明):
- t.CPtr[T] 分支:inner 解析为 None 时先尝试前向声明具名占位并返回
Ptr(占位.Ty),保住类身份;无法确定类名/模块时才回 None 交多遍收敛。
rawptr[T] 经 builtins typedef(rawptr = t.CPtr)兜底归一到本分支,故一并覆盖。
- _forward_declare_ptr_from_node 的 Name 分支补"本文件顶层类"回退:用
StructGen.register_file_classes 登记的"{名字 → 本文件模块 SHA1}"前向声明,
覆盖同文件前向引用 / 自我引用(如 JsonValue | t.CPtr 自引用字段)。
无编译验证。
This commit is contained in:
1 parent
c0d3231e02
commit
87e2356eea
1 file changed
+16
-4
@@ -1995,6 +1995,12 @@ novirtual class TypeGenResolve(TypeGenBase.TypeGenBase):
|
||||
cls_nm = nm.id
|
||||
if from_imports is not None:
|
||||
sha1 = self.Gen.CallGenBase._lookup_mod_sha1(pool, from_imports, cls_nm, 0)
|
||||
# 本文件顶层类(如自我引用 JsonValue | t.CPtr,或同文件内前向引用):
|
||||
# register_file_classes 已登记"名字 → 本文件模块 SHA1"(规则 5.5 证据⑤同源),
|
||||
# 用它前向声明——与 TPC 的同类前向引用同等处理。
|
||||
if sha1 is None:
|
||||
if self.Gen.StructGen.is_file_class(pool, cls_nm) != 0:
|
||||
sha1 = self.Gen.StructGen.get_file_module_sha1()
|
||||
else:
|
||||
return None
|
||||
if cls_nm is None or sha1 is None or sha1[0] == '\0':
|
||||
@@ -3619,10 +3625,16 @@ novirtual class TypeGenResolve(TypeGenBase.TypeGenBase):
|
||||
self.Gen.TypeGenErr.fatal_type_error(node, "t.CPtr 模块未导入")
|
||||
inner_cptr_ty: llvmlite.LLVMType* = self.resolve_annotation_type(pool, sub.slice, imported_modules, from_imports, trans, depth + 1)
|
||||
if inner_cptr_ty is None:
|
||||
# 元素类型依赖未就绪(如 t.CPtr[类] 中类尚未注册):返回 None 交上层多遍
|
||||
# 收敛,不在此 fatal 中断 Phase 1a 预注册(UINT 等只经 CTypedef 动态表解析,
|
||||
# Phase 1a 无 vpi 注入时依赖 typedef 的类会被跳过)。与裸名 CArray 路径及
|
||||
# ClassGenDef 字段 pending 机制一致;真实类型错误由 Phase A 收敛检查暴露。
|
||||
# 元素类型依赖未就绪(如 t.CPtr[类]/rawptr[类] 中类尚未注册,
|
||||
# rawptr[T] 经 builtins typedef 归一到本分支):优先**前向声明**
|
||||
# 具名占位 {sha}.Class 并返回 Ptr(占位.Ty),保住类身份(对齐
|
||||
# X|t.CPtr 分支与 TPC);无法确定类名/模块时仍返回 None 交上层
|
||||
# 多遍收敛,不在此 fatal 中断 Phase 1a 预注册(UINT 等只经
|
||||
# CTypedef 动态表解析)。真实类型错误由 Phase A 收敛检查暴露。
|
||||
_fwd_cptr_ty: llvmlite.LLVMType* = self._forward_declare_ptr_from_node(
|
||||
pool, sub.slice, imported_modules, from_imports)
|
||||
if _fwd_cptr_ty is not None:
|
||||
return _fwd_cptr_ty
|
||||
return None
|
||||
return llvmlite.Ptr(pool, inner_cptr_ty)
|
||||
if string.strcmp(arr_at.attr, "CArray") != 0:
|
||||
|
||||
Reference in new issue
Block a user