- 10 个 Handler 类主方法迁入 Gen:Assign/AnnAssign/AugAssign→AssignGenMixin, If/While/For/Return→StmtGenCifMixin,Match→新建 MatchGenMixin(注册 Generator MRO), Imports→ImportsGenMixin;方法体 self.Trans→trans,签名加 trans 首参 - 分派改:StmtGenMixin.translate_stmt 同链 self.translate_xxx + 跨链经 Handles 委托壳 (NoVTable 静态绑定约束);ExprCall 分派改走 ExprCallCall 壳 - 清理:HandlesTranslator 删 11 个 Handler 字段与 _init_state 创建段; StmtGenCifMixin 删 5 个 NewXxxHandle 工厂;main/BuildPipeline 补 HandlesAssign._g_gen 注入 - 委托壳保留:跨 Mixin 桥(Assign/AnnAssign/AugAssign/Match/Imports)待编译器缺陷修复后删
234 lines
9.8 KiB
Plaintext
234 lines
9.8 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.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.MatchGenMixin as MatchGenMixin
|
|
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, MatchGenMixin.MatchGenMixin,
|
|
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 兼容层)
|
|
# ============================================================
|
|
_g_gen: Generator | t.CPtr = None
|