feat(joinir): Phase 26-H Step 2完了 - MIR→JoinIR自動変換実装
実装内容: - lower_min_loop_to_joinir() 関数実装(src/mir/join_ir.rs) - 自動変換テスト追加(mir_joinir_min_auto_lowering) - JoinIrMin.main/0 専用の固定変換(Phase 27で一般化予定) 検証結果: ✅ NYASH_JOINIR_EXPERIMENT=1 で自動変換テスト成功 ✅ トグルなしで既存テスト全て green 維持 ✅ ゼロリグレッション確認(367 PASS / 11 FAIL) 生成されるJoinIR構造: - main関数: i_init=0, loop_step(i_init) 呼び出し - loop_step関数: i>=2 比較、ret/再帰呼び出し分岐 Phase 26-H Step 1-3 完全達成!🎉
This commit is contained in:
@ -126,6 +126,67 @@ fn mir_joinir_min_manual_construction() {
|
||||
eprintln!("[joinir/min] ✅ JoinIR型定義は妥当(Phase 26-H)");
|
||||
}
|
||||
|
||||
#[test]
|
||||
#[ignore] // 手動実行用(Phase 26-H 自動変換テスト)
|
||||
fn mir_joinir_min_auto_lowering() {
|
||||
// Phase 26-H Step 2: 自動変換テスト
|
||||
// MIR → JoinIR 自動変換の動作確認
|
||||
|
||||
// 環境変数トグルチェック
|
||||
if std::env::var("NYASH_JOINIR_EXPERIMENT").ok().as_deref() != Some("1") {
|
||||
eprintln!("[joinir/auto] NYASH_JOINIR_EXPERIMENT=1 not set, skipping auto-lowering test");
|
||||
return;
|
||||
}
|
||||
|
||||
// Step 1: MIR までコンパイル
|
||||
std::env::set_var("NYASH_PARSER_STAGE3", "1");
|
||||
std::env::set_var("HAKO_PARSER_STAGE3", "1");
|
||||
|
||||
let test_file = "apps/tests/joinir_min_loop.hako";
|
||||
let src = std::fs::read_to_string(test_file)
|
||||
.unwrap_or_else(|_| panic!("Failed to read {}", test_file));
|
||||
|
||||
let ast: ASTNode = NyashParser::parse_from_string(&src)
|
||||
.expect("joinir_min: parse failed");
|
||||
|
||||
let mut mc = MirCompiler::with_options(false);
|
||||
let compiled = mc.compile(ast).expect("joinir_min: MIR compile failed");
|
||||
|
||||
eprintln!(
|
||||
"[joinir/auto] MIR module compiled, {} functions",
|
||||
compiled.module.functions.len()
|
||||
);
|
||||
|
||||
// Step 2: MIR → JoinIR 自動変換
|
||||
let join_module = lower_min_loop_to_joinir(&compiled.module)
|
||||
.expect("lower_min_loop_to_joinir failed");
|
||||
|
||||
eprintln!("[joinir/auto] JoinIR module generated:");
|
||||
eprintln!("{:#?}", join_module);
|
||||
|
||||
// Step 3: 妥当性検証
|
||||
assert_eq!(join_module.functions.len(), 2, "Expected 2 functions (main + loop_step)");
|
||||
|
||||
let main_id = JoinFuncId::new(0);
|
||||
let loop_step_id = JoinFuncId::new(1);
|
||||
|
||||
// main 関数の検証
|
||||
let main_func = join_module.functions.get(&main_id)
|
||||
.expect("main function not found");
|
||||
assert_eq!(main_func.name, "main");
|
||||
assert_eq!(main_func.params.len(), 0, "main has no parameters");
|
||||
assert!(main_func.body.len() >= 2, "main should have at least 2 instructions (const + call)");
|
||||
|
||||
// loop_step 関数の検証
|
||||
let loop_step_func = join_module.functions.get(&loop_step_id)
|
||||
.expect("loop_step function not found");
|
||||
assert_eq!(loop_step_func.name, "loop_step");
|
||||
assert_eq!(loop_step_func.params.len(), 1, "loop_step has 1 parameter (i)");
|
||||
assert!(loop_step_func.body.len() >= 4, "loop_step should have multiple instructions");
|
||||
|
||||
eprintln!("[joinir/auto] ✅ 自動変換成功(Phase 26-H Step 2)");
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn mir_joinir_min_type_sanity() {
|
||||
// Phase 26-H: 型定義の基本的なサニティチェック(常時実行)
|
||||
|
||||
Reference in New Issue
Block a user