结构体由 mb.alloc 分配,未初始化字段是内存垃圾。异常表字段(ExceptionCount/ExceptionNames/ExceptionParents/ExceptionCodes/NextExceptionCode/_exception_codes_tmp_count)此前未初始化,无用户异常类的项目(如 FuncTest)从不触发 _ensure_exception_tables 懒分配,is_exception_name 里非 null 垃圾指针通过 is not None 检查后 strcmp 越界(ASAN heap-buffer-overflow)。一并补上 RenumAliasTy/RenumAliasVariant/ClassMeta 4 个/Decorator 4 个/GenericSpecDepth 字段。
248 lines
10 KiB
Plaintext
248 lines
10 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.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
|