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

@ -43,6 +43,12 @@ pub fn apply_core_wrapper_env(cmd: &mut std::process::Command) {
// When selfhost builder uses `using` to load modules, the inline compiler
// needs Stage-3 support for `local` keyword. Without this, we get:
// "Undefined variable: local" in nested compilation.
// Preferred propagation: NYASH_FEATURES carries Stage-3 (legacy envs kept for compatibility)
if let Ok(val) = std::env::var("NYASH_FEATURES") {
cmd.env("NYASH_FEATURES", val);
} else if crate::config::env::parser_stage3_enabled() {
cmd.env("NYASH_FEATURES", "stage3");
}
if let Ok(val) = std::env::var("NYASH_PARSER_STAGE3") {
cmd.env("NYASH_PARSER_STAGE3", val);
}

View File

@ -169,11 +169,8 @@ impl NyashRunner {
}
}
if trace
&& (std::env::var("NYASH_PARSER_STAGE3").ok() == Some("1".into())
|| std::env::var("HAKO_PARSER_STAGE3").ok() == Some("1".into()))
{
eprintln!("[vm] Stage-3: enabled (env) for {}", filename);
if trace && crate::config::env::parser_stage3_enabled() {
eprintln!("[vm] Stage-3: enabled (NYASH_FEATURES/legacy env) for {}", filename);
}
// FailFast (optin): Hako 構文を Nyash VM 経路で実行しない
@ -500,8 +497,10 @@ impl NyashRunner {
}
// Phase 33-10.0: If lowering ドライラン統合(箱化版)
// HAKO_JOINIR_IF_SELECT=1 で有効化、IfLoweringDryRunner を使用
if crate::config::env::joinir_if_select_enabled() {
// JoinIR dev + IfSelect 有効時に IfLoweringDryRunner を使用
if crate::config::env::joinir_dev_enabled()
&& crate::config::env::joinir_if_select_enabled()
{
let debug_level = crate::config::env::joinir_debug_level();
let runner =
crate::mir::join_ir::lowering::if_dry_runner::IfLoweringDryRunner::new(debug_level);

View File

@ -86,11 +86,11 @@ impl NyashRunner {
code2 = crate::runner::modes::common_util::hako::strip_local_decl(&code2);
}
if trace
&& (std::env::var("NYASH_PARSER_STAGE3").ok() == Some("1".into())
|| std::env::var("HAKO_PARSER_STAGE3").ok() == Some("1".into()))
{
eprintln!("[vm-fallback] Stage-3: enabled (env) for {}", filename);
if trace && crate::config::env::parser_stage3_enabled() {
eprintln!(
"[vm-fallback] Stage-3: enabled (NYASH_FEATURES/legacy env) for {}",
filename
);
}
// FailFast (optin): Hako 構文を Nyash VM 経路で実行しない

View File

@ -12,7 +12,7 @@ use std::process::Command;
///
/// Sets defaults for:
/// - Runtime behavior (NYASH_NYRT_SILENT_RESULT, NYASH_DISABLE_PLUGINS, etc.)
/// - Parser toggles (NYASH_PARSER_STAGE3, NYASH_ENABLE_USING, etc.)
/// - Parser toggles (NYASH_FEATURES=stage3, legacy NYASH_PARSER_STAGE3, NYASH_ENABLE_USING, etc.)
/// - Stage-B configuration (HAKO_STAGEB_APPLY_USINGS, HAKO_STAGEB_MODULES_LIST, etc.)
pub(super) fn configure_stage1_env(
cmd: &mut Command,
@ -87,17 +87,49 @@ pub(super) fn configure_stage1_env(
if env::enable_using() { "1" } else { "0" },
);
}
if std::env::var("NYASH_PARSER_STAGE3").is_err() {
cmd.env(
"NYASH_PARSER_STAGE3",
if env::parser_stage3() { "1" } else { "0" },
);
// Stage-3 gate (default ON): prefer NYASH_FEATURES for propagation, but keep
// legacy envs if parent explicitly set them.
let stage3_enabled = env::parser_stage3_enabled();
let merge_feature = |current: &str, feature: &str| -> String {
let mut list: Vec<String> = current
.split(',')
.filter_map(|s| {
let trimmed = s.trim();
if trimmed.is_empty() {
None
} else {
Some(trimmed.to_string())
}
})
.collect();
let normalized_feature = feature.replace(['-', '_'], "");
let contains = list.iter().any(|f| {
let n = f.to_ascii_lowercase().replace(['-', '_'], "");
n == normalized_feature
});
if !contains {
list.push(feature.to_string());
}
list.join(",")
};
match std::env::var("NYASH_FEATURES") {
Ok(current) => {
if stage3_enabled {
cmd.env("NYASH_FEATURES", merge_feature(&current, "stage3"));
} else {
cmd.env("NYASH_FEATURES", current);
}
}
Err(_) if stage3_enabled => {
cmd.env("NYASH_FEATURES", "stage3");
}
Err(_) => {}
}
if std::env::var("HAKO_PARSER_STAGE3").is_err() {
cmd.env(
"HAKO_PARSER_STAGE3",
if env::parser_stage3() { "1" } else { "0" },
);
if let Ok(val) = std::env::var("NYASH_PARSER_STAGE3") {
cmd.env("NYASH_PARSER_STAGE3", val);
}
if let Ok(val) = std::env::var("HAKO_PARSER_STAGE3") {
cmd.env("HAKO_PARSER_STAGE3", val);
}
// Modules list