2.5 KiB
2.5 KiB
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.rssrc/mir/builder/*_context.rs- 読む入口:
src/mir/builder/README.md
2) ValueId allocator の SSOT 徹底(関数内経路の掃討)
- 例:
src/mir/builder.rs:new_typed_value()はself.next_value_id()を唯一入口に統一。
- テストコード内の
value_gen.next()- 関数スコープをシミュレートtest_shadowing_binding_restore: 関数スコープシミュレーションでnext_value_id()を使用test_valueid_binding_parallel_allocation: SSOT allocator を使用(Module context フォールバック維持)
OK(Module 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 のフォールバックは意図的に残す。