Phase 30.1 & 73: Stage-3 features env and JoinIR flag cleanup
This commit is contained in:
@ -182,6 +182,34 @@ pub fn env_bool_default(key: &str, default: bool) -> bool {
|
||||
}
|
||||
}
|
||||
|
||||
fn nyash_features_list() -> Option<Vec<String>> {
|
||||
let raw = std::env::var("NYASH_FEATURES").ok()?;
|
||||
let list: Vec<String> = raw
|
||||
.split(',')
|
||||
.filter_map(|s| {
|
||||
let trimmed = s.trim();
|
||||
if trimmed.is_empty() {
|
||||
None
|
||||
} else {
|
||||
Some(trimmed.to_ascii_lowercase())
|
||||
}
|
||||
})
|
||||
.collect();
|
||||
if list.is_empty() { None } else { Some(list) }
|
||||
}
|
||||
|
||||
fn feature_stage3_enabled() -> bool {
|
||||
if let Some(list) = nyash_features_list() {
|
||||
for item in list {
|
||||
let normalized = item.replace(['-', '_'], "");
|
||||
if normalized == "stage3" || normalized == "parserstage3" {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
}
|
||||
false
|
||||
}
|
||||
|
||||
/// Global fail-fast policy for runtime fallbacks.
|
||||
/// Default: ON (true) to prohibit silent/different-route fallbacks in Rust layer.
|
||||
/// Set NYASH_FAIL_FAST=0 to temporarily allow legacy fallbacks during bring-up.
|
||||
@ -196,11 +224,29 @@ pub fn joinir_experiment_enabled() -> bool {
|
||||
env_bool("NYASH_JOINIR_EXPERIMENT")
|
||||
}
|
||||
|
||||
/// JoinIR core policy: future本線で扱うトグルの集約口。
|
||||
/// - If NYASH_JOINIR_CORE is set, obey it.
|
||||
/// - If key dev/core flags are present, treat as ON (compat).
|
||||
/// - Otherwise inherit joinir_experiment_enabled().
|
||||
pub fn joinir_core_enabled() -> bool {
|
||||
if let Some(v) = env_flag("NYASH_JOINIR_CORE") {
|
||||
return v;
|
||||
}
|
||||
// Compat: explicit JoinIR toggles imply core ON even if experiment is unset.
|
||||
if env_bool("NYASH_JOINIR_VM_BRIDGE")
|
||||
|| env_bool("NYASH_JOINIR_LLVM_EXPERIMENT")
|
||||
|| env_bool("HAKO_JOINIR_IF_SELECT")
|
||||
{
|
||||
return true;
|
||||
}
|
||||
joinir_experiment_enabled()
|
||||
}
|
||||
|
||||
/// JoinIR VM bridge mode. When enabled with NYASH_JOINIR_EXPERIMENT=1,
|
||||
/// specific functions can be executed via JoinIR → VM bridge instead of direct MIR → VM.
|
||||
/// Set NYASH_JOINIR_VM_BRIDGE=1 to enable.
|
||||
pub fn joinir_vm_bridge_enabled() -> bool {
|
||||
env_bool("NYASH_JOINIR_VM_BRIDGE")
|
||||
joinir_core_enabled() && env_bool("NYASH_JOINIR_VM_BRIDGE")
|
||||
}
|
||||
|
||||
/// JoinIR VM bridge debug output. Enables verbose logging of JoinIR→MIR conversion.
|
||||
@ -214,21 +260,16 @@ pub fn joinir_vm_bridge_debug() -> bool {
|
||||
/// This is a dev-only toggle for testing PHI normalization via JoinIR in the LLVM path.
|
||||
/// Set NYASH_JOINIR_LLVM_EXPERIMENT=1 to enable.
|
||||
pub fn joinir_llvm_experiment_enabled() -> bool {
|
||||
env_bool("NYASH_JOINIR_LLVM_EXPERIMENT")
|
||||
joinir_core_enabled() && env_bool("NYASH_JOINIR_LLVM_EXPERIMENT")
|
||||
}
|
||||
|
||||
/// Phase 33: JoinIR If Select 実験の有効化
|
||||
/// Primary: HAKO_JOINIR_IF_SELECT (Phase 33-8+). Fallback: NYASH_JOINIR_IF_SELECT (deprecated).
|
||||
/// Primary: HAKO_JOINIR_IF_SELECT (Phase 33-8+).
|
||||
pub fn joinir_if_select_enabled() -> bool {
|
||||
// Primary: HAKO_JOINIR_IF_SELECT
|
||||
if let Some(v) = env_flag("HAKO_JOINIR_IF_SELECT") {
|
||||
return v;
|
||||
}
|
||||
// Fallback: NYASH_JOINIR_IF_SELECT (deprecated)
|
||||
if env_bool("NYASH_JOINIR_IF_SELECT") {
|
||||
warn_alias_once("NYASH_JOINIR_IF_SELECT", "HAKO_JOINIR_IF_SELECT");
|
||||
return true;
|
||||
}
|
||||
false
|
||||
}
|
||||
|
||||
@ -239,11 +280,6 @@ pub fn joinir_stage1_enabled() -> bool {
|
||||
if let Some(v) = env_flag("HAKO_JOINIR_STAGE1") {
|
||||
return v;
|
||||
}
|
||||
// Fallback: NYASH_JOINIR_STAGE1 (deprecated)
|
||||
if env_bool("NYASH_JOINIR_STAGE1") {
|
||||
warn_alias_once("NYASH_JOINIR_STAGE1", "HAKO_JOINIR_STAGE1");
|
||||
return true;
|
||||
}
|
||||
false
|
||||
}
|
||||
|
||||
@ -265,6 +301,13 @@ pub fn joinir_debug_level() -> u8 {
|
||||
0
|
||||
}
|
||||
|
||||
/// Dev-only convenience switch to bundle experimental JoinIR knobs.
|
||||
/// - NYASH_JOINIR_DEV=1 enables
|
||||
/// - Otherwise inherits from joinir_debug_level()>0 (opt-in debug)
|
||||
pub fn joinir_dev_enabled() -> bool {
|
||||
env_bool("NYASH_JOINIR_DEV") || joinir_debug_level() > 0
|
||||
}
|
||||
|
||||
/// Phase 61-2: If-in-loop JoinIR dry-run有効化
|
||||
///
|
||||
/// `HAKO_JOINIR_IF_IN_LOOP_DRYRUN=1` でdry-runモードを有効化
|
||||
@ -286,7 +329,7 @@ pub fn joinir_if_in_loop_dryrun_enabled() -> bool {
|
||||
/// - OFF: PhiBuilderBox経路(既存フォールバック)
|
||||
///
|
||||
/// 前提条件:
|
||||
/// - NYASH_JOINIR_IF_SELECT=1(Phase 33基盤)
|
||||
/// - JoinIR IfSelect 基盤(Phase 33)の有効化
|
||||
/// - dry-runモードとは独立(HAKO_JOINIR_IF_IN_LOOP_DRYRUN)
|
||||
///
|
||||
/// デフォルト: OFF(安全第一)
|
||||
@ -640,18 +683,29 @@ pub fn selfhost_read_tmp() -> bool {
|
||||
pub fn ny_compiler_stage3() -> bool {
|
||||
std::env::var("NYASH_NY_COMPILER_STAGE3").ok().as_deref() == Some("1")
|
||||
}
|
||||
/// Core (Rust) parser Stage-3 gate
|
||||
/// When enabled, the Rust parser accepts Stage-3 surface (try/catch/finally, throw).
|
||||
/// Default is OFF to keep Stage-2 stable.
|
||||
/// Core (Rust) parser Stage-3 gate (default ON).
|
||||
/// Precedence:
|
||||
/// 1) NYASH_FEATURES contains `stage3`/`parser-stage3`
|
||||
/// 2) Legacy env aliases (NYASH_PARSER_STAGE3 / HAKO_PARSER_STAGE3)
|
||||
/// 3) Default true (Stage-3 is standard syntax)
|
||||
pub fn parser_stage3_enabled() -> bool {
|
||||
if feature_stage3_enabled() {
|
||||
return true;
|
||||
}
|
||||
if let Some(v) = env_flag("NYASH_PARSER_STAGE3") {
|
||||
warn_alias_once("NYASH_PARSER_STAGE3", "NYASH_FEATURES=stage3");
|
||||
return v;
|
||||
}
|
||||
if let Some(v) = env_flag("HAKO_PARSER_STAGE3") {
|
||||
warn_alias_once("HAKO_PARSER_STAGE3", "NYASH_FEATURES=stage3");
|
||||
return v;
|
||||
}
|
||||
true
|
||||
}
|
||||
|
||||
#[deprecated(note = "Use parser_stage3_enabled() instead")]
|
||||
pub fn parser_stage3() -> bool {
|
||||
if std::env::var("NYASH_PARSER_STAGE3").ok().as_deref() == Some("1") {
|
||||
return true;
|
||||
}
|
||||
if std::env::var("HAKO_PARSER_STAGE3").ok().as_deref() == Some("1") {
|
||||
warn_alias_once("HAKO_PARSER_STAGE3", "NYASH_PARSER_STAGE3");
|
||||
return true;
|
||||
}
|
||||
false
|
||||
parser_stage3_enabled()
|
||||
}
|
||||
|
||||
/// Parser gate for Block‑Postfix Catch acceptance
|
||||
@ -660,7 +714,7 @@ pub fn parser_stage3() -> bool {
|
||||
/// a single `catch (...) { ... }` and/or `finally { ... }`, which is folded into
|
||||
/// ASTNode::TryCatch with the preceding block as the try body.
|
||||
pub fn block_postfix_catch() -> bool {
|
||||
std::env::var("NYASH_BLOCK_CATCH").ok().as_deref() == Some("1") || parser_stage3()
|
||||
std::env::var("NYASH_BLOCK_CATCH").ok().as_deref() == Some("1") || parser_stage3_enabled()
|
||||
}
|
||||
|
||||
/// Bridge lowering: use Result-style try/throw lowering instead of MIR Catch/Throw
|
||||
@ -674,7 +728,7 @@ pub fn try_result_mode() -> bool {
|
||||
/// Parser gate for method-level postfix catch/finally acceptance on method definitions.
|
||||
/// Enabled when either NYASH_METHOD_CATCH=1 or Stage‑3 gate is on.
|
||||
pub fn method_catch() -> bool {
|
||||
std::env::var("NYASH_METHOD_CATCH").ok().as_deref() == Some("1") || parser_stage3()
|
||||
std::env::var("NYASH_METHOD_CATCH").ok().as_deref() == Some("1") || parser_stage3_enabled()
|
||||
}
|
||||
|
||||
/// Entry policy: allow top-level `main` resolution in addition to `Main.main`.
|
||||
@ -690,10 +744,10 @@ pub fn entry_allow_toplevel_main() -> bool {
|
||||
}
|
||||
|
||||
/// Parser gate for expression-level postfix catch/cleanup acceptance.
|
||||
/// Enabled when Stage-3 gate is on (NYASH_PARSER_STAGE3=1). Separate gate can
|
||||
/// Enabled when Stage-3 gate is on (NYASH_FEATURES=stage3 or legacy aliases). Separate gate can
|
||||
/// be introduced in future if needed, but we keep minimal toggles now.
|
||||
pub fn expr_postfix_catch() -> bool {
|
||||
parser_stage3()
|
||||
parser_stage3_enabled()
|
||||
}
|
||||
/// Parser gate for Unified Members (stored/computed/once/birth_once).
|
||||
/// Default: ON during Phase-15 (set NYASH_ENABLE_UNIFIED_MEMBERS=0|false|off to disable).
|
||||
|
||||
@ -534,13 +534,13 @@ impl MirBuilder {
|
||||
let mut msg = format!("Undefined variable: {}", name);
|
||||
|
||||
// Stage-3 keyword diagnostic (local/flow/try/catch/throw)
|
||||
if name == "local" && !crate::config::env::parser_stage3() {
|
||||
msg.push_str("\nHint: 'local' is a Stage-3 keyword. Enable NYASH_PARSER_STAGE3=1 (and HAKO_PARSER_STAGE3=1 for Stage-B).");
|
||||
if name == "local" && !crate::config::env::parser_stage3_enabled() {
|
||||
msg.push_str("\nHint: 'local' is a Stage-3 keyword. Prefer NYASH_FEATURES=stage3 (legacy: NYASH_PARSER_STAGE3=1 / HAKO_PARSER_STAGE3=1 for Stage-B).");
|
||||
msg.push_str("\nFor AotPrep verification, use tools/hakorune_emit_mir.sh which sets these automatically.");
|
||||
} else if (name == "flow" || name == "try" || name == "catch" || name == "throw")
|
||||
&& !crate::config::env::parser_stage3()
|
||||
&& !crate::config::env::parser_stage3_enabled()
|
||||
{
|
||||
msg.push_str(&format!("\nHint: '{}' is a Stage-3 keyword. Enable NYASH_PARSER_STAGE3=1 (and HAKO_PARSER_STAGE3=1 for Stage-B).", name));
|
||||
msg.push_str(&format!("\nHint: '{}' is a Stage-3 keyword. Prefer NYASH_FEATURES=stage3 (legacy: NYASH_PARSER_STAGE3=1 / HAKO_PARSER_STAGE3=1 for Stage-B).", name));
|
||||
}
|
||||
|
||||
let suggest = crate::using::simple_registry::suggest_using_for_symbol(&name);
|
||||
|
||||
@ -213,6 +213,8 @@ impl MirBuilder {
|
||||
let pre_then_var_value: Option<ValueId> = None;
|
||||
|
||||
// Phase 61-4: JoinIR 経路試行(ループ外 If)
|
||||
//
|
||||
// - 実際の有効化判定は config::env 側のポリシー関数に集約する。
|
||||
let joinir_enabled = crate::config::env::joinir_if_select_enabled();
|
||||
let joinir_toplevel = crate::config::env::joinir_if_toplevel_enabled();
|
||||
let joinir_dryrun = crate::config::env::joinir_if_toplevel_dryrun_enabled();
|
||||
|
||||
@ -102,8 +102,10 @@ impl AstToJoinIrLowerer {
|
||||
}
|
||||
"parse_loop" => {
|
||||
// Phase 41-4: NestedIfMerge pattern (dev flag gated)
|
||||
// Guard: HAKO_JOINIR_NESTED_IF=1 を要求
|
||||
if std::env::var("HAKO_JOINIR_NESTED_IF").ok().as_deref() == Some("1") {
|
||||
// Guard: JoinIR dev + HAKO_JOINIR_NESTED_IF=1 を要求
|
||||
if crate::config::env::joinir_dev_enabled()
|
||||
&& std::env::var("HAKO_JOINIR_NESTED_IF").ok().as_deref() == Some("1")
|
||||
{
|
||||
self.lower_nested_if_pattern(program_json)
|
||||
} else {
|
||||
// Dev flag が OFF の場合は panic(旧ルートにフォールバックするため)
|
||||
@ -116,7 +118,9 @@ impl AstToJoinIrLowerer {
|
||||
"read_quoted_from" => {
|
||||
// Phase 45: read_quoted_from pattern (dev flag gated)
|
||||
// Guard if + Loop with break + accumulator
|
||||
if std::env::var("HAKO_JOINIR_READ_QUOTED").ok().as_deref() == Some("1") {
|
||||
if crate::config::env::joinir_dev_enabled()
|
||||
&& std::env::var("HAKO_JOINIR_READ_QUOTED").ok().as_deref() == Some("1")
|
||||
{
|
||||
self.lower_read_quoted_pattern(program_json)
|
||||
} else {
|
||||
panic!(
|
||||
|
||||
@ -120,7 +120,7 @@ pub fn is_joinir_if_toplevel_target(name: &str) -> bool {
|
||||
/// - IfMergeTest.* (Phase 33-7)
|
||||
/// - JsonShapeToMap._read_value_from_pair/1 (Phase 33-4 Stage-1)
|
||||
/// - Stage1JsonScannerBox.value_start_after_key_pos/2 (Phase 33-4 Stage-B)
|
||||
/// - Requires NYASH_JOINIR_IF_SELECT=1 environment variable
|
||||
/// - Requires JoinIR If-select toggle (HAKO_JOINIR_IF_SELECT / joinir_if_select_enabled)
|
||||
/// - Falls back to traditional if_phi on pattern mismatch
|
||||
///
|
||||
/// Pattern selection:
|
||||
@ -138,7 +138,13 @@ pub fn try_lower_if_to_joinir(
|
||||
debug: bool,
|
||||
context: Option<&if_phi_context::IfPhiContext>, // Phase 61-1: If-in-loop context
|
||||
) -> Option<JoinInst> {
|
||||
// 1. dev トグルチェック
|
||||
// 1. dev/Core トグルチェック
|
||||
//
|
||||
// - Core: joinir_core_enabled() / joinir_if_select_enabled()
|
||||
// - Dev: joinir_dev_enabled()(詳細ログ等)
|
||||
//
|
||||
// 実際の挙動切り替えは joinir_if_select_enabled() に集約し、
|
||||
// Core/Dev ポリシーは config::env 側で判定する。
|
||||
if !crate::config::env::joinir_if_select_enabled() {
|
||||
return None;
|
||||
}
|
||||
|
||||
@ -1,4 +1,4 @@
|
||||
use crate::config::env::{joinir_experiment_enabled, joinir_vm_bridge_enabled};
|
||||
use crate::config::env::{joinir_core_enabled, joinir_vm_bridge_enabled};
|
||||
|
||||
/// JoinIR VM ブリッジの環境フラグ
|
||||
#[derive(Debug, Clone, Copy)]
|
||||
@ -11,7 +11,7 @@ impl JoinIrEnvFlags {
|
||||
/// 現在の環境変数からフラグを取得
|
||||
pub fn from_env() -> Self {
|
||||
Self {
|
||||
joinir_experiment: joinir_experiment_enabled(),
|
||||
joinir_experiment: joinir_core_enabled(),
|
||||
vm_bridge: joinir_vm_bridge_enabled(),
|
||||
}
|
||||
}
|
||||
|
||||
@ -68,10 +68,11 @@ impl IfInLoopPhiEmitter {
|
||||
if_shape: &IfShape,
|
||||
) -> Result<usize, String> {
|
||||
let mut phi_count = 0;
|
||||
let trace_on = std::env::var("HAKO_JOINIR_IF_IN_LOOP_TRACE")
|
||||
.ok()
|
||||
.as_deref()
|
||||
== Some("1");
|
||||
let trace_on = crate::config::env::joinir_dev_enabled()
|
||||
&& std::env::var("HAKO_JOINIR_IF_IN_LOOP_TRACE")
|
||||
.ok()
|
||||
.as_deref()
|
||||
== Some("1");
|
||||
|
||||
if trace_on {
|
||||
eprintln!("[Phase 61-3] IfInLoopPhiEmitter::emit_header_phis start");
|
||||
@ -179,10 +180,11 @@ impl IfInLoopPhiEmitter {
|
||||
if_shape: &IfShape,
|
||||
) -> Result<usize, String> {
|
||||
let mut phi_count = 0;
|
||||
let trace_on = std::env::var("HAKO_JOINIR_IF_TOPLEVEL_TRACE")
|
||||
.ok()
|
||||
.as_deref()
|
||||
== Some("1");
|
||||
let trace_on = crate::config::env::joinir_dev_enabled()
|
||||
&& std::env::var("HAKO_JOINIR_IF_TOPLEVEL_TRACE")
|
||||
.ok()
|
||||
.as_deref()
|
||||
== Some("1");
|
||||
|
||||
if trace_on {
|
||||
eprintln!("[Phase 61-4] IfInLoopPhiEmitter::emit_toplevel_phis start");
|
||||
|
||||
@ -79,7 +79,8 @@ impl<'a> JoinIRIfPhiSelector<'a> {
|
||||
carrier_names: BTreeSet<String>,
|
||||
) -> Self {
|
||||
let context = IfPhiContext::for_loop_body(carrier_names);
|
||||
let dryrun = crate::config::env::joinir_if_in_loop_dryrun_enabled();
|
||||
let dryrun = crate::config::env::joinir_dev_enabled()
|
||||
&& crate::config::env::joinir_if_in_loop_dryrun_enabled();
|
||||
|
||||
Self {
|
||||
context,
|
||||
@ -113,8 +114,9 @@ impl<'a> JoinIRIfPhiSelector<'a> {
|
||||
self.log_dryrun(&join_inst, &phi_spec);
|
||||
}
|
||||
|
||||
// 本番経路有効判定
|
||||
let success = crate::config::env::joinir_if_in_loop_enable();
|
||||
// 本番経路有効判定(Core + フラグ)
|
||||
let success = crate::config::env::joinir_core_enabled()
|
||||
&& crate::config::env::joinir_if_in_loop_enable();
|
||||
|
||||
JoinIRResult {
|
||||
success,
|
||||
|
||||
@ -4,9 +4,9 @@ use crate::mir::lowerers::LoweringError;
|
||||
|
||||
/// Stage-3 loop lowering helpers (while / for-range).
|
||||
///
|
||||
/// Enabled only when NYASH_PARSER_STAGE3 / HAKO_PARSER_STAGE3 are set on the
|
||||
/// parser side and corresponding AST nodes are produced. This module provides
|
||||
/// minimal lowering support so that Stage-3 style loops used by tools like
|
||||
/// Enabled when Stage-3 parsing is active (default ON via NYASH_FEATURES=stage3,
|
||||
/// legacy NYASH_PARSER_STAGE3/HAKO_PARSER_STAGE3 still accepted). This module
|
||||
/// provides minimal lowering support so Stage-3 style loops used by tools like
|
||||
/// hako_check can execute on the existing MIR interpreter without modifying
|
||||
/// default behavior when Stage-3 is disabled.
|
||||
pub struct LoopLowerer;
|
||||
|
||||
@ -65,11 +65,10 @@ pub(crate) struct LoopBypassFlags {
|
||||
/// # Returns
|
||||
/// - `LoopBypassFlags` - Header/Exit バイパスの有効状態
|
||||
pub(crate) fn get_loop_bypass_flags(fn_name: &str) -> LoopBypassFlags {
|
||||
let joinir_exp = crate::mir::join_ir::env_flag_is_1("NYASH_JOINIR_EXPERIMENT");
|
||||
let header_exp = crate::mir::join_ir::env_flag_is_1("NYASH_JOINIR_HEADER_EXP");
|
||||
|
||||
LoopBypassFlags {
|
||||
header: joinir_exp && header_exp && is_joinir_header_bypass_target(fn_name),
|
||||
// Phase 73: Header φ バイパス実験は廃止(常時 OFF)。
|
||||
// LoopScopeShape/JoinIR 本線でのみ検証。
|
||||
header: false,
|
||||
}
|
||||
}
|
||||
|
||||
@ -80,12 +79,12 @@ pub(crate) fn get_loop_bypass_flags(fn_name: &str) -> LoopBypassFlags {
|
||||
/// JoinIR Exit φ バイパスが有効かどうか
|
||||
///
|
||||
/// - NYASH_JOINIR_EXPERIMENT=1
|
||||
/// - NYASH_JOINIR_EXIT_EXP=1
|
||||
/// - (legacy) Exit φ バイパス用の実験フラグ
|
||||
///
|
||||
/// の両方が立っているときだけ true。
|
||||
pub(crate) fn joinir_exit_bypass_enabled() -> bool {
|
||||
crate::mir::join_ir::env_flag_is_1("NYASH_JOINIR_EXPERIMENT")
|
||||
&& crate::mir::join_ir::env_flag_is_1("NYASH_JOINIR_EXIT_EXP")
|
||||
// Phase 73: Exit φ バイパス実験は廃止(常時 OFF)。JoinIR 経路は LoopScopeShape/Exit φ 本線で検証。
|
||||
false
|
||||
}
|
||||
|
||||
/// Exit φ バイパス対象の関数かどうか
|
||||
|
||||
@ -11,7 +11,7 @@ pub(crate) fn wrap_with_optional_postfix(
|
||||
p: &mut NyashParser,
|
||||
body: Vec<ASTNode>,
|
||||
) -> Result<Vec<ASTNode>, ParseError> {
|
||||
if !(crate::config::env::parser_stage3()
|
||||
if !(crate::config::env::parser_stage3_enabled()
|
||||
&& (p.match_token(&TokenType::CATCH) || p.match_token(&TokenType::CLEANUP)))
|
||||
{
|
||||
return Ok(body);
|
||||
|
||||
@ -121,7 +121,7 @@ pub fn parse_box_declaration(p: &mut NyashParser) -> Result<ASTNode, ParseError>
|
||||
let mut last_method_name: Option<String> = None;
|
||||
while !p.match_token(&TokenType::RBRACE) && !p.is_at_end() {
|
||||
// 分類(段階移行用の観測): 将来の分岐移譲のための前処理
|
||||
if crate::config::env::parser_stage3() {
|
||||
if crate::config::env::parser_stage3_enabled() {
|
||||
if let Ok(kind) = members::common::classify_member(p) {
|
||||
let _ = kind; // 現段階では観測のみ(無副作用)
|
||||
}
|
||||
|
||||
@ -159,10 +159,10 @@ impl NyashParser {
|
||||
}
|
||||
|
||||
/// 文字列からパース (トークナイズ + パース)
|
||||
/// Note: Reads environment variables (NYASH_PARSER_STAGE3, etc.) for using-chain parsing
|
||||
/// Note: Reads parser_stage3_enabled() (NYASH_FEATURES=stage3 or legacy env) for using-chain parsing
|
||||
pub fn parse_from_string(input: impl Into<String>) -> Result<ASTNode, ParseError> {
|
||||
// Ensure Stage-3 features are enabled when parsing using-chain files
|
||||
// if the parent process has NYASH_PARSER_STAGE3=1 set
|
||||
// when parent requested Stage-3 parsing via NYASH_FEATURES/legacy env
|
||||
Self::parse_from_string_with_fuel(input, Some(100_000))
|
||||
}
|
||||
|
||||
|
||||
@ -192,16 +192,7 @@ impl NyashParser {
|
||||
|
||||
/// Helper: env-gated Stage-3 enable check.
|
||||
fn is_stage3_enabled() -> bool {
|
||||
let on = |key: &str| {
|
||||
std::env::var(key)
|
||||
.ok()
|
||||
.map(|v| {
|
||||
let lv = v.to_ascii_lowercase();
|
||||
lv == "1" || lv == "true" || lv == "on"
|
||||
})
|
||||
.unwrap_or(false)
|
||||
};
|
||||
on("NYASH_PARSER_STAGE3") || on("HAKO_PARSER_STAGE3")
|
||||
crate::config::env::parser_stage3_enabled()
|
||||
}
|
||||
|
||||
/// Parse break statement
|
||||
|
||||
@ -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);
|
||||
}
|
||||
|
||||
@ -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);
|
||||
}
|
||||
|
||||
// Fail‑Fast (opt‑in): 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);
|
||||
|
||||
@ -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
|
||||
);
|
||||
}
|
||||
|
||||
// Fail‑Fast (opt‑in): Hako 構文を Nyash VM 経路で実行しない
|
||||
|
||||
@ -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(¤t, "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
|
||||
|
||||
@ -26,8 +26,7 @@ fn phase49_joinir_mainline_pipeline_smoke() {
|
||||
// Phase 49 mainline route は dev フラグで制御
|
||||
std::env::set_var("HAKO_JOINIR_PRINT_TOKENS_MAIN", "1");
|
||||
std::env::set_var("NYASH_JOINIR_MAINLINE_DEBUG", "1");
|
||||
std::env::set_var("NYASH_PARSER_STAGE3", "1");
|
||||
std::env::set_var("HAKO_PARSER_STAGE3", "1");
|
||||
std::env::set_var("NYASH_FEATURES", "stage3");
|
||||
std::env::set_var("NYASH_DISABLE_PLUGINS", "1");
|
||||
|
||||
// print_tokens を含む最小限の JsonTokenizer 定義
|
||||
@ -77,8 +76,7 @@ static box Main {
|
||||
// クリーンアップ
|
||||
std::env::remove_var("HAKO_JOINIR_PRINT_TOKENS_MAIN");
|
||||
std::env::remove_var("NYASH_JOINIR_MAINLINE_DEBUG");
|
||||
std::env::remove_var("NYASH_PARSER_STAGE3");
|
||||
std::env::remove_var("HAKO_PARSER_STAGE3");
|
||||
std::env::remove_var("NYASH_FEATURES");
|
||||
std::env::remove_var("NYASH_DISABLE_PLUGINS");
|
||||
}
|
||||
|
||||
@ -87,8 +85,7 @@ static box Main {
|
||||
fn phase49_joinir_mainline_fallback_without_flag() {
|
||||
// dev フラグ OFF
|
||||
std::env::remove_var("HAKO_JOINIR_PRINT_TOKENS_MAIN");
|
||||
std::env::set_var("NYASH_PARSER_STAGE3", "1");
|
||||
std::env::set_var("HAKO_PARSER_STAGE3", "1");
|
||||
std::env::set_var("NYASH_FEATURES", "stage3");
|
||||
std::env::set_var("NYASH_DISABLE_PLUGINS", "1");
|
||||
|
||||
let src = r#"
|
||||
@ -128,8 +125,7 @@ static box Main {
|
||||
);
|
||||
|
||||
// クリーンアップ
|
||||
std::env::remove_var("NYASH_PARSER_STAGE3");
|
||||
std::env::remove_var("HAKO_PARSER_STAGE3");
|
||||
std::env::remove_var("NYASH_FEATURES");
|
||||
std::env::remove_var("NYASH_DISABLE_PLUGINS");
|
||||
}
|
||||
|
||||
@ -166,8 +162,7 @@ static box Main {
|
||||
|
||||
// Route A: Legacy path (flag OFF)
|
||||
std::env::remove_var("HAKO_JOINIR_PRINT_TOKENS_MAIN");
|
||||
std::env::set_var("NYASH_PARSER_STAGE3", "1");
|
||||
std::env::set_var("HAKO_PARSER_STAGE3", "1");
|
||||
std::env::set_var("NYASH_FEATURES", "stage3");
|
||||
std::env::set_var("NYASH_DISABLE_PLUGINS", "1");
|
||||
|
||||
let ast_a: ASTNode =
|
||||
@ -183,9 +178,8 @@ static box Main {
|
||||
let blocks_a: usize = module_a.functions.values().map(|f| f.blocks.len()).sum();
|
||||
|
||||
// Route B: JoinIR Frontend path (flag ON)
|
||||
// Re-set parser flags to ensure they're active
|
||||
std::env::set_var("NYASH_PARSER_STAGE3", "1");
|
||||
std::env::set_var("HAKO_PARSER_STAGE3", "1");
|
||||
// Re-set flags to ensure they're active
|
||||
std::env::set_var("NYASH_FEATURES", "stage3");
|
||||
std::env::set_var("NYASH_DISABLE_PLUGINS", "1");
|
||||
std::env::set_var("HAKO_JOINIR_PRINT_TOKENS_MAIN", "1");
|
||||
|
||||
@ -213,8 +207,7 @@ static box Main {
|
||||
|
||||
// クリーンアップ
|
||||
std::env::remove_var("HAKO_JOINIR_PRINT_TOKENS_MAIN");
|
||||
std::env::remove_var("NYASH_PARSER_STAGE3");
|
||||
std::env::remove_var("HAKO_PARSER_STAGE3");
|
||||
std::env::remove_var("NYASH_FEATURES");
|
||||
std::env::remove_var("NYASH_DISABLE_PLUGINS");
|
||||
}
|
||||
|
||||
@ -229,8 +222,7 @@ fn phase49_joinir_array_filter_smoke() {
|
||||
// Phase 49-4 mainline route は dev フラグで制御
|
||||
std::env::set_var("HAKO_JOINIR_ARRAY_FILTER_MAIN", "1");
|
||||
std::env::set_var("NYASH_JOINIR_MAINLINE_DEBUG", "1");
|
||||
std::env::set_var("NYASH_PARSER_STAGE3", "1");
|
||||
std::env::set_var("HAKO_PARSER_STAGE3", "1");
|
||||
std::env::set_var("NYASH_FEATURES", "stage3");
|
||||
std::env::set_var("NYASH_DISABLE_PLUGINS", "1");
|
||||
|
||||
// ArrayExtBox.filter 簡易実装(if-in-loop パターン)
|
||||
@ -274,8 +266,7 @@ static box Main {
|
||||
// クリーンアップ
|
||||
std::env::remove_var("HAKO_JOINIR_ARRAY_FILTER_MAIN");
|
||||
std::env::remove_var("NYASH_JOINIR_MAINLINE_DEBUG");
|
||||
std::env::remove_var("NYASH_PARSER_STAGE3");
|
||||
std::env::remove_var("HAKO_PARSER_STAGE3");
|
||||
std::env::remove_var("NYASH_FEATURES");
|
||||
std::env::remove_var("NYASH_DISABLE_PLUGINS");
|
||||
}
|
||||
|
||||
@ -284,8 +275,7 @@ static box Main {
|
||||
fn phase49_joinir_array_filter_fallback() {
|
||||
// dev フラグ OFF
|
||||
std::env::remove_var("HAKO_JOINIR_ARRAY_FILTER_MAIN");
|
||||
std::env::set_var("NYASH_PARSER_STAGE3", "1");
|
||||
std::env::set_var("HAKO_PARSER_STAGE3", "1");
|
||||
std::env::set_var("NYASH_FEATURES", "stage3");
|
||||
std::env::set_var("NYASH_DISABLE_PLUGINS", "1");
|
||||
|
||||
let src = r#"
|
||||
@ -325,8 +315,7 @@ static box Main {
|
||||
);
|
||||
|
||||
// クリーンアップ
|
||||
std::env::remove_var("NYASH_PARSER_STAGE3");
|
||||
std::env::remove_var("HAKO_PARSER_STAGE3");
|
||||
std::env::remove_var("NYASH_FEATURES");
|
||||
std::env::remove_var("NYASH_DISABLE_PLUGINS");
|
||||
}
|
||||
|
||||
@ -360,8 +349,7 @@ static box Main {
|
||||
|
||||
// Route A: Legacy path (flag OFF)
|
||||
std::env::remove_var("HAKO_JOINIR_ARRAY_FILTER_MAIN");
|
||||
std::env::set_var("NYASH_PARSER_STAGE3", "1");
|
||||
std::env::set_var("HAKO_PARSER_STAGE3", "1");
|
||||
std::env::set_var("NYASH_FEATURES", "stage3");
|
||||
std::env::set_var("NYASH_DISABLE_PLUGINS", "1");
|
||||
|
||||
let ast_a: ASTNode =
|
||||
@ -377,8 +365,7 @@ static box Main {
|
||||
let blocks_a: usize = module_a.functions.values().map(|f| f.blocks.len()).sum();
|
||||
|
||||
// Route B: JoinIR Frontend path (flag ON)
|
||||
std::env::set_var("NYASH_PARSER_STAGE3", "1");
|
||||
std::env::set_var("HAKO_PARSER_STAGE3", "1");
|
||||
std::env::set_var("NYASH_FEATURES", "stage3");
|
||||
std::env::set_var("NYASH_DISABLE_PLUGINS", "1");
|
||||
std::env::set_var("HAKO_JOINIR_ARRAY_FILTER_MAIN", "1");
|
||||
|
||||
@ -402,7 +389,6 @@ static box Main {
|
||||
|
||||
// クリーンアップ
|
||||
std::env::remove_var("HAKO_JOINIR_ARRAY_FILTER_MAIN");
|
||||
std::env::remove_var("NYASH_PARSER_STAGE3");
|
||||
std::env::remove_var("HAKO_PARSER_STAGE3");
|
||||
std::env::remove_var("NYASH_FEATURES");
|
||||
std::env::remove_var("NYASH_DISABLE_PLUGINS");
|
||||
}
|
||||
|
||||
@ -307,8 +307,7 @@ impl SnapshotCase {
|
||||
/// ケースに対応する JoinIR JSON を生成
|
||||
fn generate_joinir_json(case: SnapshotCase) -> Option<String> {
|
||||
// Stage-3 parser を有効化
|
||||
std::env::set_var("NYASH_PARSER_STAGE3", "1");
|
||||
std::env::set_var("HAKO_PARSER_STAGE3", "1");
|
||||
std::env::set_var("NYASH_FEATURES", "stage3");
|
||||
|
||||
let src = std::fs::read_to_string(case.source_file()).ok()?;
|
||||
|
||||
@ -463,8 +462,7 @@ use crate::mir::join_ir_vm_bridge::convert_joinir_to_mir;
|
||||
#[test]
|
||||
fn joinir_stageb_body_structure_test() {
|
||||
// Stage-3 parser を有効化
|
||||
std::env::set_var("NYASH_PARSER_STAGE3", "1");
|
||||
std::env::set_var("HAKO_PARSER_STAGE3", "1");
|
||||
std::env::set_var("NYASH_FEATURES", "stage3");
|
||||
|
||||
let src = match std::fs::read_to_string("apps/tests/stageb_body_extract_minimal.hako") {
|
||||
Ok(s) => s,
|
||||
@ -552,8 +550,7 @@ fn joinir_stageb_body_structure_test() {
|
||||
#[test]
|
||||
fn joinir_stageb_funcscanner_structure_test() {
|
||||
// Stage-3 parser を有効化
|
||||
std::env::set_var("NYASH_PARSER_STAGE3", "1");
|
||||
std::env::set_var("HAKO_PARSER_STAGE3", "1");
|
||||
std::env::set_var("NYASH_FEATURES", "stage3");
|
||||
|
||||
let src = match std::fs::read_to_string("apps/tests/stageb_funcscanner_scan_boxes_minimal.hako")
|
||||
{
|
||||
|
||||
@ -28,8 +28,7 @@ fn joinir_runner_minimal_skip_ws_executes() {
|
||||
return;
|
||||
}
|
||||
|
||||
std::env::set_var("NYASH_PARSER_STAGE3", "1");
|
||||
std::env::set_var("HAKO_PARSER_STAGE3", "1");
|
||||
std::env::set_var("NYASH_FEATURES", "stage3");
|
||||
std::env::set_var("NYASH_DISABLE_PLUGINS", "1");
|
||||
// 無限ループ検出のため、実験テストではステップ上限を小さめに設定しておく。
|
||||
// 0 は「上限なし」なので、ここでは明示的な上限を使う。
|
||||
@ -75,8 +74,7 @@ static box Runner {
|
||||
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_FEATURES");
|
||||
std::env::remove_var("NYASH_DISABLE_PLUGINS");
|
||||
std::env::remove_var("NYASH_VM_MAX_STEPS");
|
||||
}
|
||||
@ -88,8 +86,7 @@ fn joinir_runner_funcscanner_trim_executes() {
|
||||
return;
|
||||
}
|
||||
|
||||
std::env::set_var("NYASH_PARSER_STAGE3", "1");
|
||||
std::env::set_var("HAKO_PARSER_STAGE3", "1");
|
||||
std::env::set_var("NYASH_FEATURES", "stage3");
|
||||
std::env::set_var("NYASH_ENABLE_USING", "1");
|
||||
std::env::set_var("HAKO_ENABLE_USING", "1");
|
||||
std::env::set_var("NYASH_DISABLE_PLUGINS", "1");
|
||||
@ -137,8 +134,7 @@ static box Runner {
|
||||
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_FEATURES");
|
||||
std::env::remove_var("NYASH_ENABLE_USING");
|
||||
std::env::remove_var("HAKO_ENABLE_USING");
|
||||
std::env::remove_var("NYASH_DISABLE_PLUGINS");
|
||||
|
||||
@ -35,8 +35,7 @@ fn joinir_vm_bridge_skip_ws_matches_direct_vm() {
|
||||
return;
|
||||
}
|
||||
|
||||
std::env::set_var("NYASH_PARSER_STAGE3", "1");
|
||||
std::env::set_var("HAKO_PARSER_STAGE3", "1");
|
||||
std::env::set_var("NYASH_FEATURES", "stage3");
|
||||
std::env::set_var("NYASH_DISABLE_PLUGINS", "1");
|
||||
std::env::set_var("NYASH_VM_MAX_STEPS", "100000");
|
||||
|
||||
@ -97,8 +96,7 @@ static box Runner {
|
||||
other => panic!("JoinIR VM bridge returned non-int value: {:?}", other),
|
||||
}
|
||||
|
||||
std::env::remove_var("NYASH_PARSER_STAGE3");
|
||||
std::env::remove_var("HAKO_PARSER_STAGE3");
|
||||
std::env::remove_var("NYASH_FEATURES");
|
||||
std::env::remove_var("NYASH_DISABLE_PLUGINS");
|
||||
std::env::remove_var("NYASH_VM_MAX_STEPS");
|
||||
}
|
||||
|
||||
@ -109,8 +109,7 @@ fn joinir_vm_bridge_stage1_usingresolver_empty_entries() {
|
||||
}
|
||||
|
||||
// Stage-3 parser 有効化
|
||||
std::env::set_var("NYASH_PARSER_STAGE3", "1");
|
||||
std::env::set_var("HAKO_PARSER_STAGE3", "1");
|
||||
std::env::set_var("NYASH_FEATURES", "stage3");
|
||||
std::env::set_var("NYASH_DISABLE_PLUGINS", "1");
|
||||
std::env::set_var("NYASH_VM_MAX_STEPS", "100000");
|
||||
|
||||
@ -181,8 +180,7 @@ fn joinir_vm_bridge_stage1_usingresolver_empty_entries() {
|
||||
);
|
||||
|
||||
// クリーンアップ
|
||||
std::env::remove_var("NYASH_PARSER_STAGE3");
|
||||
std::env::remove_var("HAKO_PARSER_STAGE3");
|
||||
std::env::remove_var("NYASH_FEATURES");
|
||||
std::env::remove_var("NYASH_DISABLE_PLUGINS");
|
||||
std::env::remove_var("NYASH_VM_MAX_STEPS");
|
||||
}
|
||||
@ -195,8 +193,7 @@ fn joinir_vm_bridge_stage1_usingresolver_with_entries() {
|
||||
}
|
||||
|
||||
// 環境変数を各テストで再設定(並列テスト対策)
|
||||
std::env::set_var("NYASH_PARSER_STAGE3", "1");
|
||||
std::env::set_var("HAKO_PARSER_STAGE3", "1");
|
||||
std::env::set_var("NYASH_FEATURES", "stage3");
|
||||
std::env::set_var("NYASH_DISABLE_PLUGINS", "1");
|
||||
std::env::set_var("NYASH_VM_MAX_STEPS", "100000");
|
||||
|
||||
@ -252,8 +249,7 @@ fn joinir_vm_bridge_stage1_usingresolver_with_entries() {
|
||||
eprintln!("[joinir_vm_bridge_test/stage1] ✅ With entries test passed");
|
||||
|
||||
// クリーンアップ
|
||||
std::env::remove_var("NYASH_PARSER_STAGE3");
|
||||
std::env::remove_var("HAKO_PARSER_STAGE3");
|
||||
std::env::remove_var("NYASH_FEATURES");
|
||||
std::env::remove_var("NYASH_DISABLE_PLUGINS");
|
||||
std::env::remove_var("NYASH_VM_MAX_STEPS");
|
||||
}
|
||||
@ -267,8 +263,7 @@ fn joinir_vm_bridge_stage1_usingresolver_route_b_execution() {
|
||||
return;
|
||||
}
|
||||
|
||||
std::env::set_var("NYASH_PARSER_STAGE3", "1");
|
||||
std::env::set_var("HAKO_PARSER_STAGE3", "1");
|
||||
std::env::set_var("NYASH_FEATURES", "stage3");
|
||||
std::env::set_var("NYASH_DISABLE_PLUGINS", "1");
|
||||
|
||||
let full_src = format!("{STAGE1_USINGRESOLVER_SOURCE}\n{RUNNER_SOURCE}");
|
||||
@ -333,8 +328,7 @@ fn joinir_vm_bridge_stage1_usingresolver_route_b_execution() {
|
||||
}
|
||||
}
|
||||
|
||||
std::env::remove_var("NYASH_PARSER_STAGE3");
|
||||
std::env::remove_var("HAKO_PARSER_STAGE3");
|
||||
std::env::remove_var("NYASH_FEATURES");
|
||||
std::env::remove_var("NYASH_DISABLE_PLUGINS");
|
||||
}
|
||||
|
||||
@ -347,8 +341,7 @@ fn joinir_vm_bridge_stage1_usingresolver_route_b_with_entries() {
|
||||
return;
|
||||
}
|
||||
|
||||
std::env::set_var("NYASH_PARSER_STAGE3", "1");
|
||||
std::env::set_var("HAKO_PARSER_STAGE3", "1");
|
||||
std::env::set_var("NYASH_FEATURES", "stage3");
|
||||
std::env::set_var("NYASH_DISABLE_PLUGINS", "1");
|
||||
|
||||
let full_src = format!("{STAGE1_USINGRESOLVER_SOURCE}\n{RUNNER_WITH_ENTRIES_SOURCE}");
|
||||
@ -421,8 +414,7 @@ fn joinir_vm_bridge_stage1_usingresolver_route_b_with_entries() {
|
||||
}
|
||||
}
|
||||
|
||||
std::env::remove_var("NYASH_PARSER_STAGE3");
|
||||
std::env::remove_var("HAKO_PARSER_STAGE3");
|
||||
std::env::remove_var("NYASH_FEATURES");
|
||||
std::env::remove_var("NYASH_DISABLE_PLUGINS");
|
||||
}
|
||||
|
||||
@ -431,8 +423,7 @@ fn joinir_vm_bridge_stage1_usingresolver_lowering_sanity() {
|
||||
// 常時実行:lowering が正しく動作するかの基本検証
|
||||
// (実行はしない、構造のみ確認)
|
||||
|
||||
std::env::set_var("NYASH_PARSER_STAGE3", "1");
|
||||
std::env::set_var("HAKO_PARSER_STAGE3", "1");
|
||||
std::env::set_var("NYASH_FEATURES", "stage3");
|
||||
|
||||
let full_src = format!("{STAGE1_USINGRESOLVER_SOURCE}\n{RUNNER_SOURCE}");
|
||||
|
||||
@ -454,6 +445,5 @@ fn joinir_vm_bridge_stage1_usingresolver_lowering_sanity() {
|
||||
let jm = join_module.unwrap();
|
||||
assert_eq!(jm.functions.len(), 2, "Expected 2 JoinIR functions");
|
||||
|
||||
std::env::remove_var("NYASH_PARSER_STAGE3");
|
||||
std::env::remove_var("HAKO_PARSER_STAGE3");
|
||||
std::env::remove_var("NYASH_FEATURES");
|
||||
}
|
||||
|
||||
@ -71,8 +71,7 @@ fn joinir_vm_bridge_trim_matches_direct_vm() {
|
||||
return;
|
||||
}
|
||||
|
||||
std::env::set_var("NYASH_PARSER_STAGE3", "1");
|
||||
std::env::set_var("HAKO_PARSER_STAGE3", "1");
|
||||
std::env::set_var("NYASH_FEATURES", "stage3");
|
||||
std::env::set_var("NYASH_DISABLE_PLUGINS", "1");
|
||||
std::env::set_var("NYASH_VM_MAX_STEPS", "100000");
|
||||
|
||||
@ -137,8 +136,7 @@ static box Runner {
|
||||
other => panic!("JoinIR VM bridge returned non-string value: {:?}", other),
|
||||
}
|
||||
|
||||
std::env::remove_var("NYASH_PARSER_STAGE3");
|
||||
std::env::remove_var("HAKO_PARSER_STAGE3");
|
||||
std::env::remove_var("NYASH_FEATURES");
|
||||
std::env::remove_var("NYASH_DISABLE_PLUGINS");
|
||||
std::env::remove_var("NYASH_VM_MAX_STEPS");
|
||||
}
|
||||
@ -150,8 +148,7 @@ fn joinir_vm_bridge_trim_edge_cases() {
|
||||
return;
|
||||
}
|
||||
|
||||
std::env::set_var("NYASH_PARSER_STAGE3", "1");
|
||||
std::env::set_var("HAKO_PARSER_STAGE3", "1");
|
||||
std::env::set_var("NYASH_FEATURES", "stage3");
|
||||
std::env::set_var("NYASH_DISABLE_PLUGINS", "1");
|
||||
|
||||
// Test cases: (input, expected_output)
|
||||
@ -168,8 +165,7 @@ fn joinir_vm_bridge_trim_edge_cases() {
|
||||
for (input, expected) in test_cases {
|
||||
// Re-set environment variables at each iteration to avoid race conditions
|
||||
// with parallel test execution
|
||||
std::env::set_var("NYASH_PARSER_STAGE3", "1");
|
||||
std::env::set_var("HAKO_PARSER_STAGE3", "1");
|
||||
std::env::set_var("NYASH_FEATURES", "stage3");
|
||||
std::env::set_var("NYASH_DISABLE_PLUGINS", "1");
|
||||
|
||||
let runner = format!(
|
||||
@ -215,7 +211,6 @@ static box Runner {{
|
||||
}
|
||||
}
|
||||
|
||||
std::env::remove_var("NYASH_PARSER_STAGE3");
|
||||
std::env::remove_var("HAKO_PARSER_STAGE3");
|
||||
std::env::remove_var("NYASH_FEATURES");
|
||||
std::env::remove_var("NYASH_DISABLE_PLUGINS");
|
||||
}
|
||||
|
||||
@ -41,8 +41,7 @@ fn mir_joinir_funcscanner_append_defs_auto_lowering() {
|
||||
// Step 1: MIR までコンパイル
|
||||
// Phase 27.14: Minimal .hako file to avoid complex dependencies
|
||||
// Stage-3 parser を有効化(local キーワード対応)
|
||||
std::env::set_var("NYASH_PARSER_STAGE3", "1");
|
||||
std::env::set_var("HAKO_PARSER_STAGE3", "1");
|
||||
std::env::set_var("NYASH_FEATURES", "stage3");
|
||||
|
||||
let test_file = "apps/tests/funcscanner_append_defs_minimal.hako";
|
||||
let src = std::fs::read_to_string(test_file)
|
||||
@ -181,8 +180,7 @@ fn mir_joinir_funcscanner_append_defs_generic_matches_handwritten() {
|
||||
return;
|
||||
}
|
||||
|
||||
std::env::set_var("NYASH_PARSER_STAGE3", "1");
|
||||
std::env::set_var("HAKO_PARSER_STAGE3", "1");
|
||||
std::env::set_var("NYASH_FEATURES", "stage3");
|
||||
|
||||
let test_file = "apps/tests/funcscanner_append_defs_minimal.hako";
|
||||
let src = std::fs::read_to_string(test_file)
|
||||
|
||||
@ -10,11 +10,10 @@
|
||||
// - デフォルトでは #[ignore] にしておいて手動実行用にする
|
||||
// - 環境変数 NYASH_JOINIR_EXPERIMENT=1 で実験モード有効化
|
||||
//
|
||||
// Phase 27.4-C 対応:
|
||||
// Phase 27.4-C 対応(現状メモのみ):
|
||||
// - このテストは JoinIR 変換のみを検証(VM 実行なし)
|
||||
// - NYASH_JOINIR_HEADER_EXP=1 を併用すると Header φ bypass が有効化される
|
||||
// - bypass 時は MIR に Header φ が生成されないが、このテストでは JoinIR のみ検証するため問題なし
|
||||
// - 将来的に JoinIR runner 実行を追加する際は、bypass モードでも正しく動作することを確認する
|
||||
// - かつては Header φ bypass を有効化する JoinIR 実験フラグがあったが、
|
||||
// Phase 73 時点では削除済み(常時 OFF)となっている。
|
||||
//
|
||||
// Phase 27.5 対応:
|
||||
// - このテストは Header φ だけでなく、Exit φ(e の合流+substring(b, e) 呼び出し)も JoinIR で k_exit として表現できることを検証
|
||||
@ -39,8 +38,7 @@ fn mir_joinir_funcscanner_trim_auto_lowering() {
|
||||
}
|
||||
|
||||
// Stage-3 parser を有効化(local キーワード対応)
|
||||
std::env::set_var("NYASH_PARSER_STAGE3", "1");
|
||||
std::env::set_var("HAKO_PARSER_STAGE3", "1");
|
||||
std::env::set_var("NYASH_FEATURES", "stage3");
|
||||
std::env::set_var("NYASH_ENABLE_USING", "1");
|
||||
std::env::set_var("HAKO_ENABLE_USING", "1");
|
||||
|
||||
@ -137,8 +135,6 @@ fn mir_joinir_funcscanner_trim_generic_matches_handwritten() {
|
||||
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");
|
||||
|
||||
|
||||
@ -129,7 +129,7 @@ mod tests {
|
||||
#[test]
|
||||
fn test_if_select_pattern_matching() {
|
||||
// ==== 1. Simple pattern (env ON) ====
|
||||
std::env::set_var("NYASH_JOINIR_IF_SELECT", "1");
|
||||
std::env::set_var("HAKO_JOINIR_IF_SELECT", "1");
|
||||
|
||||
let func = create_simple_pattern_mir();
|
||||
let entry_block = func.entry_block;
|
||||
@ -185,21 +185,18 @@ mod tests {
|
||||
}
|
||||
|
||||
// ==== 3. Disabled by default (env OFF) ====
|
||||
std::env::remove_var("NYASH_JOINIR_IF_SELECT");
|
||||
std::env::remove_var("HAKO_JOINIR_IF_SELECT");
|
||||
|
||||
let func = create_simple_pattern_mir();
|
||||
let entry_block = func.entry_block;
|
||||
let result = try_lower_if_to_joinir(&func, entry_block, false, None); // Phase 61-1: Pure If
|
||||
|
||||
assert!(
|
||||
result.is_none(),
|
||||
"Expected None when NYASH_JOINIR_IF_SELECT is not set"
|
||||
);
|
||||
assert!(result.is_none(), "Expected None when IfSelect toggle is not set");
|
||||
|
||||
eprintln!("✅ If/Select lowering correctly disabled by default");
|
||||
|
||||
// ==== 4. Wrong function name (env ON) ====
|
||||
std::env::set_var("NYASH_JOINIR_IF_SELECT", "1");
|
||||
std::env::set_var("HAKO_JOINIR_IF_SELECT", "1");
|
||||
|
||||
let mut func = create_simple_pattern_mir();
|
||||
func.signature.name = "WrongName.test/1".to_string();
|
||||
@ -214,7 +211,7 @@ mod tests {
|
||||
eprintln!("✅ Function name filter working correctly");
|
||||
|
||||
// Clean up
|
||||
std::env::remove_var("NYASH_JOINIR_IF_SELECT");
|
||||
std::env::remove_var("HAKO_JOINIR_IF_SELECT");
|
||||
}
|
||||
|
||||
// ============================================================================
|
||||
@ -520,7 +517,7 @@ mod tests {
|
||||
fn test_if_merge_simple_pattern() {
|
||||
use crate::mir::join_ir::JoinInst;
|
||||
|
||||
std::env::set_var("NYASH_JOINIR_IF_SELECT", "1");
|
||||
std::env::set_var("HAKO_JOINIR_IF_SELECT", "1");
|
||||
|
||||
let func = create_if_merge_simple_pattern_mir();
|
||||
let entry_block = func.entry_block;
|
||||
@ -553,7 +550,7 @@ mod tests {
|
||||
panic!("Expected JoinInst::IfMerge, got {:?}", result);
|
||||
}
|
||||
|
||||
std::env::remove_var("NYASH_JOINIR_IF_SELECT");
|
||||
std::env::remove_var("HAKO_JOINIR_IF_SELECT");
|
||||
}
|
||||
|
||||
/// Phase 33-7: Test IfMerge lowering for 3-variable pattern
|
||||
@ -561,7 +558,7 @@ mod tests {
|
||||
fn test_if_merge_multiple_pattern() {
|
||||
use crate::mir::join_ir::JoinInst;
|
||||
|
||||
std::env::set_var("NYASH_JOINIR_IF_SELECT", "1");
|
||||
std::env::set_var("HAKO_JOINIR_IF_SELECT", "1");
|
||||
|
||||
let func = create_if_merge_multiple_pattern_mir();
|
||||
let entry_block = func.entry_block;
|
||||
@ -594,7 +591,7 @@ mod tests {
|
||||
panic!("Expected JoinInst::IfMerge, got {:?}", result);
|
||||
}
|
||||
|
||||
std::env::remove_var("NYASH_JOINIR_IF_SELECT");
|
||||
std::env::remove_var("HAKO_JOINIR_IF_SELECT");
|
||||
}
|
||||
|
||||
/// Phase 63-2: Helper to create a simple pattern MIR with Const instructions
|
||||
@ -656,7 +653,7 @@ mod tests {
|
||||
fn test_type_hint_propagation_simple() {
|
||||
use crate::mir::MirType;
|
||||
|
||||
std::env::set_var("NYASH_JOINIR_IF_SELECT", "1");
|
||||
std::env::set_var("HAKO_JOINIR_IF_SELECT", "1");
|
||||
|
||||
let func = create_simple_pattern_mir_with_const();
|
||||
let entry_block = func.entry_block;
|
||||
@ -681,7 +678,7 @@ mod tests {
|
||||
panic!("Expected Select instruction with type_hint");
|
||||
}
|
||||
|
||||
std::env::remove_var("NYASH_JOINIR_IF_SELECT");
|
||||
std::env::remove_var("HAKO_JOINIR_IF_SELECT");
|
||||
}
|
||||
|
||||
/// Phase 63-6-4: A/B テスト - Route A (legacy) vs Route B (type hint)
|
||||
@ -693,7 +690,7 @@ mod tests {
|
||||
fn test_p1_ab_type_inference() {
|
||||
use crate::mir::MirType;
|
||||
|
||||
std::env::set_var("NYASH_JOINIR_IF_SELECT", "1");
|
||||
std::env::set_var("HAKO_JOINIR_IF_SELECT", "1");
|
||||
|
||||
// P1 Simple pattern で Select 生成
|
||||
let func = create_simple_pattern_mir_with_const();
|
||||
@ -720,7 +717,7 @@ mod tests {
|
||||
eprintln!("✅ Phase 63-6-4 Step 2: P1 function name filter: IfSelectTest.* ✓");
|
||||
eprintln!("✅ Phase 63-6-4: A/B test passed - JoinIR type hint available for lifecycle.rs");
|
||||
|
||||
std::env::remove_var("NYASH_JOINIR_IF_SELECT");
|
||||
std::env::remove_var("HAKO_JOINIR_IF_SELECT");
|
||||
}
|
||||
|
||||
/// Phase 64-2-2: A/B テスト - P2 IfMerge Simple 型ヒント検証
|
||||
|
||||
@ -31,8 +31,7 @@ fn mir_joinir_min_manual_construction() {
|
||||
|
||||
// Step 1: MIR までコンパイル(既存パイプラインで)
|
||||
// Stage-3 環境変数を設定(local キーワード対応)
|
||||
std::env::set_var("NYASH_PARSER_STAGE3", "1");
|
||||
std::env::set_var("HAKO_PARSER_STAGE3", "1");
|
||||
std::env::set_var("NYASH_FEATURES", "stage3");
|
||||
|
||||
let test_file = "apps/tests/joinir_min_loop.hako";
|
||||
let src = std::fs::read_to_string(test_file)
|
||||
@ -148,8 +147,7 @@ fn mir_joinir_min_auto_lowering() {
|
||||
}
|
||||
|
||||
// Step 1: MIR までコンパイル
|
||||
std::env::set_var("NYASH_PARSER_STAGE3", "1");
|
||||
std::env::set_var("HAKO_PARSER_STAGE3", "1");
|
||||
std::env::set_var("NYASH_FEATURES", "stage3");
|
||||
|
||||
let test_file = "apps/tests/joinir_min_loop.hako";
|
||||
let src = std::fs::read_to_string(test_file)
|
||||
|
||||
@ -10,11 +10,10 @@
|
||||
// - デフォルトでは #[ignore] にしておいて手動実行用にする
|
||||
// - 環境変数 NYASH_JOINIR_EXPERIMENT=1 で実験モード有効化
|
||||
//
|
||||
// Phase 27.4-C 対応:
|
||||
// Phase 27.4-C 対応(現状メモのみ):
|
||||
// - このテストは JoinIR 変換のみを検証(VM 実行なし)
|
||||
// - NYASH_JOINIR_HEADER_EXP=1 を併用すると Header φ bypass が有効化される
|
||||
// - bypass 時は MIR に Header φ が生成されないが、このテストでは JoinIR のみ検証するため問題なし
|
||||
// - 将来的に JoinIR runner 実行を追加する際は、bypass モードでも正しく動作することを確認する
|
||||
// - かつては Header φ bypass を有効化する JoinIR 実験フラグがあったが、
|
||||
// Phase 73 時点では削除済み(常時 OFF)となっている。
|
||||
//
|
||||
// Phase 27.5 対応:
|
||||
// - このテストは Header φ だけでなく、Exit φ(i の合流)も JoinIR で k_exit(i) として表現できていることを検証
|
||||
@ -41,8 +40,7 @@ fn mir_joinir_skip_ws_auto_lowering() {
|
||||
|
||||
// Step 1: MIR までコンパイル
|
||||
// Stage-3 parser を有効化(local キーワード対応)
|
||||
std::env::set_var("NYASH_PARSER_STAGE3", "1");
|
||||
std::env::set_var("HAKO_PARSER_STAGE3", "1");
|
||||
std::env::set_var("NYASH_FEATURES", "stage3");
|
||||
|
||||
let test_file = "apps/tests/minimal_ssa_skip_ws.hako";
|
||||
let src = std::fs::read_to_string(test_file)
|
||||
@ -129,8 +127,7 @@ fn mir_joinir_skip_ws_generic_matches_handwritten() {
|
||||
}
|
||||
|
||||
// Stage-3 parserを有効化
|
||||
std::env::set_var("NYASH_PARSER_STAGE3", "1");
|
||||
std::env::set_var("HAKO_PARSER_STAGE3", "1");
|
||||
std::env::set_var("NYASH_FEATURES", "stage3");
|
||||
|
||||
let test_file = "apps/tests/minimal_ssa_skip_ws.hako";
|
||||
let src = std::fs::read_to_string(test_file)
|
||||
|
||||
@ -41,8 +41,7 @@ fn mir_joinir_stage1_using_resolver_auto_lowering() {
|
||||
// Step 1: MIR までコンパイル
|
||||
// Phase 27.13: Minimal .hako file to avoid `using` statement parser issues
|
||||
// Stage-3 parser を有効化(local キーワード対応)
|
||||
std::env::set_var("NYASH_PARSER_STAGE3", "1");
|
||||
std::env::set_var("HAKO_PARSER_STAGE3", "1");
|
||||
std::env::set_var("NYASH_FEATURES", "stage3");
|
||||
|
||||
let test_file = "apps/tests/stage1_usingresolver_minimal.hako";
|
||||
let src = std::fs::read_to_string(test_file)
|
||||
@ -152,8 +151,7 @@ fn mir_joinir_stage1_using_resolver_generic_matches_handwritten() {
|
||||
return;
|
||||
}
|
||||
|
||||
std::env::set_var("NYASH_PARSER_STAGE3", "1");
|
||||
std::env::set_var("HAKO_PARSER_STAGE3", "1");
|
||||
std::env::set_var("NYASH_FEATURES", "stage3");
|
||||
|
||||
let test_file = "apps/tests/stage1_usingresolver_minimal.hako";
|
||||
let src = std::fs::read_to_string(test_file)
|
||||
|
||||
@ -25,8 +25,7 @@ fn mir_joinir_stageb_body_auto_lowering() {
|
||||
}
|
||||
|
||||
// Stage-3 パーサを有効化(local/loop を安全に扱うため)
|
||||
std::env::set_var("NYASH_PARSER_STAGE3", "1");
|
||||
std::env::set_var("HAKO_PARSER_STAGE3", "1");
|
||||
std::env::set_var("NYASH_FEATURES", "stage3");
|
||||
|
||||
let test_file = "apps/tests/stageb_body_extract_minimal.hako";
|
||||
let src = std::fs::read_to_string(test_file)
|
||||
|
||||
@ -23,8 +23,7 @@ fn mir_joinir_stageb_funcscanner_auto_lowering() {
|
||||
}
|
||||
|
||||
// Stage-3 パーサを有効化
|
||||
std::env::set_var("NYASH_PARSER_STAGE3", "1");
|
||||
std::env::set_var("HAKO_PARSER_STAGE3", "1");
|
||||
std::env::set_var("NYASH_FEATURES", "stage3");
|
||||
|
||||
let test_file = "apps/tests/stageb_funcscanner_scan_boxes_minimal.hako";
|
||||
let src = std::fs::read_to_string(test_file)
|
||||
|
||||
@ -10,16 +10,14 @@ use crate::mir::{MirCompiler, MirVerifier};
|
||||
use crate::parser::NyashParser;
|
||||
|
||||
fn setup_stage3_env() {
|
||||
std::env::set_var("NYASH_PARSER_STAGE3", "1");
|
||||
std::env::set_var("HAKO_PARSER_STAGE3", "1");
|
||||
std::env::set_var("NYASH_FEATURES", "stage3");
|
||||
std::env::set_var("NYASH_ENABLE_USING", "1");
|
||||
std::env::set_var("HAKO_ENABLE_USING", "1");
|
||||
std::env::set_var("NYASH_DISABLE_PLUGINS", "1");
|
||||
}
|
||||
|
||||
fn teardown_stage3_env() {
|
||||
std::env::remove_var("NYASH_PARSER_STAGE3");
|
||||
std::env::remove_var("HAKO_PARSER_STAGE3");
|
||||
std::env::remove_var("NYASH_FEATURES");
|
||||
std::env::remove_var("NYASH_ENABLE_USING");
|
||||
std::env::remove_var("HAKO_ENABLE_USING");
|
||||
std::env::remove_var("NYASH_DISABLE_PLUGINS");
|
||||
|
||||
@ -8,16 +8,14 @@ use crate::mir::{MirCompiler, MirVerifier};
|
||||
use crate::parser::NyashParser;
|
||||
|
||||
fn setup_stage3_env() {
|
||||
std::env::set_var("NYASH_PARSER_STAGE3", "1");
|
||||
std::env::set_var("HAKO_PARSER_STAGE3", "1");
|
||||
std::env::set_var("NYASH_FEATURES", "stage3");
|
||||
std::env::set_var("NYASH_ENABLE_USING", "1");
|
||||
std::env::set_var("HAKO_ENABLE_USING", "1");
|
||||
std::env::set_var("NYASH_DISABLE_PLUGINS", "1");
|
||||
}
|
||||
|
||||
fn teardown_stage3_env() {
|
||||
std::env::remove_var("NYASH_PARSER_STAGE3");
|
||||
std::env::remove_var("HAKO_PARSER_STAGE3");
|
||||
std::env::remove_var("NYASH_FEATURES");
|
||||
std::env::remove_var("NYASH_ENABLE_USING");
|
||||
std::env::remove_var("HAKO_ENABLE_USING");
|
||||
std::env::remove_var("NYASH_DISABLE_PLUGINS");
|
||||
|
||||
@ -14,7 +14,7 @@ fn test_loopform_exit_phi_single_break() {
|
||||
// Enable MIR verification and debug traces
|
||||
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_FEATURES", "stage3");
|
||||
std::env::set_var("NYASH_PARSER_ALLOW_SEMICOLON", "1");
|
||||
|
||||
let src = r#"
|
||||
@ -76,7 +76,7 @@ fn test_loopform_exit_phi_multiple_breaks() {
|
||||
// LoopForm PHI v2 はデフォルト実装(フラグ不要)
|
||||
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_FEATURES", "stage3");
|
||||
std::env::set_var("NYASH_PARSER_ALLOW_SEMICOLON", "1");
|
||||
|
||||
let src = r#"
|
||||
@ -114,7 +114,7 @@ fn test_loopform_exit_phi_nested_if_break() {
|
||||
// LoopForm PHI v2 はデフォルト実装(フラグ不要)
|
||||
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_FEATURES", "stage3");
|
||||
std::env::set_var("NYASH_PARSER_ALLOW_SEMICOLON", "1");
|
||||
|
||||
let src = r#"
|
||||
@ -157,7 +157,6 @@ fn test_loopform_exit_phi_multiple_vars() {
|
||||
// LoopForm PHI v2 はデフォルト実装(フラグ不要)
|
||||
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#"
|
||||
@ -203,7 +202,6 @@ static box TestMultiVars {
|
||||
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#"
|
||||
|
||||
@ -5,8 +5,7 @@ use crate::mir::{instruction::MirInstruction, types::CompareOp, MirCompiler, Mir
|
||||
use crate::parser::NyashParser;
|
||||
|
||||
fn ensure_stage3_env() {
|
||||
std::env::set_var("NYASH_PARSER_STAGE3", "1");
|
||||
std::env::set_var("HAKO_PARSER_STAGE3", "1");
|
||||
std::env::set_var("NYASH_FEATURES", "stage3");
|
||||
std::env::set_var("NYASH_ENABLE_USING", "1");
|
||||
std::env::set_var("HAKO_ENABLE_USING", "1");
|
||||
// このフィクスチャは静的 box Stage1Cli を新規に定義するため、
|
||||
|
||||
@ -5,8 +5,7 @@ use crate::parser::NyashParser;
|
||||
#[test]
|
||||
fn mir_stage1_cli_stage1_main_compiles_and_verifies() {
|
||||
// Stage‑3 + using を有効化して stage1_cli.hako をそのままパースする。
|
||||
std::env::set_var("NYASH_PARSER_STAGE3", "1");
|
||||
std::env::set_var("HAKO_PARSER_STAGE3", "1");
|
||||
std::env::set_var("NYASH_FEATURES", "stage3");
|
||||
std::env::set_var("NYASH_PARSER_ALLOW_SEMICOLON", "1");
|
||||
std::env::set_var("NYASH_ENABLE_USING", "1");
|
||||
std::env::set_var("HAKO_ENABLE_USING", "1");
|
||||
|
||||
@ -30,8 +30,7 @@ use crate::mir::{instruction::MirInstruction, MirCompiler, MirVerifier};
|
||||
use crate::parser::NyashParser;
|
||||
|
||||
fn ensure_stage3_env() {
|
||||
std::env::set_var("NYASH_PARSER_STAGE3", "1");
|
||||
std::env::set_var("HAKO_PARSER_STAGE3", "1");
|
||||
std::env::set_var("NYASH_FEATURES", "stage3");
|
||||
std::env::set_var("NYASH_ENABLE_USING", "1");
|
||||
std::env::set_var("HAKO_ENABLE_USING", "1");
|
||||
}
|
||||
|
||||
@ -4,7 +4,7 @@ use crate::mir::{MirCompiler, MirVerifier};
|
||||
use crate::parser::NyashParser;
|
||||
|
||||
fn ensure_stage3_env() {
|
||||
std::env::set_var("NYASH_PARSER_STAGE3", "1");
|
||||
std::env::set_var("NYASH_FEATURES", "stage3");
|
||||
std::env::set_var("NYASH_PARSER_ALLOW_SEMICOLON", "1");
|
||||
std::env::set_var("NYASH_ENABLE_USING", "1");
|
||||
std::env::set_var("HAKO_ENABLE_USING", "1");
|
||||
|
||||
@ -8,7 +8,7 @@ use crate::parser::NyashParser;
|
||||
#[test]
|
||||
fn mir_stage1_cli_entry_like_pattern_verifies() {
|
||||
// Enable Stage‑3 and using so the parser accepts modern syntax.
|
||||
std::env::set_var("NYASH_PARSER_STAGE3", "1");
|
||||
std::env::set_var("NYASH_FEATURES", "stage3");
|
||||
std::env::set_var("NYASH_PARSER_ALLOW_SEMICOLON", "1");
|
||||
std::env::set_var("NYASH_ENABLE_USING", "1");
|
||||
std::env::set_var("HAKO_ENABLE_USING", "1");
|
||||
@ -51,7 +51,7 @@ static box Stage1CliEntryLike {
|
||||
/// Shape test: env-only の最小ディスパッチャで SSA/PHI 崩れない形を固定する。
|
||||
#[test]
|
||||
fn mir_stage1_cli_stage1_main_shape_verifies() {
|
||||
std::env::set_var("NYASH_PARSER_STAGE3", "1");
|
||||
std::env::set_var("NYASH_FEATURES", "stage3");
|
||||
std::env::set_var("NYASH_PARSER_ALLOW_SEMICOLON", "1");
|
||||
std::env::set_var("NYASH_ENABLE_USING", "1");
|
||||
std::env::set_var("HAKO_ENABLE_USING", "1");
|
||||
|
||||
@ -157,8 +157,8 @@ impl NyashTokenizer {
|
||||
start_column,
|
||||
))
|
||||
}
|
||||
// Stage‑3: シングルクォート文字列(オプトイン)
|
||||
Some('\'') if crate::config::env::parser_stage3() => {
|
||||
// Stage‑3: シングルクォート文字列(オプトイン、現行デフォルトON)
|
||||
Some('\'') if crate::config::env::parser_stage3_enabled() => {
|
||||
let string_value = self.read_single_quoted_string()?;
|
||||
Ok(Token::new(
|
||||
TokenType::STRING(string_value),
|
||||
|
||||
@ -66,8 +66,8 @@ impl NyashTokenizer {
|
||||
_ => TokenType::IDENTIFIER(identifier.clone()),
|
||||
};
|
||||
|
||||
// Stage-3 gate: LOCAL/FLOW/TRY/CATCH/THROW require NYASH_PARSER_STAGE3=1
|
||||
let stage3_enabled = crate::config::env::parser_stage3();
|
||||
// Stage-3 gate: LOCAL/FLOW/TRY/CATCH/THROW require Stage-3 parser (default ON)
|
||||
let stage3_enabled = crate::config::env::parser_stage3_enabled();
|
||||
if !stage3_enabled {
|
||||
let is_stage3 = matches!(
|
||||
tok,
|
||||
@ -83,7 +83,7 @@ impl NyashTokenizer {
|
||||
if is_stage3 {
|
||||
if std::env::var("NYASH_TOK_TRACE").ok().as_deref() == Some("1") {
|
||||
eprintln!(
|
||||
"[tok-stage3] Degrading {:?} to IDENTIFIER (NYASH_PARSER_STAGE3={})",
|
||||
"[tok-stage3] Degrading {:?} to IDENTIFIER (stage3_enabled={})",
|
||||
tok, stage3_enabled
|
||||
);
|
||||
}
|
||||
@ -104,7 +104,7 @@ impl NyashTokenizer {
|
||||
);
|
||||
if is_stage3 {
|
||||
eprintln!(
|
||||
"[tok-stage3] Keeping {:?} as keyword (NYASH_PARSER_STAGE3={})",
|
||||
"[tok-stage3] Keeping {:?} as keyword (stage3_enabled={})",
|
||||
tok, stage3_enabled
|
||||
);
|
||||
}
|
||||
|
||||
@ -110,8 +110,7 @@ fn call_hako_box(name: &str, ctx: &SsotCtx) -> Option<String> {
|
||||
.arg("vm")
|
||||
.arg(&path)
|
||||
// Parser/entry tolerances (same as smokes "safe" mode)
|
||||
.env("NYASH_PARSER_STAGE3", "1")
|
||||
.env("HAKO_PARSER_STAGE3", "1")
|
||||
.env("NYASH_FEATURES", "stage3")
|
||||
.env("NYASH_PARSER_ALLOW_SEMICOLON", "1")
|
||||
.env("NYASH_ENTRY_ALLOW_TOPLEVEL_MAIN", "1")
|
||||
// Disable inline compiler for stability
|
||||
|
||||
Reference in New Issue
Block a user