2025-12-24 10:45:17 +09:00
//! Fallback executor for LLVM mode (mock/legacy)
//!
//! Handles fallback execution when LLVM backends are not available.
use nyash_rust ::{ mir ::MirModule , mir ::MirInstruction } ;
2025-12-24 11:10:57 +09:00
use super ::error ::LlvmRunError ;
2025-12-24 10:45:17 +09:00
/// Fallback executor Box
///
/// **Responsibility**: Execute fallback path (feature check + mock)
/// **Input**: &MirModule
2025-12-24 11:10:57 +09:00
/// **Output**: Result<i32, LlvmRunError> (Ok(exit_code) on success, Err on failure)
2025-12-24 10:45:17 +09:00
pub struct FallbackExecutorBox ;
impl FallbackExecutorBox {
/// Execute fallback path (feature check + mock)
///
/// Fail-fast: if the user explicitly requested the llvmlite harness
/// but this binary was built without the `llvm-harness` feature,
/// do not silently fall back to mock.
///
/// Otherwise, executes mock execution that inspects the MIR
/// and returns a deterministic exit code based on Return instructions.
2025-12-24 11:10:57 +09:00
pub fn execute ( module : & MirModule ) -> Result < i32 , LlvmRunError > {
2025-12-24 10:45:17 +09:00
// Fail-fast: if the user explicitly requested the llvmlite harness
// but this binary was built without the `llvm-harness` feature,
// do not silently fall back to mock.
if crate ::config ::env ::env_bool ( " NYASH_LLVM_USE_HARNESS " ) {
2025-12-24 11:10:57 +09:00
return Err ( LlvmRunError ::fatal (
" LLVM harness requested (NYASH_LLVM_USE_HARNESS=1), but this binary was built without `--features llvm` (llvm-harness). Fix: cargo build --release --features llvm "
) ) ;
2025-12-24 10:45:17 +09:00
}
crate ::console_println! ( " 🔧 Mock LLVM Backend Execution: " ) ;
crate ::console_println! ( " Build with --features llvm for real backend. " ) ;
// NamingBox SSOT: Select entry (arity-aware, Main.main → main fallback)
let entry = crate ::runner ::modes ::common_util ::entry_selection ::select_entry_function ( module ) ;
if let Some ( main_func ) = module . functions . get ( & entry ) {
for ( _bid , block ) in & main_func . blocks {
for inst in & block . instructions {
match inst {
MirInstruction ::Return { value : Some ( _ ) } = > {
crate ::console_println! ( " ✅ Mock exit code: 42 " ) ;
2025-12-24 11:10:57 +09:00
return Ok ( 42 ) ;
2025-12-24 10:45:17 +09:00
}
MirInstruction ::Return { value : None } = > {
crate ::console_println! ( " ✅ Mock exit code: 0 " ) ;
2025-12-24 11:10:57 +09:00
return Ok ( 0 ) ;
2025-12-24 10:45:17 +09:00
}
_ = > { }
}
}
}
}
crate ::console_println! ( " ✅ Mock exit code: 0 " ) ;
2025-12-24 11:10:57 +09:00
Ok ( 0 )
2025-12-24 10:45:17 +09:00
}
}