Generator 改 @t.NoVTable 多继承(BaseGenMixin + TypeGenMixin)组合; HandlesType 54 个类型函数迁移为 TypeGenMixin 方法(全局状态迁入 gen 字段),旧函数保留为委托层。单例经 HandlesType 模块级 _g_gen 注入(BuildPipeline/main),避免 TPC 包短名未注册与 Generator 类/模块名歧义导致的编译链接问题。bootstrap 38/38 通过。
84 lines
3.1 KiB
Plaintext
84 lines
3.1 KiB
Plaintext
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 骨架 + P2 多继承 Mixin 组合)
|
||
#
|
||
# 对象化重构宿主(wiki/14-oo-refactor.md):
|
||
# @t.NoVTable + 多继承(BaseGen 状态 + TypeGen 类型映射),方法沿
|
||
# MRO 直接调用(Viper 多继承已支持,M1-M4)。后续 P3-P6 追加
|
||
# StructGen/ExprGen/CallGen/FuncGen/ClassGen/StmtGen/ImportsGen Mixin。
|
||
#
|
||
# 注意:Viper NoVTable 继承只合并字段、不转发父类方法符号(子类调
|
||
# 父类方法 mangle 成子类名 → undefined reference),因此字段初始化
|
||
# 全部内联,不调用父类 Init* 方法。
|
||
# ============================================================
|
||
@t.NoVTable
|
||
class Generator(BaseGenMixin.BaseGenMixin, TypeGenMixin.TypeGenMixin):
|
||
"""生成器:多继承 Mixin 组合(对象化迁移宿主)"""
|
||
|
||
def __init__(self, pool: memhub.MemBuddy | t.CPtr):
|
||
if self is None:
|
||
return
|
||
# ---- BaseGenMixin 字段 ----
|
||
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
|
||
# ---- 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
|