Files
ViperC/App/lib/core/CompilerFactory.vp
T
TermiNexus eef84657a1 fix(tpv): 修正 REnum 表按名查找与 match 分派,恢复 str() 指针强转
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
2026-09-12 23:14:23 +08:00

47 lines
2.4 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 装配模式)
# ============================================================
@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