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 已支持模块别名优先)。
This commit is contained in:
1 parent
c27a1ba347
commit
8d5dbeab89
14 files changed
+981
-115
No files matched your search
@@ -0,0 +1,68 @@
|
||||
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
|
||||
Reference in new issue
Block a user