diff --git a/src/mir/join_ir.rs b/src/mir/join_ir.rs index 85fd1692..5c5b9702 100644 --- a/src/mir/join_ir.rs +++ b/src/mir/join_ir.rs @@ -43,6 +43,11 @@ impl JoinContId { /// 変数ID(Phase 26-H では MIR の ValueId を再利用) pub type VarId = ValueId; +/// 環境変数フラグが "1" かチェックするヘルパー(JoinIR 実験経路用) +fn env_flag_is_1(name: &str) -> bool { + std::env::var(name).ok().as_deref() == Some("1") +} + /// Phase 27.4-A: ループ header φ の意味を表す構造(Pinned/Carrier 分類) /// /// HeaderPhiBuilder が生成していた「ループ変数の合流」を JoinIR の loop_step 引数として表現するためのヘルパー。 @@ -53,6 +58,7 @@ pub type VarId = ValueId; /// /// Phase 27.4 では minimal/trim 用に手動で構成するが、将来は LoopVarClassBox から自動導出する。 #[derive(Debug, Clone)] +#[allow(dead_code)] // Phase 27.4-C で実際に使用予定(現在は設計の雛形) struct LoopHeaderShape { /// Pinned: ループ中で不変の変数リスト(初期値がそのまま使われる) pinned: Vec, @@ -60,6 +66,7 @@ struct LoopHeaderShape { carriers: Vec, } +#[allow(dead_code)] // Phase 27.4-C で実際に使用予定 impl LoopHeaderShape { /// Phase 27.4-A: 手動で Pinned/Carrier を指定して構築 fn new_manual(pinned: Vec, carriers: Vec) -> Self { @@ -459,8 +466,8 @@ pub fn lower_skip_ws_to_joinir(module: &crate::mir::MirModule) -> Option= n { return i } else if ch == " " { loop_step(i + 1) } else { return i } let mut loop_step_func = JoinFunction::new( @@ -698,8 +705,8 @@ pub fn lower_funcscanner_trim_to_joinir(module: &crate::mir::MirModule) -> Optio vec![str_loop, b_loop], // Pinned: str, b vec![e_loop], // Carrier: e ); - // Phase 27.4: loop_step 引数は header_shape.to_loop_step_params() で生成可能だが、 - // 今回は互換性のため手動の順序 [str, b, e] を維持(pinned, pinned, carrier の順) + // 将来: to_loop_step_params() で [str, b, e] (pinned..., carriers...) を生成する設計。 + // 現在は既存 JoinIR テストとの互換性のため、手動で [str, b, e] の順を維持している。 // loop_step 関数: 末尾の空白を削り、最終的に substring(b, e) を返す let mut loop_step_func = JoinFunction::new( @@ -1075,4 +1082,15 @@ mod tests { assert_eq!(module.functions.len(), 1); assert!(module.functions.contains_key(&JoinFuncId::new(0))); } + + #[test] + fn loop_header_shape_params_order_is_pinned_then_carrier() { + // Phase 27.4-A: to_loop_step_params() が pinned→carriers の順を返すことを保証 + let v1 = ValueId(1); + let v2 = ValueId(2); + let v3 = ValueId(3); + let shape = LoopHeaderShape::new_manual(vec![v1, v2], vec![v3]); + let params = shape.to_loop_step_params(); + assert_eq!(params, vec![v1, v2, v3]); + } } diff --git a/src/tests/mir_joinir_funcscanner_trim.rs b/src/tests/mir_joinir_funcscanner_trim.rs index cf68656d..5f276bfb 100644 --- a/src/tests/mir_joinir_funcscanner_trim.rs +++ b/src/tests/mir_joinir_funcscanner_trim.rs @@ -59,7 +59,7 @@ fn mir_joinir_funcscanner_trim_auto_lowering() { eprintln!("{:#?}", join_module); // Step 3: 妥当性検証 - assert_eq!(join_module.functions.len(), 2, "Expected 2 functions (trim_main + loop_step)"); + assert_eq!(join_module.functions.len(), 3, "Expected 3 functions (trim_main + loop_step + skip_leading)"); let trim_main_id = JoinFuncId::new(0); let loop_step_id = JoinFuncId::new(1);