chore: Phase 25.2関連ドキュメント更新&レガシーテストアーカイブ整理
## ドキュメント更新 - CURRENT_TASK.md: Phase 25.2完了記録 - phase-25.1b/e/q/25.2 README更新 - json_v0_bridge/README.md新規追加 ## テストファイル整理 - vtable_*テストをtests/archive/に移動(6ファイル) - json_program_loop.rsテスト追加 ## コード整理 - プラグイン(egui/python-compiler)微修正 - benchmarks.rs, instance_v2.rs更新 - MIR関連ファイル微調整 ## 全体成果 Phase 25.2完了により: - LoopSnapshotMergeBox統一管理実装 - ValueId(1283)バグ根本解決 - ~35行コード削減(目標210行の16%) - 11テスト全部PASS、3実行テストケースPASS
This commit is contained in:
@ -189,3 +189,63 @@ static box TestMultiVars {
|
||||
}
|
||||
println!("✅ MIR verification passed");
|
||||
}
|
||||
|
||||
/// LoopScope/Env_in/out の基本挙動テスト
|
||||
///
|
||||
/// - Carrier: i
|
||||
/// - Invariant: len
|
||||
/// - 期待: i は PHI を通じてループキャリーされるが、len は PHI には乗らない。
|
||||
/// (MirVerifier が SSA を検証しつつ、Phi の個数が過剰になっていないことを確認)
|
||||
#[test]
|
||||
fn test_loop_scope_env_carrier_and_invariant() {
|
||||
std::env::set_var("NYASH_VM_VERIFY_MIR", "1");
|
||||
std::env::set_var("NYASH_LOOPFORM_DEBUG", "1");
|
||||
std::env::set_var("NYASH_PARSER_STAGE3", "1");
|
||||
std::env::set_var("NYASH_PARSER_ALLOW_SEMICOLON", "1");
|
||||
|
||||
let src = r#"
|
||||
static box TestLoopScopeEnv {
|
||||
test() {
|
||||
local i = 0 // carrier
|
||||
local len = 5 // invariant
|
||||
loop(i < len) {
|
||||
i = i + 1
|
||||
}
|
||||
return i + len
|
||||
}
|
||||
}
|
||||
"#;
|
||||
|
||||
let ast = NyashParser::parse_from_string(src).expect("parse failed");
|
||||
let mut mc = MirCompiler::with_options(false);
|
||||
let cr = mc.compile(ast).expect("compile failed");
|
||||
|
||||
// MIR 構造検証(SSA / PHI まわり)
|
||||
let mut verifier = MirVerifier::new();
|
||||
if let Err(errors) = verifier.verify_module(&cr.module) {
|
||||
for err in &errors {
|
||||
eprintln!("❌ MIR verification error: {}", err);
|
||||
}
|
||||
panic!("❌ MIR verification failed with {} errors", errors.len());
|
||||
}
|
||||
|
||||
// PHI 命令数が「キャリア i の header/exit 用」に相当する範囲に収まっていることを軽く確認
|
||||
// (Invariant len に対して余計な PHI が増えていないことの簡易チェック)
|
||||
let mut phi_count = 0usize;
|
||||
for func in cr.module.functions.values() {
|
||||
for block in func.blocks.values() {
|
||||
for inst in &block.instructions {
|
||||
if let crate::mir::MirInstruction::Phi { .. } = inst {
|
||||
phi_count += 1;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
// 25.2 以降は pinned / carrier / body-local exit PHI が追加されるため、
|
||||
// PHI 数は実装詳細に依存する。ここでは「極端に増えていないこと」だけを確認する。
|
||||
assert!(
|
||||
phi_count >= 1 && phi_count <= 10,
|
||||
"unexpected PHI count for simple carrier+invariant loop: {}",
|
||||
phi_count
|
||||
);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user