feat(gen): P1 Generator 骨架 - BaseGenMixin/Generator 拆分与 BuildPipeline 接入

引入 lib/core/Gen/ 对象化骨架(对象化 P2 起点), BuildPipeline.Generate
接入 LLVMCG 生成链路; Generator.InitBaseGen 内联初始化(规避 Viper 继承
不转发父类方法符号的链接问题)。
This commit is contained in:
TermiNexus committed 2026-08-10 00:28:51 +08:00
1 parent 695699f01e
commit 37626bca63
4 files changed
+112

No files matched your search

+9
View File
@@ -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)
+58
View File
@@ -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
+39
View File
@@ -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
+6
View File
@@ -0,0 +1,6 @@
# ============================================================
# Gen - 对象化生成器(P1 骨架)
#
# Generator: 翻译状态容器 + Mixin 组合(BaseGen 起步,后续按
# wiki/14-oo-refactor.md 的 P2-P6 逐步吸收 Handles 模块)。
# ============================================================