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:
TermiNexus committed 2026-08-10 01:46:28 +08:00
1 parent b3170ba823
commit e1ef67d013
6 files changed
+2479 -2121

No files matched your search

+9 -3
View File
@@ -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)
+56 -12
View File
@@ -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
+7 -3
View File
@@ -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,非包模块短名可被注册)。
# ============================================================
File diff suppressed because it is too large. Load diff
+13
View File
@@ -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: