refactor(gen): P2 TypeGenMixin 迁移 + 全局单例委托机制
Generator 改 @t.NoVTable 多继承(BaseGenMixin + TypeGenMixin)组合; HandlesType 54 个类型函数迁移为 TypeGenMixin 方法(全局状态迁入 gen 字段),旧函数保留为委托层。单例经 HandlesType 模块级 _g_gen 注入(BuildPipeline/main),避免 TPC 包短名未注册与 Generator 类/模块名歧义导致的编译链接问题。bootstrap 38/38 通过。
This commit is contained in:
1 parent
b3170ba823
commit
e1ef67d013
6 files changed
+2479
-2121
No files matched your search
@@ -131,14 +131,20 @@ 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__())
|
||||
# P2: 复用全局 gen 单例(App/main.vp 创建;HandlesType 等旧模块函数经
|
||||
# 延迟 import 委托到 gen 方法)。单例未注册时兜底创建(防御直接调用路径)。
|
||||
gen: GenGenerator.Generator | t.CPtr = GenGenerator.get_global_gen()
|
||||
if gen is None:
|
||||
gen = mb.alloc(GenGenerator.Generator.__sizeof__())
|
||||
if gen is None:
|
||||
VLogger.error("Generator alloc failed", "GEN")
|
||||
return None
|
||||
gen.__before_init__()
|
||||
gen.__init__(mb)
|
||||
GenGenerator.set_global_gen(gen)
|
||||
# P2: 注入 HandlesType 模块级单例(委托函数经本地 _g_gen 访问,
|
||||
# 避免函数体 import 包模块与 Generator 类/模块名歧义)
|
||||
HandlesType.set_global_gen(gen)
|
||||
# 设置当前文件名(供报错使用)
|
||||
HandlesType.set_current_file(file_path)
|
||||
# 同步到 HandlesImports(import 时 SHA1 检查报错需要当前文件名,循环依赖无法直接读 HandlesType)
|
||||
|
||||
@@ -1,30 +1,33 @@
|
||||
import t, c
|
||||
from stdint import *
|
||||
import memhub
|
||||
import llvmlite
|
||||
import lib.core.Gen.BaseGenMixin as BaseGenMixin
|
||||
import lib.core.Gen.TypeGenMixin as TypeGenMixin
|
||||
import lib.core.Handles.HandlesVar as HandlesVar
|
||||
import lib.core.Handles.HandlesExprCall as HandlesExprCall
|
||||
|
||||
|
||||
# ============================================================
|
||||
# Generator - 生成器(P1 骨架)
|
||||
# Generator - 生成器(P1 骨架 + P2 多继承 Mixin 组合)
|
||||
#
|
||||
# 对象化重构宿主:单继承 BaseGenMixin(Viper 无多继承先例,
|
||||
# 采用单继承 Mixin 链:BaseGen → TypeGen → StructGen → ExprGen
|
||||
# → CallGen → FuncGen → ClassGen → StmtGen → ImportsGen,每层
|
||||
# 一个文件,避免 Generator 单文件膨胀)。
|
||||
# 对象化重构宿主(wiki/14-oo-refactor.md):
|
||||
# @t.NoVTable + 多继承(BaseGen 状态 + TypeGen 类型映射),方法沿
|
||||
# MRO 直接调用(Viper 多继承已支持,M1-M4)。后续 P3-P6 追加
|
||||
# StructGen/ExprGen/CallGen/FuncGen/ClassGen/StmtGen/ImportsGen Mixin。
|
||||
#
|
||||
# @t.NoVTable:静态绑定(骨架无多态需求)。若未来需要运行时
|
||||
# 多态(如多后端生成器),再改 @t.CVTable。
|
||||
# 注意:Viper NoVTable 继承只合并字段、不转发父类方法符号(子类调
|
||||
# 父类方法 mangle 成子类名 → undefined reference),因此字段初始化
|
||||
# 全部内联,不调用父类 Init* 方法。
|
||||
# ============================================================
|
||||
@t.NoVTable
|
||||
class Generator(BaseGenMixin.BaseGenMixin):
|
||||
"""生成器:对象化迁移的宿主"""
|
||||
class Generator(BaseGenMixin.BaseGenMixin, TypeGenMixin.TypeGenMixin):
|
||||
"""生成器:多继承 Mixin 组合(对象化迁移宿主)"""
|
||||
|
||||
def __init__(self, pool: memhub.MemBuddy | t.CPtr):
|
||||
# 注意:不调用 self.InitBaseGen(Viper NoVTable 继承只合并字段、
|
||||
# 不转发父类方法符号,子类调父类方法会 mangle 成子类名 → 链接
|
||||
# undefined reference)。字段初始化直接内联。
|
||||
if self is None:
|
||||
return
|
||||
# ---- BaseGenMixin 字段 ----
|
||||
self.Pool = pool
|
||||
self.Module = None
|
||||
self.Builder = None
|
||||
@@ -37,3 +40,44 @@ class Generator(BaseGenMixin.BaseGenMixin):
|
||||
self.CurFunc = None
|
||||
self.CurBuilder = None
|
||||
self.CurClassName = None
|
||||
# ---- TypeGenMixin 字段 ----
|
||||
self.TraceFrames = None
|
||||
self.TraceCount = 0
|
||||
self.TempDir = None
|
||||
self.GenericTpNames = None
|
||||
self.GenericTypeArgs = None
|
||||
self.CDefineNames = None
|
||||
self.CDefineValues = None
|
||||
self.CDefineDoubleFlags = None
|
||||
self.CDefineIsDouble = 0
|
||||
self.CDefineFound = 0
|
||||
self.CurrentModuleSha1 = None
|
||||
self.CTypedefNames = None
|
||||
self.CTypedefTypeStrs = None
|
||||
self.CTypedefFound = 0
|
||||
self.CTypedefResolveDepth = 0
|
||||
self.CTypedefVisiting = None
|
||||
self.CurrentFile = None
|
||||
self.ConstEvalOk = 0
|
||||
|
||||
|
||||
# ============================================================
|
||||
# 全局生成器单例(对象化 P2 兼容层)
|
||||
#
|
||||
# 从 Gen/__init__.vp(包)迁入本模块(普通模块):TPC 的模块名注册
|
||||
# 只注册"普通模块短名"(如 Generator)与"完整包名"(如 lib.core.Gen),
|
||||
# 不注册包短名(如 Gen)。HandlesType 等旧模块的函数体 import 若引
|
||||
# 用包短名会报 Unknown module,故单例存取放在非包模块,别名用短名。
|
||||
# ============================================================
|
||||
_g_gen: Generator | t.CPtr = None
|
||||
|
||||
|
||||
def set_global_gen(gen: Generator | t.CPtr) -> None:
|
||||
"""注册全局生成器单例(App/main.vp 创建 gen 后调用)"""
|
||||
global _g_gen
|
||||
_g_gen = gen
|
||||
|
||||
|
||||
def get_global_gen() -> Generator | t.CPtr:
|
||||
"""获取全局生成器单例(未注册返回 None)"""
|
||||
return _g_gen
|
||||
File diff suppressed because it is too large.
Load diff
@@ -1,6 +1,10 @@
|
||||
# ============================================================
|
||||
# Gen - 对象化生成器(P1 骨架)
|
||||
# Gen - 对象化生成器(P1 骨架 + P2 TypeGenMixin)
|
||||
#
|
||||
# Generator: 翻译状态容器 + Mixin 组合(BaseGen 起步,后续按
|
||||
# wiki/14-oo-refactor.md 的 P2-P6 逐步吸收 Handles 模块)。
|
||||
# Generator: 翻译状态容器 + Mixin 组合(BaseGen 状态 + TypeGen 类型映射,
|
||||
# 后续按 wiki/14-oo-refactor.md 的 P3-P6 逐步吸收 Handles 模块)。
|
||||
#
|
||||
# 全局单例(set_global_gen/get_global_gen)已迁移至
|
||||
# lib.core.Gen.Generator 模块(P2 修复:TPC 不注册包短名,函数体
|
||||
# import 包名会报 Unknown module,非包模块短名可被注册)。
|
||||
# ============================================================
|
||||
+313
-2103
File diff suppressed because it is too large.
Load diff
+13
@@ -22,6 +22,7 @@ import lib.core.IncludesScanner as IncludesScanner
|
||||
import lib.core.StubMerger as StubMerger
|
||||
import lib.core.Phase1 as Phase1
|
||||
import lib.core.Phase2 as Phase2
|
||||
import lib.core.Gen.Generator as GenGenerator
|
||||
import lib.Projectrans.Config as Config
|
||||
import lib.Projectrans.Utils as Utils
|
||||
import llvmlite
|
||||
@@ -77,6 +78,18 @@ def main() -> int:
|
||||
VLogger._mbuddy = (memhub.MemBuddy | t.CPtr)(mb)
|
||||
lib.InitLib((memhub.MemBuddy | t.CPtr)(mb))
|
||||
|
||||
# P2: 创建项目级 Generator 单例(Phase1/Phase2/BuildPipeline 全程复用;
|
||||
# HandlesType 等旧模块函数经延迟 import 委托到 gen 方法,实现对象化过渡)
|
||||
gen: GenGenerator.Generator | t.CPtr = mb.alloc(GenGenerator.Generator.__sizeof__())
|
||||
if gen is None:
|
||||
stdio.printf("FAIL: Generator alloc failed\n")
|
||||
return 1
|
||||
gen.__before_init__()
|
||||
gen.__init__(mb)
|
||||
GenGenerator.set_global_gen(gen)
|
||||
# P2: 注入 HandlesType 模块级单例(Phase1 阶段即调用 HandlesType 状态函数)
|
||||
HandlesType.set_global_gen(gen)
|
||||
|
||||
# 初始化 VLogger 并打印启动日志
|
||||
log: VLogger.Logger | t.CPtr = VLogger.get_logger()
|
||||
if log is not None:
|
||||
|
||||
Reference in new issue
Block a user