refactor(mir): loop_builder.rs モジュール化 - 6ファイルに分割
## リファクタリング内容
### ファイル構造変更
- `src/mir/loop_builder.rs` (1515行) 削除
- `src/mir/loop_builder/` ディレクトリ新設(6ファイル、1529行)
### 新規モジュール構成
1. **mod.rs** (6,293行 → 実際は約150行)
- モジュール定義とre-export
- LoopBuilder構造体定義
2. **loop_form.rs** (25,988行 → 実際は約650行)
- メインループlowering pipeline
- デバッグ/実験フラグ集約
3. **if_lowering.rs** (15,600行 → 実際は約390行)
- In-loop if lowering with JoinIR/PHI bridge
- **Phase 61-2コード完全保持**:
- JoinIR dry-run検証モード
- PhiSpec計算とA/B比較
4. **phi_ops.rs** (12,844行 → 実際は約320行)
- PHI emit helpers
- LoopFormOps/PhiBuilderOps impls
5. **control.rs** (4,261行 → 実際は約107行)
- break/continue capture
- predecessor bookkeeping
6. **statements.rs** (1,673行 → 実際は約42行)
- loop-body statement lowering entry point
7. **README.md** (752行 → 実際は約19行)
- モジュール責務とサブモジュール説明
### 設計原則
- **責務分離**: CFG構築/PHI生成/制御フロー/文処理を分離
- **Phase 61-2保持**: if_lowering.rsにJoinIR dry-run完全移行
- **phi_core委譲**: PHI構築ロジックは`phi_core`に委譲
## テスト結果
- Phase 61-2テスト: ✅ 2/2 PASS(dry-runフラグ、PhiSpec)
- loopformテスト: ✅ 14/14 PASS(退行なし)
- ビルド: ✅ 成功(エラー0件)
## 統計
- **純削減**: -1,521行(25ファイル変更)
- **loop_builder**: 1515行 → 1529行(+14行、6ファイル化)
- **可読性**: 巨大単一ファイル → 責務別モジュール
## ChatGPT設計・Claude確認
大規模リファクタリングをChatGPTが実施、Claudeが検証完了。
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
@ -81,10 +81,16 @@ impl super::MirBuilder {
|
||||
// Note: Arity does NOT include implicit `me` receiver
|
||||
let is_target = match func_name.as_str() {
|
||||
"JsonTokenizer.print_tokens/0" => {
|
||||
std::env::var("HAKO_JOINIR_PRINT_TOKENS_MAIN").ok().as_deref() == Some("1")
|
||||
std::env::var("HAKO_JOINIR_PRINT_TOKENS_MAIN")
|
||||
.ok()
|
||||
.as_deref()
|
||||
== Some("1")
|
||||
}
|
||||
"ArrayExtBox.filter/2" => {
|
||||
std::env::var("HAKO_JOINIR_ARRAY_FILTER_MAIN").ok().as_deref() == Some("1")
|
||||
std::env::var("HAKO_JOINIR_ARRAY_FILTER_MAIN")
|
||||
.ok()
|
||||
.as_deref()
|
||||
== Some("1")
|
||||
}
|
||||
_ => false,
|
||||
};
|
||||
@ -133,10 +139,10 @@ impl super::MirBuilder {
|
||||
debug: bool,
|
||||
) -> Result<Option<ValueId>, String> {
|
||||
use super::loop_frontend_binding::LoopFrontendBinding;
|
||||
use crate::r#macro::ast_json::ast_to_json;
|
||||
use crate::mir::join_ir::frontend::{AstToJoinIrLowerer, JoinFuncMetaMap};
|
||||
use crate::mir::join_ir_vm_bridge::convert_join_module_to_mir_with_meta;
|
||||
use crate::mir::types::ConstValue;
|
||||
use crate::r#macro::ast_json::ast_to_json;
|
||||
|
||||
// Phase 50: Create appropriate binding based on function name
|
||||
let binding = match func_name {
|
||||
@ -156,16 +162,13 @@ impl super::MirBuilder {
|
||||
if debug {
|
||||
eprintln!(
|
||||
"[cf_loop/joinir] Using binding: counter={}, acc={:?}, pattern={:?}",
|
||||
binding.counter_var,
|
||||
binding.accumulator_var,
|
||||
binding.pattern
|
||||
binding.counter_var, binding.accumulator_var, binding.pattern
|
||||
);
|
||||
}
|
||||
|
||||
// Step 1: Convert condition and body to JSON
|
||||
let condition_json = ast_to_json(condition);
|
||||
let mut body_json: Vec<serde_json::Value> =
|
||||
body.iter().map(|s| ast_to_json(s)).collect();
|
||||
let mut body_json: Vec<serde_json::Value> = body.iter().map(|s| ast_to_json(s)).collect();
|
||||
|
||||
// Phase 50: Rename variables in body (e.g., "out" → "acc" for filter)
|
||||
binding.rename_body_variables(&mut body_json);
|
||||
@ -192,7 +195,10 @@ impl super::MirBuilder {
|
||||
continue;
|
||||
}
|
||||
if debug {
|
||||
eprintln!("[cf_loop/joinir] Adding '{}' to params (external_ref)", ext_ref);
|
||||
eprintln!(
|
||||
"[cf_loop/joinir] Adding '{}' to params (external_ref)",
|
||||
ext_ref
|
||||
);
|
||||
}
|
||||
params.push(serde_json::json!(ext_ref));
|
||||
}
|
||||
@ -370,7 +376,8 @@ impl super::MirBuilder {
|
||||
}
|
||||
|
||||
// 3. Collect all ValueIds used in JoinIR function
|
||||
let mut used_values: std::collections::BTreeSet<ValueId> = std::collections::BTreeSet::new();
|
||||
let mut used_values: std::collections::BTreeSet<ValueId> =
|
||||
std::collections::BTreeSet::new();
|
||||
for block in join_func.blocks.values() {
|
||||
Self::collect_values_in_block(block, &mut used_values);
|
||||
}
|
||||
@ -420,7 +427,9 @@ impl super::MirBuilder {
|
||||
);
|
||||
}
|
||||
}
|
||||
MirInstruction::Jump { target: exit_block_id }
|
||||
MirInstruction::Jump {
|
||||
target: exit_block_id,
|
||||
}
|
||||
}
|
||||
_ => Self::remap_instruction(term, &value_map, &block_map),
|
||||
};
|
||||
@ -503,7 +512,9 @@ impl super::MirBuilder {
|
||||
values.insert(*value);
|
||||
values.insert(*ptr);
|
||||
}
|
||||
MirInstruction::Call { dst, func, args, .. } => {
|
||||
MirInstruction::Call {
|
||||
dst, func, args, ..
|
||||
} => {
|
||||
if let Some(d) = dst {
|
||||
values.insert(*d);
|
||||
}
|
||||
@ -512,7 +523,9 @@ impl super::MirBuilder {
|
||||
values.insert(*arg);
|
||||
}
|
||||
}
|
||||
MirInstruction::BoxCall { dst, box_val, args, .. } => {
|
||||
MirInstruction::BoxCall {
|
||||
dst, box_val, args, ..
|
||||
} => {
|
||||
if let Some(d) = dst {
|
||||
values.insert(*d);
|
||||
}
|
||||
@ -595,24 +608,39 @@ impl super::MirBuilder {
|
||||
value: remap_value(*value),
|
||||
ptr: remap_value(*ptr),
|
||||
},
|
||||
MirInstruction::Call { dst, func, callee, args, effects } => MirInstruction::Call {
|
||||
MirInstruction::Call {
|
||||
dst,
|
||||
func,
|
||||
callee,
|
||||
args,
|
||||
effects,
|
||||
} => MirInstruction::Call {
|
||||
dst: dst.map(remap_value),
|
||||
func: remap_value(*func),
|
||||
callee: callee.clone(),
|
||||
args: args.iter().map(|a| remap_value(*a)).collect(),
|
||||
effects: *effects,
|
||||
},
|
||||
MirInstruction::BoxCall { dst, box_val, method, method_id, args, effects } => {
|
||||
MirInstruction::BoxCall {
|
||||
dst: dst.map(remap_value),
|
||||
box_val: remap_value(*box_val),
|
||||
method: method.clone(),
|
||||
method_id: *method_id,
|
||||
args: args.iter().map(|a| remap_value(*a)).collect(),
|
||||
effects: *effects,
|
||||
}
|
||||
}
|
||||
MirInstruction::Branch { condition, then_bb, else_bb } => MirInstruction::Branch {
|
||||
MirInstruction::BoxCall {
|
||||
dst,
|
||||
box_val,
|
||||
method,
|
||||
method_id,
|
||||
args,
|
||||
effects,
|
||||
} => MirInstruction::BoxCall {
|
||||
dst: dst.map(remap_value),
|
||||
box_val: remap_value(*box_val),
|
||||
method: method.clone(),
|
||||
method_id: *method_id,
|
||||
args: args.iter().map(|a| remap_value(*a)).collect(),
|
||||
effects: *effects,
|
||||
},
|
||||
MirInstruction::Branch {
|
||||
condition,
|
||||
then_bb,
|
||||
else_bb,
|
||||
} => MirInstruction::Branch {
|
||||
condition: remap_value(*condition),
|
||||
then_bb: remap_block(*then_bb),
|
||||
else_bb: remap_block(*else_bb),
|
||||
@ -634,7 +662,11 @@ impl super::MirBuilder {
|
||||
dst: remap_value(*dst),
|
||||
src: remap_value(*src),
|
||||
},
|
||||
MirInstruction::NewBox { dst, box_type, args } => MirInstruction::NewBox {
|
||||
MirInstruction::NewBox {
|
||||
dst,
|
||||
box_type,
|
||||
args,
|
||||
} => MirInstruction::NewBox {
|
||||
dst: remap_value(*dst),
|
||||
box_type: box_type.clone(),
|
||||
args: args.iter().map(|a| remap_value(*a)).collect(),
|
||||
|
||||
Reference in New Issue
Block a user