Files
ViperC/App/lib/core/CompilerFactory.vp
T
TermiNexus 8d5dbeab89 feat: 引入 CompilerFactory 永久内存池,1a 每文件 reset 解 NewAstTest OOM
main 创建 512MB perm_pool(MemBuddy 第二实例,永不 reset)并注册
CompilerFactory 工厂(对齐 TPC Translator 装配模式,memhub 保持通用)。
各 Gen Mixin 跨 mark 持久表(struct/枚举/Renum/spec/vtable/全局函数/
闭包/函数指针/Cexport/Reexport/TraceFrames/Doc)全部迁移到 perm_pool,
替代 stdlib.malloc 深拷贝提升速度。

Phase1 1a 主循环(98 includes 全量 parse AST 驻留主 pool → 1GB 耗尽)
改为:StdlibAlloc=1 注册数据进 perm_pool + 每文件翻译完 reset_to(文件级
mark) 回收 AST;1b-pre vpi 预生成循环同样 reset_to(mark1)。同步修 7 处
reset 后悬空隐患:StructTable 表体、add_field DefaultVal、Renum 变体/
别名表内容、vtable full_names 内容、FuncptrRets 深拷贝。

CompilerFactory 类名与模块名同名(合法场景,TPC 已支持模块别名优先)。
2026-08-14 04:02:36 +08:00

69 lines
2.7 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
import memhub
# ============================================================
# CompilerFactory - 编译器结构体工厂(对齐 TPC Translator 装配模式)
#
# TPC 的 Translator 在 __init__ 集中创建编译器各子对象(Handler/
# SymbolTable/Exportable 等),是编译器的"装配器/工厂";TPV 的 main
# 目前手动创建 mb/gen 并逐模块注入(_mbuddy/set_global_gen),装配
# 逻辑散落。本工厂集中持有编译器级共享内存对象:
#
# - Pool :主内存池(MemBuddy,瞬时数据,受 mark/reset_to 回收)
# - PermPool :永久内存池(MemBuddy,跨 mark 持久数据专用,从不 reset)
#
# 各模块经模块级委托 CompilerFactory.get_perm_pool() 获取永久池,
# 避免把编译器专属单例塞进通用内存库 memhub(memhub 保持通用)。
# includes 层(llvmlite/__types.vp 的 DeepCopyType)不依赖本工厂:
# 深拷贝的分配源由调用方以 pool 参数传入(传 PermPool 即持久)。
# 类名与模块名同名(均为 CompilerFactory):合法场景,TPC 已支持
# 模块别名优先解析——`X.func()` 中 X 是 import 别名(IsModuleAlias)
# 时按模块函数处理,`X.X(args)` 的类构造按 FuncAttr==类名 走 struct
# 路径,二者互不冲突(勿再改类名规避,见用户明确要求)。
# ============================================================
@t.NoVTable
class CompilerFactory:
"""编译器结构体工厂(持有主池/永久池等共享对象)"""
Pool: memhub.MemBuddy | t.CPtr # 主内存池(瞬时数据,mark/reset 回收)
PermPool: memhub.MemBuddy | t.CPtr # 永久内存池(持久数据,从不 reset)
def __init__(self, pool: memhub.MemBuddy | t.CPtr,
perm_pool: memhub.MemBuddy | t.CPtr):
if self is None:
return
self.Pool = pool
self.PermPool = perm_pool
# ============================================================
# 全局工厂单例
# ============================================================
_g_factory: CompilerFactory | t.CPtr = None
def set_factory(factory: CompilerFactory | t.CPtr) -> None:
"""注册全局工厂单例(main 创建后注册)"""
global _g_factory
_g_factory = factory
def get_factory() -> CompilerFactory | t.CPtr:
"""获取全局工厂单例(未注册返回 None)"""
return _g_factory
def get_pool() -> memhub.MemBuddy | t.CPtr:
"""获取主内存池(瞬时数据分配源)"""
if _g_factory is not None:
return _g_factory.Pool
return None
def get_perm_pool() -> memhub.MemBuddy | t.CPtr:
"""获取永久内存池(跨 mark 持久数据分配源)"""
if _g_factory is not None:
return _g_factory.PermPool
return None