docs: add loop canonicalizer SSOT + MirBuilder entrypoint

This commit is contained in:
nyash-codex
2025-12-16 04:37:47 +09:00
parent 990d00393e
commit 84ded8ca6c
10 changed files with 180 additions and 54 deletions

View File

@ -8,7 +8,7 @@
- **Phase 133**: Promoted carrier join_idTrim修正
- **Phase 134**: Plugin loader best-effort loading
- **Phase 135**: ConditionLoweringBox allocator SSOTValueId 衝突の根治)
- **Phase 136**: ValueId allocator SSOT 徹底(残存 value_gen.next() 掃討)
- **Phase 136**: MirBuilder Context SSOT 化(+ ValueId allocator 掃討)
## Phase フォルダ構成(推奨)

View File

@ -1,19 +1,27 @@
# Phase 136: ValueId allocator SSOT 徹底(残存 value_gen.next() 掃討)
# Phase 136: MirBuilder Context SSOT 化(+ ValueId allocator 掃討)
## Status
- 状態: ✅ P0 完了
- スコープ: 関数内 ValueId 発行を `MirBuilder::next_value_id()` に一本化し、予約PHI/引数/ローカルとの衝突余地を消す
- 状態: ✅ Done
- スコープ:
- MirBuilder の状態を Contextへ分割し、状態の SSOT を Context に一本化する
- 併せて、関数内 ValueId 発行を `MirBuilder::next_value_id()` に一本化し、予約PHI/引数/ローカルとの衝突余地を消す
## Problem
Phase 135 で契約allocator SSOTは固まったが、一部のコードで `builder.value_gen.next()` を直接使用していた。
これは関数内で走る場合、予約PHI dst や関数引数との ValueId 衝突を引き起こす可能性がある。
MirBuilder が肥大化し、以下が同時に起きやすい状態だった:
- 状態の置き場所が分散し、変更者が「何を触っているか」を追いづらい
- ValueId の発行が局所的に `value_gen.next()` へ逃げると、関数内で衝突しうるPhase 135 の契約を破りやすい)
## Fix
### SSOT 化対象
1. **`src/mir/builder.rs:new_typed_value()`** - 型付きValueId発行API
- Before: `let id = self.value_gen.next();`
- After: `let id = self.next_value_id();` (関数コンテキストを尊重)
### 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()` を唯一入口に統一。
2. **テストコード内の `value_gen.next()`** - 関数スコープをシミュレート
- `test_shadowing_binding_restore`: 関数スコープシミュレーションで `next_value_id()` を使用
@ -27,10 +35,10 @@ Phase 135 で契約allocator SSOTは固まったが、一部のコード
- `src/mir/utils/phi_helpers.rs:insert_phi_unified()` - 69行目
## Acceptance
-`rg -n "value_gen\.next\(" src/mir` で関数内経路から消える
-`cargo test --release --lib` - 997 passed
-`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残課題
なし。全ての関数内経路から `value_gen.next()` を排除完了。Module context のフォールバックは意図的に残す。
なし。状態は Context に一本化され、関数内経路から `value_gen.next()` を排除完了。Module context のフォールバックは意図的に残す。