feat(joinir): Phase 200-B/C/D capture analysis + Phase 201-A reserved_value_ids infra
Phase 200-B: FunctionScopeCaptureAnalyzer implementation - analyze_captured_vars_v2() with structural loop matching - CapturedEnv for immutable function-scope variables - ParamRole::Condition for condition-only variables Phase 200-C: ConditionEnvBuilder extension - build_with_captures() integrates CapturedEnv into ConditionEnv - fn_body propagation through LoopPatternContext to Pattern 2 Phase 200-D: E2E verification - capture detection working for base, limit, n etc. - Test files: phase200d_capture_minimal.hako, phase200d_capture_in_condition.hako Phase 201-A: MirBuilder reserved_value_ids infrastructure - reserved_value_ids: HashSet<ValueId> field in MirBuilder - next_value_id() skips reserved IDs - merge/mod.rs sets/clears reserved IDs around JoinIR merge Phase 201: JoinValueSpace design document - Param/Local/PHI disjoint regions design - API: alloc_param(), alloc_local(), reserve_phi() - Migration plan for Pattern 1-4 lowerers 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
This commit is contained in:
@ -208,6 +208,47 @@ JoinIR ラインで守るべきルールを先に書いておくよ:
|
||||
|
||||
### 2.3 キャリア / Exit / Boundary ライン
|
||||
|
||||
- **Phase 200-B: FunctionScopeCaptureAnalyzer (完了)**
|
||||
- ファイル: `src/mir/loop_pattern_detection/function_scope_capture.rs`
|
||||
- 責務: 関数スコープの「実質定数」を検出
|
||||
- 判定条件:
|
||||
1. 関数トップレベルで 1 回だけ定義
|
||||
2. ループ内で再代入なし
|
||||
3. 安全な初期式(文字列/整数リテラル)のみ
|
||||
- 結果: CapturedEnv に name, host_id, is_immutable を格納
|
||||
- **ConditionEnvBuilder v2**:
|
||||
- 責務: CapturedEnv から ParamRole::Condition として ConditionEnv に追加
|
||||
- 経路: analyze_captured_vars → build_with_captures → ConditionEnv.captured
|
||||
- 不変条件: Condition role は Header PHI / ExitLine の対象にならない
|
||||
- **Pattern 2 統合**: Phase 200-C で完了 ✅
|
||||
- MirBuilder.fn_body_ast フィールド追加
|
||||
- LoopPatternContext.fn_body 経由で Pattern 2 lowerer に渡す
|
||||
- analyze_captured_vars_v2() で構造的ループ検索(ポインタ比較 → AST 構造比較)
|
||||
|
||||
- **Phase 200-C: digits.indexOf E2E 連携 (完了)**
|
||||
- 目的: 200-A/B インフラを実際に Pattern 2 経路に統合
|
||||
- 実装:
|
||||
- fn_body を MirBuilder → LoopPatternContext → Pattern 2 に渡す
|
||||
- analyze_captured_vars_v2() で構造的マッチング(AST Debug 文字列比較)
|
||||
- digits / s 等の関数ローカル定数が CapturedEnv に正しく捕捉される
|
||||
- 検証結果:
|
||||
- capture 検出: ✅ PASS
|
||||
- E2E 実行: ❌ BLOCKED(テストケースが Pattern 5+ 必要)
|
||||
- テストケース制約:
|
||||
- phase200_digits_atoi_min.hako: body-local `pos` を条件 `if pos < 0` で使用
|
||||
- → Pattern 5 (body-local promotion) が必要
|
||||
|
||||
- **Phase 200-D: digits capture "実戦 1 本" 検証 (完了)**
|
||||
- 目的: capture 経路の E2E 検証(body-local なしのシンプルケース)
|
||||
- 検証結果:
|
||||
- capture 検出: ✅ PASS(base, limit, n 等が正しく CapturedEnv に)
|
||||
- ConditionEnv 統合: ✅ PASS(captured vars が ConditionEnv.captured に追加)
|
||||
- 実行: ⚠️ 別の制約でブロック(substring 未対応、キャリア更新型問題)
|
||||
- 成果:
|
||||
- capture 経路(analyze_captured_vars_v2 → ConditionEnv → Pattern 2)が正常動作
|
||||
- 関数スコープ定数が正しく検出・統合される
|
||||
- テストファイル: phase200d_capture_minimal.hako, phase200d_capture_in_condition.hako
|
||||
|
||||
- **CarrierInfo / LoopUpdateAnalyzer / CarrierUpdateEmitter**
|
||||
- ファイル:
|
||||
- `src/mir/join_ir/lowering/carrier_info.rs`
|
||||
|
||||
Reference in New Issue
Block a user