Files
hakorune/docs/development/current/main/phases/phase-136/README.md

2.5 KiB
Raw Blame History

Phase 136: MirBuilder Context SSOT 化(+ ValueId allocator 掃討)

Status

  • 状態: Done
  • スコープ:
    • MirBuilder の状態を Contextへ分割し、状態の SSOT を Context に一本化する
    • 併せて、関数内 ValueId 発行を MirBuilder::next_value_id() に一本化し、予約PHI/引数/ローカルとの衝突余地を消す

Problem

MirBuilder が肥大化し、以下が同時に起きやすい状態だった:

  • 状態の置き場所が分散し、変更者が「何を触っているか」を追いづらい
  • ValueId の発行が局所的に value_gen.next() へ逃げると、関数内で衝突しうるPhase 135 の契約を破りやすい)

Fix

1) Context 分割(状態の SSOT を一本化)

  • Type/Core/Scope/Binding/Variable/Metadata/Compilation の 7 Context へ分割し、二重管理sync helpersを撤去。
  • 入口:
    • src/mir/builder/context.rs
    • src/mir/builder/*_context.rs
    • 読む入口: src/mir/builder/README.md

2) ValueId allocator の SSOT 徹底(関数内経路の掃討)

  • 例: src/mir/builder.rs:new_typed_value()self.next_value_id() を唯一入口に統一。
  1. テストコード内の value_gen.next() - 関数スコープをシミュレート
    • test_shadowing_binding_restore: 関数スコープシミュレーションで next_value_id() を使用
    • test_valueid_binding_parallel_allocation: SSOT allocator を使用Module context フォールバック維持)

OKModule context フォールバック)

以下は既に if current_function.is_some() で関数コンテキストを判定しており、Module context のフォールバックとして value_gen.next() を使用OK

  • src/mir/builder/utils.rs:next_value_id() - SSOT allocator 自体43行目
  • src/mir/builder/utils.rs:pin_to_slot() - 436行目
  • src/mir/builder/utils.rs:materialize_local() - 467行目
  • src/mir/utils/phi_helpers.rs:insert_phi_unified() - 69行目

Acceptance

  • rg -n "value_gen\.next\(" src/mir で関数内経路から消えるmodule context の意図的フォールバックを除く)
  • cargo test --release --lib が退行しない
  • phase135_trim_mir_verify.sh - PASS
  • phase132_exit_phi_parity.sh - 3/3 PASS

Remaining Tasks残課題

なし。状態は Context に一本化され、関数内経路から value_gen.next() を排除完了。Module context のフォールバックは意図的に残す。