Files
hakorune/src/tests/joinir_runner_min.rs

147 lines
5.4 KiB
Rust
Raw Normal View History

// JoinIR 実験ランナーの A/B 比較テストskip_ws / trim_min
//
// 目的:
// - JoinIR を実際に実行し、既存 VM の結果と一致することを確認する
// - Phase 27.2 のブリッジ実装を env トグル付きで検証する
use crate::ast::ASTNode;
use crate::backend::VM;
use crate::mir::join_ir::{lower_funcscanner_trim_to_joinir, lower_skip_ws_to_joinir, JoinFuncId};
use crate::mir::join_ir_runner::{run_joinir_function, JoinValue};
use crate::mir::MirCompiler;
use crate::parser::NyashParser;
fn require_experiment_toggle() -> bool {
if std::env::var("NYASH_JOINIR_EXPERIMENT").ok().as_deref() != Some("1") {
eprintln!(
"[joinir/runner] NYASH_JOINIR_EXPERIMENT=1 not set, skipping experimental runner test"
);
return false;
}
true
}
#[test]
#[ignore] // PHI/LoopForm バグあり - Phase 30 の PHI canary として据え置き
fn joinir_runner_minimal_skip_ws_executes() {
if !require_experiment_toggle() {
return;
}
std::env::set_var("NYASH_PARSER_STAGE3", "1");
std::env::set_var("HAKO_PARSER_STAGE3", "1");
std::env::set_var("NYASH_DISABLE_PLUGINS", "1");
// 無限ループ検出のため、実験テストではステップ上限を小さめに設定しておく。
// 0 は「上限なし」なので、ここでは明示的な上限を使う。
std::env::set_var("NYASH_VM_MAX_STEPS", "100000");
let src = std::fs::read_to_string("apps/tests/minimal_ssa_skip_ws.hako")
.expect("failed to read minimal_ssa_skip_ws.hako");
let runner = r#"
static box Runner {
main(args) {
return Main.skip(" abc")
}
}
"#;
let full_src = format!("{src}\n{runner}");
let ast: ASTNode = NyashParser::parse_from_string(&full_src).expect("skip_ws: parse failed");
let mut mc = MirCompiler::with_options(false);
let compiled = mc.compile(ast).expect("skip_ws: MIR compile failed");
std::env::set_var("NYASH_ENTRY", "Runner.main");
let mut vm = VM::new();
let vm_out = vm
.execute_module(&compiled.module)
.expect("skip_ws: VM execution failed");
let vm_result = vm_out.to_string_box().value;
std::env::remove_var("NYASH_ENTRY");
let join_module =
lower_skip_ws_to_joinir(&compiled.module).expect("lower_skip_ws_to_joinir failed");
feat(joinir): S-5.2-improved - VM完全意味論統合完了 Phase 27-shortterm S-5.2-improved 実装完了: ## 実装内容 1. **execute_box_call() ラッパー追加**: - src/backend/mir_interpreter/mod.rs に公開 API 実装 - 1_000_000 番台レジスタで一時値管理 - 適切なクリーンアップ処理実装 2. **handle_box_call 可視性変更**: - src/backend/mir_interpreter/handlers/boxes.rs を pub に変更 - JoinIR Runner からアクセス可能に 3. **JoinIR Runner BoxCall 統合**: - src/mir/join_ir_runner.rs の BoxCall 処理を書き換え - StringBox 直接呼び出し削除 - VM の execute_box_call 経由に変更 - JoinValue ↔ VMValue 変換で統合 4. **不要な関数削除**: - expect_str(), expect_int(), box_to_join_value() 削除 - VMValue 変換に一本化 5. **テスト更新**: - joinir_runner_standalone.rs: VM インスタンス追加 - joinir_runner_min.rs: VM 再利用 ## 期待される効果 ✅ Void guards 完全対応 (Void.length() → 0) ✅ PluginBox/InstanceBox 将来対応可能 ✅ VM の完全な BoxCall 意味論統一 ✅ VM 2号機回避(ガードレール設計成功) ## テスト結果 ✅ joinir_runner_standalone_skip_ws ... ok ✅ joinir_runner_standalone_trim ... ok ✅ ビルド成功(0エラー) ## 完了タスク - [x] MirInterpreter::execute_box_call() 実装 - [x] 1_000_000 レジスタ帯域割り当て - [x] regs クリーンアップ実装 - [x] JoinIR Runner BoxCall 書き換え - [x] テスト更新&PASS確認 🎉 VM 完全意味論統合完了!
2025-11-24 08:37:59 +09:00
// S-5.2-improved: Reuse VM instance for JoinIR Runner
let join_result = run_joinir_function(
feat(joinir): S-5.2-improved - VM完全意味論統合完了 Phase 27-shortterm S-5.2-improved 実装完了: ## 実装内容 1. **execute_box_call() ラッパー追加**: - src/backend/mir_interpreter/mod.rs に公開 API 実装 - 1_000_000 番台レジスタで一時値管理 - 適切なクリーンアップ処理実装 2. **handle_box_call 可視性変更**: - src/backend/mir_interpreter/handlers/boxes.rs を pub に変更 - JoinIR Runner からアクセス可能に 3. **JoinIR Runner BoxCall 統合**: - src/mir/join_ir_runner.rs の BoxCall 処理を書き換え - StringBox 直接呼び出し削除 - VM の execute_box_call 経由に変更 - JoinValue ↔ VMValue 変換で統合 4. **不要な関数削除**: - expect_str(), expect_int(), box_to_join_value() 削除 - VMValue 変換に一本化 5. **テスト更新**: - joinir_runner_standalone.rs: VM インスタンス追加 - joinir_runner_min.rs: VM 再利用 ## 期待される効果 ✅ Void guards 完全対応 (Void.length() → 0) ✅ PluginBox/InstanceBox 将来対応可能 ✅ VM の完全な BoxCall 意味論統一 ✅ VM 2号機回避(ガードレール設計成功) ## テスト結果 ✅ joinir_runner_standalone_skip_ws ... ok ✅ joinir_runner_standalone_trim ... ok ✅ ビルド成功(0エラー) ## 完了タスク - [x] MirInterpreter::execute_box_call() 実装 - [x] 1_000_000 レジスタ帯域割り当て - [x] regs クリーンアップ実装 - [x] JoinIR Runner BoxCall 書き換え - [x] テスト更新&PASS確認 🎉 VM 完全意味論統合完了!
2025-11-24 08:37:59 +09:00
&mut vm,
&join_module,
JoinFuncId::new(0),
&[JoinValue::Str(" abc".to_string())],
)
.expect("JoinIR runner failed for skip_ws");
assert_eq!(vm_result, "3", "VM expected to skip 3 leading spaces");
match join_result {
JoinValue::Int(v) => assert_eq!(v, 3, "JoinIR runner skip_ws result mismatch"),
other => panic!("JoinIR runner returned non-int value: {:?}", other),
}
std::env::remove_var("NYASH_PARSER_STAGE3");
std::env::remove_var("HAKO_PARSER_STAGE3");
std::env::remove_var("NYASH_DISABLE_PLUGINS");
std::env::remove_var("NYASH_VM_MAX_STEPS");
}
#[test]
#[ignore]
fn joinir_runner_funcscanner_trim_executes() {
if !require_experiment_toggle() {
return;
}
std::env::set_var("NYASH_PARSER_STAGE3", "1");
std::env::set_var("HAKO_PARSER_STAGE3", "1");
std::env::set_var("NYASH_ENABLE_USING", "1");
std::env::set_var("HAKO_ENABLE_USING", "1");
std::env::set_var("NYASH_DISABLE_PLUGINS", "1");
// 上と同様、無限ループ検出用にステップ上限を明示しておく。
std::env::set_var("NYASH_VM_MAX_STEPS", "100000");
let func_scanner_src = include_str!("../../lang/src/compiler/entry/func_scanner.hako");
let test_src = std::fs::read_to_string("lang/src/compiler/tests/funcscanner_trim_min.hako")
.expect("failed to read funcscanner_trim_min.hako");
let runner = r#"
static box Runner {
main(args) {
return FuncScannerBox.trim(" abc ")
}
}
"#;
let full_src = format!("{func_scanner_src}\n{test_src}\n{runner}");
let ast: ASTNode = NyashParser::parse_from_string(&full_src).expect("trim_min: parse failed");
let mut mc = MirCompiler::with_options(false);
let compiled = mc.compile(ast).expect("trim_min: MIR compile failed");
std::env::set_var("NYASH_ENTRY", "Runner.main");
let mut vm = VM::new();
let vm_out = vm
.execute_module(&compiled.module)
.expect("trim_min: VM execution failed");
let vm_result = vm_out.to_string_box().value;
std::env::remove_var("NYASH_ENTRY");
let join_module = lower_funcscanner_trim_to_joinir(&compiled.module)
.expect("lower_funcscanner_trim_to_joinir failed");
feat(joinir): S-5.2-improved - VM完全意味論統合完了 Phase 27-shortterm S-5.2-improved 実装完了: ## 実装内容 1. **execute_box_call() ラッパー追加**: - src/backend/mir_interpreter/mod.rs に公開 API 実装 - 1_000_000 番台レジスタで一時値管理 - 適切なクリーンアップ処理実装 2. **handle_box_call 可視性変更**: - src/backend/mir_interpreter/handlers/boxes.rs を pub に変更 - JoinIR Runner からアクセス可能に 3. **JoinIR Runner BoxCall 統合**: - src/mir/join_ir_runner.rs の BoxCall 処理を書き換え - StringBox 直接呼び出し削除 - VM の execute_box_call 経由に変更 - JoinValue ↔ VMValue 変換で統合 4. **不要な関数削除**: - expect_str(), expect_int(), box_to_join_value() 削除 - VMValue 変換に一本化 5. **テスト更新**: - joinir_runner_standalone.rs: VM インスタンス追加 - joinir_runner_min.rs: VM 再利用 ## 期待される効果 ✅ Void guards 完全対応 (Void.length() → 0) ✅ PluginBox/InstanceBox 将来対応可能 ✅ VM の完全な BoxCall 意味論統一 ✅ VM 2号機回避(ガードレール設計成功) ## テスト結果 ✅ joinir_runner_standalone_skip_ws ... ok ✅ joinir_runner_standalone_trim ... ok ✅ ビルド成功(0エラー) ## 完了タスク - [x] MirInterpreter::execute_box_call() 実装 - [x] 1_000_000 レジスタ帯域割り当て - [x] regs クリーンアップ実装 - [x] JoinIR Runner BoxCall 書き換え - [x] テスト更新&PASS確認 🎉 VM 完全意味論統合完了!
2025-11-24 08:37:59 +09:00
// S-5.2-improved: Reuse VM instance for JoinIR Runner
let join_result = run_joinir_function(
feat(joinir): S-5.2-improved - VM完全意味論統合完了 Phase 27-shortterm S-5.2-improved 実装完了: ## 実装内容 1. **execute_box_call() ラッパー追加**: - src/backend/mir_interpreter/mod.rs に公開 API 実装 - 1_000_000 番台レジスタで一時値管理 - 適切なクリーンアップ処理実装 2. **handle_box_call 可視性変更**: - src/backend/mir_interpreter/handlers/boxes.rs を pub に変更 - JoinIR Runner からアクセス可能に 3. **JoinIR Runner BoxCall 統合**: - src/mir/join_ir_runner.rs の BoxCall 処理を書き換え - StringBox 直接呼び出し削除 - VM の execute_box_call 経由に変更 - JoinValue ↔ VMValue 変換で統合 4. **不要な関数削除**: - expect_str(), expect_int(), box_to_join_value() 削除 - VMValue 変換に一本化 5. **テスト更新**: - joinir_runner_standalone.rs: VM インスタンス追加 - joinir_runner_min.rs: VM 再利用 ## 期待される効果 ✅ Void guards 完全対応 (Void.length() → 0) ✅ PluginBox/InstanceBox 将来対応可能 ✅ VM の完全な BoxCall 意味論統一 ✅ VM 2号機回避(ガードレール設計成功) ## テスト結果 ✅ joinir_runner_standalone_skip_ws ... ok ✅ joinir_runner_standalone_trim ... ok ✅ ビルド成功(0エラー) ## 完了タスク - [x] MirInterpreter::execute_box_call() 実装 - [x] 1_000_000 レジスタ帯域割り当て - [x] regs クリーンアップ実装 - [x] JoinIR Runner BoxCall 書き換え - [x] テスト更新&PASS確認 🎉 VM 完全意味論統合完了!
2025-11-24 08:37:59 +09:00
&mut vm,
&join_module,
JoinFuncId::new(0),
&[JoinValue::Str(" abc ".to_string())],
)
.expect("JoinIR runner failed for trim");
assert_eq!(vm_result, "abc", "VM trim_min should return stripped text");
match join_result {
JoinValue::Str(s) => assert_eq!(s, "abc", "JoinIR runner trim result mismatch"),
other => panic!("JoinIR runner returned non-string value: {:?}", other),
}
std::env::remove_var("NYASH_PARSER_STAGE3");
std::env::remove_var("HAKO_PARSER_STAGE3");
std::env::remove_var("NYASH_ENABLE_USING");
std::env::remove_var("HAKO_ENABLE_USING");
std::env::remove_var("NYASH_DISABLE_PLUGINS");
std::env::remove_var("NYASH_VM_MAX_STEPS");
}