refactor(joinir): Phase 286C-2 - RewriteContext state consolidation
- Create RewriteContext struct to consolidate 11 scattered state variables - Add 4 helper Boxes: InstructionFilterBox, ParameterBindingBox, ReturnConverterBox, TailCallDetectorBox - Reduce instruction_rewriter.rs cognitive overhead via centralized state API - All state mutations now go through consistent RewriteContext methods Changes: - New: rewrite_context.rs (94 lines) - State consolidation SSOT - New: 4 helper Box modules (instruction_filter, parameter_binding, return_converter, tail_call_detector) - Modified: instruction_rewriter.rs (1454 → 1421 lines) - Modified: rewriter/mod.rs (export RewriteContext) Benefits: - State tracking simplified (11 variables → 1 context object) - Clearer intent via API methods (add_exit_phi_input vs push) - Foundation for future refactoring (Phase 286C-2.1: 3-stage pipeline) - Zero functionality changes (pure refactoring) Build: cargo build --release ✅ 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
This commit is contained in:
@ -1,6 +1,6 @@
|
||||
# Phase 286: JoinIR Line Absorption(JoinIR→CorePlan/Frag 収束)
|
||||
|
||||
Status: Planned (design-first)
|
||||
Status: In Progress (P0, P1, P3, 286C-2 COMPLETE; P2 pending)
|
||||
|
||||
## Goal
|
||||
|
||||
@ -93,6 +93,54 @@ Phase 286 では JoinIR line を “第2の lowerer” として放置せず、*
|
||||
- 代表 1 パターン(例: Pattern4)を "JoinIR 生成 → CorePlan/Frag" に変換する PoC
|
||||
- 目的: merge を通さずに `emit_frag()` 経由で終端が生成できることの証明
|
||||
|
||||
### P3 (error context enrichment) ✅ COMPLETE (2025-12-25)
|
||||
|
||||
**完了内容**:
|
||||
- **P2**: host_fn をエラーコンテキストに追加(関数名での特定を容易に)
|
||||
- **P3**: join-side 情報(continuation数・boundaryサマリ)をエラーコンテキストに追加
|
||||
- `[conts=X exits=Y conds=Z]` 形式のサマリを追加
|
||||
- 固定キー名で解析容易に
|
||||
|
||||
**成果物**:
|
||||
- `src/mir/builder/control_flow/joinir/merge/mod.rs` (変更)
|
||||
- 最終エラーフォーマット: `[merge_joinir_mir_blocks host=X join=Y [conts=A exits=B conds=C]]`
|
||||
|
||||
### 286C-2 (instruction_rewriter.rs 箱化) ✅ COMPLETE (2025-12-25)
|
||||
|
||||
**完了内容**:
|
||||
- **instruction_rewriter.rs の箱化・意味論不変**: 1400行ファイルに責務リストコメントを追加し、4つの箱モジュールを抽出
|
||||
- **InstructionFilterBox**: Skip判定ロジック(純粋関数)
|
||||
- `should_skip_copy_overwriting_phi()` - CopyがPHI dstを上書きするか判定
|
||||
- `should_skip_function_name_const()` - Const String(関数名)のスキップ判定
|
||||
- `should_skip_boundary_input_const()` - Boundary input Constのスキップ判定
|
||||
- **ReturnConverterBox**: Return→Jump変換ヘルパー
|
||||
- `should_keep_return()` - 非スキップ可能継続のReturn保持判定
|
||||
- `remap_return_value()` - Return値のremapヘルパー
|
||||
- **TailCallDetectorBox**: テイルコール検出ヘルパー
|
||||
- `is_recursive_call()` - 再帰呼び出し判定
|
||||
- `is_loop_entry_call()` - ループエントリ呼び出し判定
|
||||
- `should_skip_param_binding()` - パラメータ束縛スキップ判定
|
||||
- `call_type_description()` - 呼び出しタイプの説明文字列取得
|
||||
- **ParameterBindingBox**: パラメータ束縛ヘルパー
|
||||
- `should_skip_phi_param()` - PHI dstパラメータのスキップ判定
|
||||
- `carrier_param_count()` - キャリアパラメータ数取得
|
||||
- `has_more_carrier_args()` - キャリア引数残確認
|
||||
- `carrier_arg_index()` - キャリア引数インデックス計算
|
||||
|
||||
**成果物**:
|
||||
- `src/mir/builder/control_flow/joinir/merge/rewriter/instruction_filter_box.rs` (新規)
|
||||
- `src/mir/builder/control_flow/joinir/merge/rewriter/return_converter_box.rs` (新規)
|
||||
- `src/mir/builder/control_flow/joinir/merge/rewriter/tail_call_detector_box.rs` (新規)
|
||||
- `src/mir/builder/control_flow/joinir/merge/rewriter/parameter_binding_box.rs` (新規)
|
||||
- `src/mir/builder/control_flow/joinir/merge/instruction_rewriter.rs` (変更: 責務リストコメント追加 + 箱使用)
|
||||
- `src/mir/builder/control_flow/joinir/merge/rewriter/mod.rs` (変更: モジュール追加)
|
||||
|
||||
**注意点**:
|
||||
- 意味論は完全不変(既存のinlineロジックを箱関数呼び出しに置換)
|
||||
- ファイル行数は1454行に増加(コメント・import追加により)
|
||||
- 核ロジックは main loop に密結合しているため、完全な分離にはさらなるリファクタリングが必要
|
||||
- スモークテスト: 既存FAILなし(1件のemit失敗は本変更と無関係)
|
||||
|
||||
## Acceptance(P0)
|
||||
|
||||
- 2本の lowering が “設計として” どこで 1 本に収束するかが明文化されている
|
||||
|
||||
Reference in New Issue
Block a user