feat(phase32): L-2.1 Stage-1 UsingResolver JoinIR integration + cleanup
Phase 32 L-2.1 complete implementation: 1. Stage-1 UsingResolver main line JoinIR connection - CFG-based LoopForm construction for resolve_for_source/5 - LoopToJoinLowerer integration with handwritten fallback - JSON snapshot tests 6/6 PASS 2. JoinIR/VM Bridge improvements - Simplified join_ir_vm_bridge.rs dispatch logic - Enhanced json.rs serialization - PHI core boxes cleanup (local_scope_inspector, loop_exit_liveness, loop_var_classifier) 3. Stage-1 CLI enhancements - Extended args.rs, groups.rs, mod.rs for new options - Improved stage1_bridge module (args, env, mod) - Updated stage1_cli.hako 4. MIR builder cleanup - Simplified if_form.rs control flow - Removed dead code from loop_builder.rs - Enhanced phi_merge.rs 5. Runner module updates - json_v0_bridge/lowering.rs improvements - dispatch.rs, selfhost.rs, modes/vm.rs cleanup 6. Documentation updates - CURRENT_TASK.md, AGENTS.md - Various docs/ updates 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
@ -2,13 +2,9 @@ use super::super::NyashRunner;
|
||||
use nyash_rust::{ast::ASTNode, mir::MirCompiler, parser::NyashParser};
|
||||
use std::{fs, process};
|
||||
|
||||
// Phase 30.x: JoinIR VM Bridge integration (experimental)
|
||||
// Phase 30 F-4.4: JoinIR VM Bridge dispatch (experimental)
|
||||
// Used only when NYASH_JOINIR_EXPERIMENT=1 AND NYASH_JOINIR_VM_BRIDGE=1
|
||||
use crate::config::env::{joinir_experiment_enabled, joinir_vm_bridge_enabled};
|
||||
use crate::mir::join_ir::{lower_funcscanner_trim_to_joinir, lower_skip_ws_to_joinir, JoinFuncId};
|
||||
use crate::mir::join_ir::lowering::stage1_using_resolver::lower_stage1_usingresolver_to_joinir;
|
||||
use crate::mir::join_ir_ops::JoinValue;
|
||||
use crate::mir::join_ir_vm_bridge::run_joinir_via_vm;
|
||||
use crate::mir::join_ir_vm_bridge_dispatch::try_run_joinir_vm_bridge;
|
||||
|
||||
impl NyashRunner {
|
||||
/// Execute VM mode with full plugin initialization and AST prelude merge
|
||||
@ -503,127 +499,10 @@ impl NyashRunner {
|
||||
}
|
||||
}
|
||||
|
||||
// Phase 30.x: JoinIR VM Bridge experimental path
|
||||
// Phase 30 F-4.4: JoinIR VM Bridge experimental path (consolidated dispatch)
|
||||
// Activated when NYASH_JOINIR_EXPERIMENT=1 AND NYASH_JOINIR_VM_BRIDGE=1
|
||||
// Currently only supports minimal_ssa_skip_ws.hako (Main.skip function)
|
||||
let joinir_path_attempted = if joinir_experiment_enabled() && joinir_vm_bridge_enabled() {
|
||||
// Check if this module contains Main.skip/1 (minimal_ssa_skip_ws target)
|
||||
// Note: function names include arity suffix like "Main.skip/1"
|
||||
let has_main_skip = module_vm.functions.contains_key("Main.skip/1");
|
||||
let has_trim = module_vm.functions.contains_key("FuncScannerBox.trim/1");
|
||||
// Phase 30.x: Stage-1 UsingResolver (deletable block - start)
|
||||
let has_stage1_usingresolver = module_vm.functions.contains_key("Stage1UsingResolverBox.resolve_for_source/5");
|
||||
// Phase 30.x: Stage-1 UsingResolver (deletable block - end)
|
||||
|
||||
if has_main_skip {
|
||||
eprintln!("[joinir/vm_bridge] Attempting JoinIR path for Main.skip");
|
||||
match lower_skip_ws_to_joinir(&module_vm) {
|
||||
Some(join_module) => {
|
||||
// Get input argument from NYASH_JOINIR_INPUT or use default
|
||||
let input = std::env::var("NYASH_JOINIR_INPUT")
|
||||
.unwrap_or_else(|_| " abc".to_string());
|
||||
eprintln!("[joinir/vm_bridge] Input: {:?}", input);
|
||||
|
||||
match run_joinir_via_vm(
|
||||
&join_module,
|
||||
JoinFuncId::new(0),
|
||||
&[JoinValue::Str(input)],
|
||||
) {
|
||||
Ok(result) => {
|
||||
let exit_code = match &result {
|
||||
JoinValue::Int(v) => *v as i32,
|
||||
JoinValue::Bool(b) => if *b { 1 } else { 0 },
|
||||
_ => 0,
|
||||
};
|
||||
eprintln!("[joinir/vm_bridge] ✅ JoinIR result: {:?}", result);
|
||||
if !quiet_pipe {
|
||||
println!("RC: {}", exit_code);
|
||||
}
|
||||
process::exit(exit_code);
|
||||
}
|
||||
Err(e) => {
|
||||
eprintln!("[joinir/vm_bridge] ❌ JoinIR execution failed: {:?}", e);
|
||||
eprintln!("[joinir/vm_bridge] Falling back to normal VM path");
|
||||
false // Continue to normal VM execution
|
||||
}
|
||||
}
|
||||
}
|
||||
None => {
|
||||
eprintln!("[joinir/vm_bridge] lower_skip_ws_to_joinir returned None");
|
||||
eprintln!("[joinir/vm_bridge] Falling back to normal VM path");
|
||||
false
|
||||
}
|
||||
}
|
||||
} else if has_trim {
|
||||
// Phase 30.x: FuncScannerBox.trim/1 JoinIR path
|
||||
eprintln!("[joinir/vm_bridge] Attempting JoinIR path for FuncScannerBox.trim");
|
||||
match lower_funcscanner_trim_to_joinir(&module_vm) {
|
||||
Some(join_module) => {
|
||||
// Get input argument from NYASH_JOINIR_INPUT or use default
|
||||
let input = std::env::var("NYASH_JOINIR_INPUT")
|
||||
.unwrap_or_else(|_| " abc ".to_string());
|
||||
eprintln!("[joinir/vm_bridge] Input: {:?}", input);
|
||||
|
||||
match run_joinir_via_vm(
|
||||
&join_module,
|
||||
JoinFuncId::new(0),
|
||||
&[JoinValue::Str(input)],
|
||||
) {
|
||||
Ok(result) => {
|
||||
// trim returns a string, print it and exit with 0
|
||||
eprintln!("[joinir/vm_bridge] ✅ JoinIR trim result: {:?}", result);
|
||||
if !quiet_pipe {
|
||||
match &result {
|
||||
JoinValue::Str(s) => println!("{}", s),
|
||||
_ => println!("{:?}", result),
|
||||
}
|
||||
}
|
||||
process::exit(0);
|
||||
}
|
||||
Err(e) => {
|
||||
eprintln!("[joinir/vm_bridge] ❌ JoinIR trim failed: {:?}", e);
|
||||
eprintln!("[joinir/vm_bridge] Falling back to normal VM path");
|
||||
false
|
||||
}
|
||||
}
|
||||
}
|
||||
None => {
|
||||
eprintln!("[joinir/vm_bridge] lower_funcscanner_trim_to_joinir returned None");
|
||||
eprintln!("[joinir/vm_bridge] Falling back to normal VM path");
|
||||
false
|
||||
}
|
||||
}
|
||||
// Phase 30.x: Stage-1 UsingResolver JoinIR path (deletable block - start)
|
||||
} else if has_stage1_usingresolver {
|
||||
eprintln!("[joinir/vm_bridge] Attempting JoinIR path for Stage1UsingResolverBox.resolve_for_source");
|
||||
match lower_stage1_usingresolver_to_joinir(&module_vm) {
|
||||
Some(join_module) => {
|
||||
eprintln!("[joinir/vm_bridge] ✅ Stage-1 JoinIR module generated ({} functions)", join_module.functions.len());
|
||||
// Stage-1 requires ArrayBox/MapBox arguments which JoinValue doesn't support yet
|
||||
// For now, just verify lowering works and fall back to VM
|
||||
eprintln!("[joinir/vm_bridge] Note: ArrayBox/MapBox args not yet supported in JoinValue");
|
||||
eprintln!("[joinir/vm_bridge] Falling back to normal VM path for actual execution");
|
||||
false // Fall back to VM for now
|
||||
}
|
||||
None => {
|
||||
eprintln!("[joinir/vm_bridge] lower_stage1_usingresolver_to_joinir returned None");
|
||||
eprintln!("[joinir/vm_bridge] Falling back to normal VM path");
|
||||
false
|
||||
}
|
||||
}
|
||||
// Phase 30.x: Stage-1 UsingResolver JoinIR path (deletable block - end)
|
||||
} else {
|
||||
false // No supported JoinIR target function
|
||||
}
|
||||
} else {
|
||||
false
|
||||
};
|
||||
|
||||
// Normal VM execution path (fallback or default)
|
||||
if joinir_path_attempted {
|
||||
// This branch is never reached because successful JoinIR path calls process::exit()
|
||||
unreachable!("JoinIR path should have exited");
|
||||
}
|
||||
// Routing logic is centralized in join_ir_vm_bridge_dispatch module
|
||||
try_run_joinir_vm_bridge(&module_vm, quiet_pipe);
|
||||
|
||||
match vm.execute_module(&module_vm) {
|
||||
Ok(ret) => {
|
||||
|
||||
Reference in New Issue
Block a user