Files
ViperC/App/lib/core/Gen/Generator.vp
T
TermiNexus a0edc3d961 fix(gen): 泛型 type_params 生命周期与无注解赋值 annot 推断
- ClassGenMixin: list[str](pool, 8) elem_size 修正(原 4 致 Pair[T1,T2]
  重叠写),新增 GenericClassTpParams stdlib 深拷贝表,特化统一取深拷贝
- Generator: 初始化 GenericClassTpParams 防 0xBEBEBEBEBEBEBEBE
- TypeGenMixin: 泛型上下文栈式管理,支持嵌套特化
- CallGenMixin: sz_builtin 补 double/float/char,修复 T.__sizeof__ NameError
- StubMerger: _CommentOutGlobalInBuf 循环注释同名全局,修复 @_mbuddy 重复定义
- HandlesAssign: 无注解赋值按 RHS 推断 AnnotClassName(类实例化/源变量/
  运算符重载/字段注解/方法返回注解 vpi),修复联合类型 Ptr(i8) 属性访问失败
2026-08-13 17:31:54 +08:00

164 lines
6.1 KiB
Plaintext
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
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.StructGenMixin as StructGenMixin
import lib.core.Gen.ExprGenMixin as ExprGenMixin
import lib.core.Gen.CallGenMixin as CallGenMixin
import lib.core.Gen.FuncGenMixin as FuncGenMixin
import lib.core.Gen.ClassGenMixin as ClassGenMixin
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,
StructGenMixin.StructGenMixin, ExprGenMixin.ExprGenMixin,
CallGenMixin.CallGenMixin, FuncGenMixin.FuncGenMixin,
ClassGenMixin.ClassGenMixin, 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
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
# ---- 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.GenericClassTpParams = None
self.VtFullNames = None
self.VtMethodNames = None
self.VtParentSha1s = None
self.VtMethodCount = 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
# ============================================================
# 全局生成器单例(对象化 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