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 已支持模块别名优先)。
69 lines
2.7 KiB
Plaintext
69 lines
2.7 KiB
Plaintext
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
|