import t, c import memhub # ============================================================ # CompilerFactory - 编译器结构体工厂(对齐 TPC Translator 装配模式) # ============================================================ @t.NoVTable class CompilerFactory: """编译器结构体工厂(持有主池/永久池等共享对象)""" Pool: rowptr[memhub.MemBuddy] # 主内存池(瞬时数据,mark/reset 回收) PermPool: rowptr[memhub.MemBuddy] # 永久内存池(持久数据,从不 reset) # ---- REnum 变体注册表(编译期单例持有,跨 Generator/Phase 存活)---- # [D30 根治] 此前这 4 张表是 ClassGenBase 的**实例字段**,被 InitClassGen # 在每个 Generator 构造时清零;而 struct entry 在 perm_pool 跨 Phase 存活。 # 两者寿命不对称 ⇒ 新 Generator 建好后表被清空、struct 仍在 ⇒ # _translate_renum_def 命中 existing 早退 → 变体表永久缺该类 → # _is_renum_class_name 恒 0 → match 走 _handle_simple_match(无变体绑定)→ # case 绑定名 NameError(includes/llvmlite/__types.vp L407 `bits` 根因)。 # 表内存本就是 perm_pool 分配(设计上就是持久的),故把**指针与计数** # 一并挂到编译期单例 factory 上,与 struct entry 同寿命。 RenumClassNames: sizet | t.CPtr RenumClassVariantCounts: sizet | t.CPtr RenumVariantNames: sizet | t.CPtr RenumVariantTags: sizet | t.CPtr RenumClassCount: int # ---- REnum 变体字段别名表(同上,必须同寿命)---- # _bind_variant_fields 靠 _lookup_renum_member_ty 查这些表拿到字段真实类型; # 表被清 → 类型槽 0 → 绑定回退 payload 槽位 i64 → 指针字段被当整数读 → # 递归传参/赋值 int→ptr 被拦(llvmlite __types.vp L448 CastError 根因)。 RenumAliasClass: sizet | t.CPtr RenumAliasField: sizet | t.CPtr RenumAliasIndex: sizet | t.CPtr RenumAliasTy: sizet | t.CPtr RenumAliasVariant: sizet | t.CPtr RenumAliasCount: int def __init__(self, pool: rowptr[memhub.MemBuddy], perm_pool: rowptr[memhub.MemBuddy]): if self is None: return self.Pool = pool self.PermPool = perm_pool # 全局工厂单例 factory: rowptr[CompilerFactory] = None