str() 对整数(sizet/i64)走 snprintf 十进制格式化(Python 语义),不是 i8* 强转;用它读 sizet|t.CPtr 联合表元素再 strcmp 永不相等 => _is_renum_class_name 恒 0、变体名查不到(__types.vp:407 bits / :159 Void 根因)。IR 实证 output/a8891afb66d3eda4.text.ll L5551-5558。 - ClassGenEnum: RenumClassNames/RenumVariantNames 读侧统一改 (str)(t.CVoid(x, t.CPtr));新增 _is_renum_by_entry 与 RenumTableDump;REnum 注册静默早退改 fail-fast - MatchGenMixin/CallGenMixin: match 分派 2a/2b 与变体构造入口并上 by_entry 判据 - TypeGenResolve: 泛型下标 Phase B 解析不出特化时 fail-fast - CallGenProp: 泛型特化名末段按括号外点切分 - CompilerFactory/ClassGenBase: REnum 注册表改挂编译期单例 - ClassGenDef: CEnum/REnum 分派歧义 fail-fast
47 lines
2.4 KiB
Plaintext
47 lines
2.4 KiB
Plaintext
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
|