Phase 30.1 & 73: Stage-3 features env and JoinIR flag cleanup

This commit is contained in:
nyash-codex
2025-11-30 14:30:28 +09:00
parent 2ea0f2a202
commit a3d5bacc55
163 changed files with 638 additions and 576 deletions

View File

@ -1,25 +1,68 @@
use nyash_rust::parser::NyashParser;
fn with_env<K: AsRef<str>, V: AsRef<str>, F: FnOnce()>(key: K, val: Option<V>, f: F) {
let k = key.as_ref().to_string();
let prev = std::env::var(&k).ok();
match val {
Some(v) => std::env::set_var(&k, v.as_ref()),
None => std::env::remove_var(&k),
fn with_stage3_env<F: FnOnce()>(
features: Option<&str>,
parser_stage3: Option<&str>,
hako_stage3: Option<&str>,
f: F,
) {
let prev_features = std::env::var("NYASH_FEATURES").ok();
let prev_parser = std::env::var("NYASH_PARSER_STAGE3").ok();
let prev_hako = std::env::var("HAKO_PARSER_STAGE3").ok();
match features {
Some(v) => std::env::set_var("NYASH_FEATURES", v),
None => std::env::remove_var("NYASH_FEATURES"),
}
match parser_stage3 {
Some(v) => std::env::set_var("NYASH_PARSER_STAGE3", v),
None => std::env::remove_var("NYASH_PARSER_STAGE3"),
}
match hako_stage3 {
Some(v) => std::env::set_var("HAKO_PARSER_STAGE3", v),
None => std::env::remove_var("HAKO_PARSER_STAGE3"),
}
f();
match prev {
Some(p) => std::env::set_var(&k, p),
None => std::env::remove_var(&k),
match prev_features {
Some(v) => std::env::set_var("NYASH_FEATURES", v),
None => std::env::remove_var("NYASH_FEATURES"),
}
match prev_parser {
Some(v) => std::env::set_var("NYASH_PARSER_STAGE3", v),
None => std::env::remove_var("NYASH_PARSER_STAGE3"),
}
match prev_hako {
Some(v) => std::env::set_var("HAKO_PARSER_STAGE3", v),
None => std::env::remove_var("HAKO_PARSER_STAGE3"),
}
}
// Legacy gate 動作テストPhase-3 Stage3 gating の歴史的仕様).
// 現在は Stage3 パーサを常時 ON に近い運用にしているため、実運用とはズレる。
#[test]
#[ignore]
fn stage3_default_enabled_accepts_try_and_throw() {
with_stage3_env(None, None, None, || {
let code_try = "try { local x = 1 } catch () { }";
let res_try = NyashParser::parse_from_string(code_try);
assert!(
res_try.is_ok(),
"try should parse when Stage-3 is default-enabled: {:?}",
res_try.err()
);
let code_throw = "throw 1";
let res_throw = NyashParser::parse_from_string(code_throw);
assert!(
res_throw.is_ok(),
"throw should parse when Stage-3 is default-enabled: {:?}",
res_throw.err()
);
});
}
#[test]
fn stage3_disabled_rejects_try_and_throw() {
with_env("NYASH_PARSER_STAGE3", None::<&str>, || {
with_stage3_env(None, Some("0"), Some("0"), || {
let code_try = "try { local x = 1 } catch () { }";
let res_try = NyashParser::parse_from_string(code_try);
assert!(res_try.is_err(), "try should be rejected when gate is off");
@ -35,7 +78,7 @@ fn stage3_disabled_rejects_try_and_throw() {
#[test]
fn stage3_enabled_accepts_throw() {
with_env("NYASH_PARSER_STAGE3", Some("1"), || {
with_stage3_env(Some("stage3"), None, None, || {
let code = "throw (1 + 2)";
let res = NyashParser::parse_from_string(code);
assert!(
@ -48,7 +91,7 @@ fn stage3_enabled_accepts_throw() {
#[test]
fn stage3_enabled_accepts_try_catch_variants() {
with_env("NYASH_PARSER_STAGE3", Some("1"), || {
with_stage3_env(Some("stage3"), None, None, || {
// (Type var)
let code1 = r#"
try { local a = 1 }