From 87e2356eead7592c734cce73402ed3d66e25c22e Mon Sep 17 00:00:00 2001 From: TermiNexus Date: Fri, 2 Oct 2026 02:48:26 +0800 Subject: [PATCH] =?UTF-8?q?feat(type):=20rawptr[T]/t.CPtr[T]=20=E4=B8=8B?= =?UTF-8?q?=E6=A0=87=E5=BD=A2=E4=B9=9F=E8=B5=B0=E5=89=8D=E5=90=91=E5=A3=B0?= =?UTF-8?q?=E6=98=8E=EF=BC=8C=E5=B9=B6=E8=A6=86=E7=9B=96=E5=90=8C=E6=96=87?= =?UTF-8?q?=E4=BB=B6=E5=89=8D=E5=90=91=E5=BC=95=E7=94=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 承接 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 自引用字段)。 无编译验证。 --- App/lib/core/Gen/Type/TypeGenResolve.vp | 20 ++++++++++++++++---- 1 file changed, 16 insertions(+), 4 deletions(-) diff --git a/App/lib/core/Gen/Type/TypeGenResolve.vp b/App/lib/core/Gen/Type/TypeGenResolve.vp index 7109374..7416ec6 100644 --- a/App/lib/core/Gen/Type/TypeGenResolve.vp +++ b/App/lib/core/Gen/Type/TypeGenResolve.vp @@ -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: