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
+2500 -2142

No files matched your search

+13 -7
View File
@@ -131,14 +131,20 @@ def TranslateFileGetTrans(mb: memhub.MemBuddy | t.CPtr, file_path: str,
tr.ModuleSha1 = sha1_val tr.ModuleSha1 = sha1_val
tr.CurrentPackage = current_package tr.CurrentPackage = current_package
tr._declare_only = declare_only tr._declare_only = declare_only
# P1: 创建 Generator 骨架实例(对象化迁移宿主;暂未接入翻译逻辑, # P2: 复用全局 gen 单例(App/main.vp 创建;HandlesType 等旧模块函数经
# 仅验证 Gen/ 模块可被自举编译且构造正确) # 延迟 import 委托到 gen 方法)。单例未注册时兜底创建(防御直接调用路径)。
gen: GenGenerator.Generator | t.CPtr = mb.alloc(GenGenerator.Generator.__sizeof__()) gen: GenGenerator.Generator | t.CPtr = GenGenerator.get_global_gen()
if gen is None: if gen is None:
VLogger.error("Generator alloc failed", "GEN") gen = mb.alloc(GenGenerator.Generator.__sizeof__())
return None if gen is None:
gen.__before_init__() VLogger.error("Generator alloc failed", "GEN")
gen.__init__(mb) 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) HandlesType.set_current_file(file_path)
# 同步到 HandlesImports(import 时 SHA1 检查报错需要当前文件名,循环依赖无法直接读 HandlesType) # 同步到 HandlesImports(import 时 SHA1 检查报错需要当前文件名,循环依赖无法直接读 HandlesType)
+56 -12
View File
@@ -1,30 +1,33 @@
import t, c import t, c
from stdint import * from stdint import *
import memhub import memhub
import llvmlite
import lib.core.Gen.BaseGenMixin as BaseGenMixin 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 无多继承先例, # 对象化重构宿主(wiki/14-oo-refactor.md):
# 采用单继承 Mixin 链:BaseGen → TypeGen → StructGen → ExprGen # @t.NoVTable + 多继承(BaseGen 状态 + TypeGen 类型映射),方法沿
# → CallGen → FuncGen → ClassGen → StmtGen → ImportsGen,每层 # MRO 直接调用(Viper 多继承已支持,M1-M4)。后续 P3-P6 追加
# 一个文件,避免 Generator 单文件膨胀)。 # StructGen/ExprGen/CallGen/FuncGen/ClassGen/StmtGen/ImportsGen Mixin。
# #
# @t.NoVTable:静态绑定(骨架无多态需求)。若未来需要运行时 # 注意:Viper NoVTable 继承只合并字段、不转发父类方法符号(子类调
# 多态(如多后端生成器),再改 @t.CVTable。 # 父类方法 mangle 成子类名 → undefined reference),因此字段初始化
# 全部内联,不调用父类 Init* 方法。
# ============================================================ # ============================================================
@t.NoVTable @t.NoVTable
class Generator(BaseGenMixin.BaseGenMixin): class Generator(BaseGenMixin.BaseGenMixin, TypeGenMixin.TypeGenMixin):
"""生成器:对象化迁移的宿主""" """生成器:多继承 Mixin 组合(对象化迁移宿主)"""
def __init__(self, pool: memhub.MemBuddy | t.CPtr): def __init__(self, pool: memhub.MemBuddy | t.CPtr):
# 注意:不调用 self.InitBaseGen(Viper NoVTable 继承只合并字段、
# 不转发父类方法符号,子类调父类方法会 mangle 成子类名 → 链接
# undefined reference)。字段初始化直接内联。
if self is None: if self is None:
return return
# ---- BaseGenMixin 字段 ----
self.Pool = pool self.Pool = pool
self.Module = None self.Module = None
self.Builder = None self.Builder = None
@@ -37,3 +40,44 @@ class Generator(BaseGenMixin.BaseGenMixin):
self.CurFunc = None self.CurFunc = None
self.CurBuilder = None self.CurBuilder = None
self.CurClassName = 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 起步,后续按 # Generator: 翻译状态容器 + Mixin 组合(BaseGen 状态 + TypeGen 类型映射,
# wiki/14-oo-refactor.md 的 P2-P6 逐步吸收 Handles 模块)。 # 后续按 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.StubMerger as StubMerger
import lib.core.Phase1 as Phase1 import lib.core.Phase1 as Phase1
import lib.core.Phase2 as Phase2 import lib.core.Phase2 as Phase2
import lib.core.Gen.Generator as GenGenerator
import lib.Projectrans.Config as Config import lib.Projectrans.Config as Config
import lib.Projectrans.Utils as Utils import lib.Projectrans.Utils as Utils
import llvmlite import llvmlite
@@ -77,6 +78,18 @@ def main() -> int:
VLogger._mbuddy = (memhub.MemBuddy | t.CPtr)(mb) VLogger._mbuddy = (memhub.MemBuddy | t.CPtr)(mb)
lib.InitLib((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 并打印启动日志 # 初始化 VLogger 并打印启动日志
log: VLogger.Logger | t.CPtr = VLogger.get_logger() log: VLogger.Logger | t.CPtr = VLogger.get_logger()
if log is not None: if log is not None: