2025-12-16 04:37:47 +09:00
|
|
|
|
# Phase 136: MirBuilder Context SSOT 化(+ ValueId allocator 掃討)
|
2025-12-15 19:37:30 +09:00
|
|
|
|
|
|
|
|
|
|
## Status
|
2025-12-16 04:37:47 +09:00
|
|
|
|
- 状態: ✅ Done
|
|
|
|
|
|
- スコープ:
|
|
|
|
|
|
- MirBuilder の状態を Context(箱)へ分割し、状態の SSOT を Context に一本化する
|
|
|
|
|
|
- 併せて、関数内 ValueId 発行を `MirBuilder::next_value_id()` に一本化し、予約PHI/引数/ローカルとの衝突余地を消す
|
2025-12-15 19:37:30 +09:00
|
|
|
|
|
|
|
|
|
|
## Problem
|
2025-12-16 04:37:47 +09:00
|
|
|
|
MirBuilder が肥大化し、以下が同時に起きやすい状態だった:
|
|
|
|
|
|
- 状態の置き場所が分散し、変更者が「何を触っているか」を追いづらい
|
|
|
|
|
|
- ValueId の発行が局所的に `value_gen.next()` へ逃げると、関数内で衝突しうる(Phase 135 の契約を破りやすい)
|
2025-12-15 19:37:30 +09:00
|
|
|
|
|
|
|
|
|
|
## Fix
|
|
|
|
|
|
|
2025-12-16 04:37:47 +09:00
|
|
|
|
### 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()` を唯一入口に統一。
|
2025-12-15 19:37:30 +09:00
|
|
|
|
|
|
|
|
|
|
2. **テストコード内の `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
|
2025-12-16 04:37:47 +09:00
|
|
|
|
- ✅ `rg -n "value_gen\.next\(" src/mir` で関数内経路から消える(module context の意図的フォールバックを除く)
|
|
|
|
|
|
- ✅ `cargo test --release --lib` が退行しない
|
2025-12-15 19:37:30 +09:00
|
|
|
|
- ✅ `phase135_trim_mir_verify.sh` - PASS
|
|
|
|
|
|
- ✅ `phase132_exit_phi_parity.sh` - 3/3 PASS
|
|
|
|
|
|
|
|
|
|
|
|
## Remaining Tasks(残課題)
|
2025-12-16 04:37:47 +09:00
|
|
|
|
なし。状態は Context に一本化され、関数内経路から `value_gen.next()` を排除完了。Module context のフォールバックは意図的に残す。
|