diff --git a/src/mir/builder/control_flow/joinir/routing.rs b/src/mir/builder/control_flow/joinir/routing.rs index e9ca6b5d..f0bfa28b 100644 --- a/src/mir/builder/control_flow/joinir/routing.rs +++ b/src/mir/builder/control_flow/joinir/routing.rs @@ -35,53 +35,65 @@ impl MirBuilder { // Phase 195: Use unified trace trace::trace().routing("router", &func_name, "try_cf_loop_joinir called"); - // Phase 49-4 + Phase 80: Multi-target routing - // - Core ON なら代表2本(print_tokens / ArrayExt.filter)は JoinIR を優先し、失敗したら LoopBuilder へフォールバック - // - Core OFF では従来通り dev フラグで opt-in - // Note: Arity does NOT include implicit `me` receiver - // Phase 188: Add "main" routing for loop pattern expansion - // Phase 170: Add JsonParserBox methods for selfhost validation - let core_on = crate::config::env::joinir_core_enabled(); - let is_target = match func_name.as_str() { - "main" => true, // Phase 188-Impl-1: Enable JoinIR for main function (Pattern 1) - "JoinIrMin.main/0" => true, // Phase 188-Impl-2: Enable JoinIR for JoinIrMin.main/0 (Pattern 2) - "JsonTokenizer.print_tokens/0" => { - if core_on { - true - } else { - std::env::var("HAKO_JOINIR_PRINT_TOKENS_MAIN") - .ok() - .as_deref() - == Some("1") - } - } - "ArrayExtBox.filter/2" => { - if core_on { - true - } else { - std::env::var("HAKO_JOINIR_ARRAY_FILTER_MAIN") - .ok() - .as_deref() - == Some("1") - } - } - // Phase 170-A-1: Enable JsonParserBox methods for JoinIR routing - "JsonParserBox._trim/1" => true, - "JsonParserBox._skip_whitespace/2" => true, - "JsonParserBox._match_literal/2" => true, - "JsonParserBox._parse_string/2" => true, - "JsonParserBox._parse_array/2" => true, - "JsonParserBox._parse_object/2" => true, - // Phase 170-A-1: Test methods (simplified versions) - "TrimTest.trim/1" => true, - "Main.trim/1" => true, // Phase 171-fix: Main box variant - "Main.trim_string_simple/1" => true, // Phase 33-13: Simple trim variant - "TrimTest.main/0" => true, // Phase 170: TrimTest.main for loop pattern test - _ => false, - }; + // Phase 170-4: Structure-based routing option + // When NYASH_JOINIR_STRUCTURE_ONLY=1, skip function name whitelist + // and route purely based on loop structure analysis + let structure_only = std::env::var("NYASH_JOINIR_STRUCTURE_ONLY") + .ok() + .as_deref() + == Some("1"); - if !is_target { - return Ok(None); + if structure_only { + trace::trace().routing("router", &func_name, "Structure-only mode enabled, skipping whitelist"); + } else { + // Phase 49-4 + Phase 80: Multi-target routing (legacy whitelist) + // - Core ON なら代表2本(print_tokens / ArrayExt.filter)は JoinIR を優先し、失敗したら LoopBuilder へフォールバック + // - Core OFF では従来通り dev フラグで opt-in + // Note: Arity does NOT include implicit `me` receiver + // Phase 188: Add "main" routing for loop pattern expansion + // Phase 170: Add JsonParserBox methods for selfhost validation + let core_on = crate::config::env::joinir_core_enabled(); + let is_target = match func_name.as_str() { + "main" => true, // Phase 188-Impl-1: Enable JoinIR for main function (Pattern 1) + "JoinIrMin.main/0" => true, // Phase 188-Impl-2: Enable JoinIR for JoinIrMin.main/0 (Pattern 2) + "JsonTokenizer.print_tokens/0" => { + if core_on { + true + } else { + std::env::var("HAKO_JOINIR_PRINT_TOKENS_MAIN") + .ok() + .as_deref() + == Some("1") + } + } + "ArrayExtBox.filter/2" => { + if core_on { + true + } else { + std::env::var("HAKO_JOINIR_ARRAY_FILTER_MAIN") + .ok() + .as_deref() + == Some("1") + } + } + // Phase 170-A-1: Enable JsonParserBox methods for JoinIR routing + "JsonParserBox._trim/1" => true, + "JsonParserBox._skip_whitespace/2" => true, + "JsonParserBox._match_literal/2" => true, + "JsonParserBox._parse_string/2" => true, + "JsonParserBox._parse_array/2" => true, + "JsonParserBox._parse_object/2" => true, + // Phase 170-A-1: Test methods (simplified versions) + "TrimTest.trim/1" => true, + "Main.trim/1" => true, // Phase 171-fix: Main box variant + "Main.trim_string_simple/1" => true, // Phase 33-13: Simple trim variant + "TrimTest.main/0" => true, // Phase 170: TrimTest.main for loop pattern test + _ => false, + }; + + if !is_target { + return Ok(None); + } } // Debug log when routing through JoinIR Frontend