feat(gen): P1 Generator 骨架 - BaseGenMixin/Generator 拆分与 BuildPipeline 接入
引入 lib/core/Gen/ 对象化骨架(对象化 P2 起点), BuildPipeline.Generate 接入 LLVMCG 生成链路; Generator.InitBaseGen 内联初始化(规避 Viper 继承 不转发父类方法符号的链接问题)。
This commit is contained in:
1 parent
695699f01e
commit
37626bca63
4 files changed
+112
No files matched your search
@@ -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)
|
||||
|
||||
@@ -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
|
||||
@@ -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
|
||||
@@ -0,0 +1,6 @@
|
||||
# ============================================================
|
||||
# Gen - 对象化生成器(P1 骨架)
|
||||
#
|
||||
# Generator: 翻译状态容器 + Mixin 组合(BaseGen 起步,后续按
|
||||
# wiki/14-oo-refactor.md 的 P2-P6 逐步吸收 Handles 模块)。
|
||||
# ============================================================
|
||||
Reference in new issue
Block a user