From 37626bca63ffbe43c9fdbf277e49d86780e643fb Mon Sep 17 00:00:00 2001 From: TermiNexus Date: Mon, 10 Aug 2026 00:28:51 +0800 Subject: [PATCH] =?UTF-8?q?feat(gen):=20P1=20Generator=20=E9=AA=A8?= =?UTF-8?q?=E6=9E=B6=20-=20BaseGenMixin/Generator=20=E6=8B=86=E5=88=86?= =?UTF-8?q?=E4=B8=8E=20BuildPipeline=20=E6=8E=A5=E5=85=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 引入 lib/core/Gen/ 对象化骨架(对象化 P2 起点), BuildPipeline.Generate 接入 LLVMCG 生成链路; Generator.InitBaseGen 内联初始化(规避 Viper 继承 不转发父类方法符号的链接问题)。 --- App/lib/core/BuildPipeline.vp | 9 +++++ App/lib/core/Gen/BaseGenMixin.vp | 58 ++++++++++++++++++++++++++++++++ App/lib/core/Gen/Generator.vp | 39 +++++++++++++++++++++ App/lib/core/Gen/__init__.vp | 6 ++++ 4 files changed, 112 insertions(+) create mode 100644 App/lib/core/Gen/BaseGenMixin.vp create mode 100644 App/lib/core/Gen/Generator.vp create mode 100644 App/lib/core/Gen/__init__.vp diff --git a/App/lib/core/BuildPipeline.vp b/App/lib/core/BuildPipeline.vp index 8dff9dc..430bdeb 100644 --- a/App/lib/core/BuildPipeline.vp +++ b/App/lib/core/BuildPipeline.vp @@ -18,6 +18,7 @@ import lib.core.Handles.HandlesImports as HandlesImports import lib.core.StubMerger as StubMerger import lib.StubGen.Converter as StubConverter import lib.Projectrans.Config as Config +import lib.core.Gen.Generator as GenGenerator # ============================================================ # BuildPipeline - 编译管线 @@ -130,6 +131,14 @@ def TranslateFileGetTrans(mb: memhub.MemBuddy | t.CPtr, file_path: str, tr.ModuleSha1 = sha1_val tr.CurrentPackage = current_package tr._declare_only = declare_only + # P1: 创建 Generator 骨架实例(对象化迁移宿主;暂未接入翻译逻辑, + # 仅验证 Gen/ 模块可被自举编译且构造正确) + gen: GenGenerator.Generator | t.CPtr = mb.alloc(GenGenerator.Generator.__sizeof__()) + if gen is None: + VLogger.error("Generator alloc failed", "GEN") + return None + gen.__before_init__() + gen.__init__(mb) # 设置当前文件名(供报错使用) HandlesType.set_current_file(file_path) # 同步到 HandlesImports(import 时 SHA1 检查报错需要当前文件名,循环依赖无法直接读 HandlesType) diff --git a/App/lib/core/Gen/BaseGenMixin.vp b/App/lib/core/Gen/BaseGenMixin.vp new file mode 100644 index 0000000..3e04ab1 --- /dev/null +++ b/App/lib/core/Gen/BaseGenMixin.vp @@ -0,0 +1,58 @@ +import t, c +from stdint import * +import memhub +import llvmlite +import lib.core.Handles.HandlesVar as HandlesVar +import lib.core.Handles.HandlesExprCall as HandlesExprCall + + +# ============================================================ +# BaseGenMixin - 生成器基座(状态容器) +# +# 对象化重构 P1(方案见 wiki/14-oo-refactor.md): +# 将 Translator/Handles 的共享状态集中于此。后续 Mixin +# (TypeGen/StructGen/ExprGen/CallGen/FuncGen/ClassGen/StmtGen/ +# ImportsGen)单继承本类,逐步把 Handles* 模块的函数迁移为 +# Generator 的方法,消除 (pool, builder, mod, node, ...) 六参连传。 +# +# 注意:@t.NoVTable(静态绑定,骨架无多态需求;若未来需要 +# 运行时多态再改 @t.CVTable,字段布局由编译器统一管理)。 +# ============================================================ +@t.NoVTable +class BaseGenMixin: + """生成器状态容器(基座)""" + + # 内存/IR 状态 + Pool: memhub.MemBuddy | t.CPtr # 内存池 + Module: llvmlite.LLVMModule | t.CPtr # 当前 LLVM 模块 + Builder: llvmlite.IRBuilder | t.CPtr # 当前 IRBuilder + # 符号表/函数表 + SymTab: HandlesVar.SymbolTable | t.CPtr + Funcs: HandlesExprCall.FuncEntry | t.CPtr + FuncCount: t.CInt + # 导入/模块信息 + ImportedModules: str + FromImports: str + ModuleSha1: str + # 当前翻译上下文 + CurFunc: llvmlite.Function | t.CPtr + CurBuilder: llvmlite.IRBuilder | t.CPtr + CurClassName: str + + def InitBaseGen(self, pool: memhub.MemBuddy | t.CPtr) -> int: + """初始化生成器状态(默认值;子类构造时调用)""" + if self is None: + return 1 + self.Pool = pool + self.Module = None + self.Builder = None + self.SymTab = None + self.Funcs = None + self.FuncCount = 0 + self.ImportedModules = None + self.FromImports = None + self.ModuleSha1 = None + self.CurFunc = None + self.CurBuilder = None + self.CurClassName = None + return 0 diff --git a/App/lib/core/Gen/Generator.vp b/App/lib/core/Gen/Generator.vp new file mode 100644 index 0000000..484fa86 --- /dev/null +++ b/App/lib/core/Gen/Generator.vp @@ -0,0 +1,39 @@ +import t, c +from stdint import * +import memhub +import lib.core.Gen.BaseGenMixin as BaseGenMixin + + +# ============================================================ +# Generator - 生成器(P1 骨架) +# +# 对象化重构宿主:单继承 BaseGenMixin(Viper 无多继承先例, +# 采用单继承 Mixin 链:BaseGen → TypeGen → StructGen → ExprGen +# → CallGen → FuncGen → ClassGen → StmtGen → ImportsGen,每层 +# 一个文件,避免 Generator 单文件膨胀)。 +# +# @t.NoVTable:静态绑定(骨架无多态需求)。若未来需要运行时 +# 多态(如多后端生成器),再改 @t.CVTable。 +# ============================================================ +@t.NoVTable +class Generator(BaseGenMixin.BaseGenMixin): + """生成器:对象化迁移的宿主""" + + def __init__(self, pool: memhub.MemBuddy | t.CPtr): + # 注意:不调用 self.InitBaseGen(Viper NoVTable 继承只合并字段、 + # 不转发父类方法符号,子类调父类方法会 mangle 成子类名 → 链接 + # undefined reference)。字段初始化直接内联。 + if self is None: + return + self.Pool = pool + self.Module = None + self.Builder = None + self.SymTab = None + self.Funcs = None + self.FuncCount = 0 + self.ImportedModules = None + self.FromImports = None + self.ModuleSha1 = None + self.CurFunc = None + self.CurBuilder = None + self.CurClassName = None diff --git a/App/lib/core/Gen/__init__.vp b/App/lib/core/Gen/__init__.vp new file mode 100644 index 0000000..dfa19ad --- /dev/null +++ b/App/lib/core/Gen/__init__.vp @@ -0,0 +1,6 @@ +# ============================================================ +# Gen - 对象化生成器(P1 骨架) +# +# Generator: 翻译状态容器 + Mixin 组合(BaseGen 起步,后续按 +# wiki/14-oo-refactor.md 的 P2-P6 逐步吸收 Handles 模块)。 +# ============================================================