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.Gen.TypeGenBase as TypeGenBase import lib.core.Gen.TypeGenCDef as TypeGenCDef import lib.core.Gen.TypeGenCType as TypeGenCType import lib.core.Gen.TypeGenResolve as TypeGenResolve import lib.core.Gen.TypeGenErr as TypeGenErr import lib.core.Gen.StructGenMixin as StructGenMixin import lib.core.Gen.ExprGenMixin as ExprGenMixin import lib.core.Gen.ExprGenBase as ExprGenBase import lib.core.Gen.ExprGenConst as ExprGenConst import lib.core.Gen.ExprGenFstr as ExprGenFstr import lib.core.Gen.ExprGenOps as ExprGenOps import lib.core.Gen.ExprGenCdef as ExprGenCdef import lib.core.Gen.ExprGenName as ExprGenName import lib.core.Gen.ExprGenAttr as ExprGenAttr import lib.core.Gen.ExprGenCls as ExprGenCls import lib.core.Gen.CallGenMixin as CallGenMixin import lib.core.Gen.CallGenBase as CallGenBase import lib.core.Gen.CallGenLeafKit as CallGenLeafKit import lib.core.Gen.CallGenCBuiltin as CallGenCBuiltin import lib.core.Gen.CallGenCtor as CallGenCtor import lib.core.Gen.CallGenCall as CallGenCall import lib.core.Gen.CallGenProp as CallGenProp import lib.core.Gen.CallGenFd as CallGenFd import lib.core.Gen.CallGenVt as CallGenVt import lib.core.Gen.CallGenVa as CallGenVa import lib.core.Gen.CallGenLib as CallGenLib import lib.core.Gen.CallGenDispatch as CallGenDispatch import lib.core.Gen.FuncGenBase as FuncGenBase import lib.core.Gen.FuncGenDef as FuncGenDef import lib.core.Gen.FuncGenMixin as FuncGenMixin import lib.core.Gen.ClassGenMixin as ClassGenMixin import lib.core.Gen.ClassGenBase as ClassGenBase import lib.core.Gen.ClassGenEnum as ClassGenEnum import lib.core.Gen.ClassGenGeneric as ClassGenGeneric import lib.core.Gen.ClassGenVTable as ClassGenVTable import lib.core.Gen.ClassGenDef as ClassGenDef import lib.core.Gen.ImportsGenMixin as ImportsGenMixin import lib.core.Gen.StmtGenMixin as StmtGenMixin import lib.core.Gen.AssignGenMixin as AssignGenMixin import lib.core.Gen.VarGenMixin as VarGenMixin import lib.core.Gen.TranslatorGenMixin as TranslatorGenMixin 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, TypeGenBase.TypeGenBase, TypeGenCDef.TypeGenCDef, TypeGenCType.TypeGenCType, TypeGenResolve.TypeGenResolve, TypeGenErr.TypeGenErr, StructGenMixin.StructGenMixin, ExprGenMixin.ExprGenMixin, ExprGenBase.ExprGenBase, ExprGenConst.ExprGenConst, ExprGenFstr.ExprGenFstr, ExprGenOps.ExprGenOps, ExprGenCdef.ExprGenCdef, ExprGenName.ExprGenName, ExprGenAttr.ExprGenAttr, ExprGenCls.ExprGenCls, CallGenMixin.CallGenMixin, CallGenBase.CallGenBase, CallGenLeafKit.CallGenLeafKit, CallGenCBuiltin.CallGenCBuiltin, CallGenCtor.CallGenCtor, CallGenCall.CallGenCall, CallGenProp.CallGenProp, CallGenFd.CallGenFd, CallGenVt.CallGenVt, CallGenVa.CallGenVa, CallGenLib.CallGenLib, CallGenDispatch.CallGenDispatch, FuncGenBase.FuncGenBase, FuncGenDef.FuncGenDef, FuncGenMixin.FuncGenMixin, ClassGenMixin.ClassGenMixin, ClassGenBase.ClassGenBase, ClassGenEnum.ClassGenEnum, ClassGenGeneric.ClassGenGeneric, ClassGenVTable.ClassGenVTable, ClassGenDef.ClassGenDef, ImportsGenMixin.ImportsGenMixin, StmtGenMixin.StmtGenMixin, AssignGenMixin.AssignGenMixin, VarGenMixin.VarGenMixin, TranslatorGenMixin.TranslatorGenMixin): """生成器:多继承 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.GenericCtxStack = None self.GenericCtxDepth = 0 self.CDefineNames = None self.CDefineValues = None self.CDefineDoubleFlags = None self.CDefineStrFlags = None self.CDefineIsDouble = 0 self.CDefineIsStr = 0 self.CDefineFound = 0 # 跨模块 CDefine 查找缓存(perm_pool 永久,跨文件复用) self.XmodCdefNames = None self.XmodCdefValues = None self.XmodCdefDoubleFlags = None self.XmodCdefStrFlags = None self.CurrentModuleSha1 = None self.CTypedefNames = None self.CTypedefTypeStrs = None self.CTypedefFound = 0 self.CTypedefResolveDepth = 0 self.CTypedefVisiting = None self.CurrentFile = None self.ConstEvalOk = 0 # ---- StructGenMixin 字段 ---- self.StructTable = None self.StructCount = 0 self.StdlibAlloc = 0 self.VisibleStructs = None self.StrictVisibility = 0 # OOM 语句级诊断:translate_stmt 限频打印 used(定位单文件翻译暴涨起点) self.DiagStmtCount = 0 # ---- CallGenMixin 字段 ---- self.CexportSha1Arr = None self.CexportFuncArr = None self.CexportCount = 0 self.LLVMIRRegSeq = 0 self.TempDir = None self.TempDirLen = 0 self.ClosureNames = None self.ClosureCount = 0 self.FuncptrNames = None self.FuncptrRets = None self.FuncptrCount = 0 self.GlobalFuncs = None self.GlobalFuncCount = 0 self.GlobalDefaults = None self.GlobalDefaultsCount = 0 # ---- ClassGenMixin 字段 ---- self.MethodMetaKeys = None self.MethodMetaFlags = None self.MethodMetaCount = 0 self.RenumClassNames = None self.RenumClassVariantCounts = None self.RenumVariantNames = None self.RenumVariantTags = None self.RenumClassCount = 0 self.RenumAliasClass = None self.RenumAliasField = None self.RenumAliasIndex = None self.RenumAliasCount = 0 self.SpecKeys = None self.SpecNames = None self.SpecCount = 0 self.GenericClassNames = None self.GenericClassNodes = None self.GenericClassSha1s = None self.GenericClassFiles = None self.GenericClassTpParams = None self.VtFullNames = None self.VtMethodNames = None self.VtParentSha1s = None self.VtMethodCount = 0 # ---- ClassGenBase 补漏字段(阶段 D 拆分新增,此前未初始化: # 结构体是 malloc 分配,未初始化字段是内存垃圾——非 null 垃圾 # 指针能通过 `is not None` 检查,导致 is_exception_name 等查询 # 直接 strcmp 越界崩溃;int 垃圾则导致循环次数失控) ---- self.RenumAliasTy = None self.RenumAliasVariant = None self.ClassMetaKinds = None self.ClassMetaClss = None self.ClassMetaFields = None self.ClassMetaCount = 0 self.DecoratorFuncCount = 0 self.DecoratorFuncNames = None self.DecoratorWrapNames = None self.DecoratorArgs = None # 异常类注册表(_ensure_exception_tables 仍保留懒分配,但 # ExceptionNames 必须初始化为 null——否则 `is not None` 误判垃圾 # 指针为已初始化,跳过分配直接查表 → strcmp 越界) self.ExceptionCount = 0 self.ExceptionNames = None self.ExceptionParents = None self.ExceptionCodes = None self.NextExceptionCode = 0 self._exception_codes_tmp_count = 0 self.GenericSpecDepth = 0 # ---- ImportsGenMixin 字段 ---- self.ReexportSha1s = None self.ReexportFuncs = None self.ReexportSrcs = None self.ReexportCount = 0 # ---- StmtGenMixin 字段 ---- self.CifEvalOk = 0 self.EnumTable = None self.EnumCount = 0 # ---- AssignGenMixin 字段 ---- self.RecoverFound = 0 # ---- ExprGenMixin docstring 字段(__doc__ 魔法属性支持)---- self.DocKeys = None self.DocValues = None self.DocCount = 0 # OOM 诊断计数:跨模块 CDefine 查找调用次数 self.DiagCDefineCount = 0 self.DiagNameValueCount = 0 self.DiagTranslateValueCount = 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