Files
hakorune/src/runner/modes/llvm/fallback_executor.rs
tomoaki 3aba574723 refactor(llvm): Phase 286B - Unify error handling with Result<T, LlvmRunError>
This refactoring consolidates 20+ duplicated error handling patterns in LLVM mode
into a unified Result-based error handling system.

New files:
- error.rs: LlvmRunError type with code, msg, and convenience constructors
- report.rs: emit_error_and_exit() - single exit point for all LLVM errors

Changes:
- harness_executor.rs: Returns Result<i32, LlvmRunError> instead of Option<i32>
- pyvm_executor.rs: Returns Result<i32, LlvmRunError> instead of Option<i32>
- fallback_executor.rs: Returns Result<i32, LlvmRunError> instead of i32
- mod.rs: Updated all error handling to use report::emit_error_and_exit()

Benefits:
1. Unified error handling with Result<T, LlvmRunError>
2. Clear separation: Executors return errors, orchestrator handles exit
3. Single exit point guarantees leak report consistency
4. Reduced code duplication (20+ patterns consolidated)

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-12-24 11:10:57 +09:00

62 lines
2.6 KiB
Rust

//! Fallback executor for LLVM mode (mock/legacy)
//!
//! Handles fallback execution when LLVM backends are not available.
use nyash_rust::{mir::MirModule, mir::MirInstruction};
use super::error::LlvmRunError;
/// Fallback executor Box
///
/// **Responsibility**: Execute fallback path (feature check + mock)
/// **Input**: &MirModule
/// **Output**: Result<i32, LlvmRunError> (Ok(exit_code) on success, Err on failure)
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.
pub fn execute(module: &MirModule) -> Result<i32, LlvmRunError> {
// 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") {
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"
));
}
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");
return Ok(42);
}
MirInstruction::Return { value: None } => {
crate::console_println!("✅ Mock exit code: 0");
return Ok(0);
}
_ => {}
}
}
}
}
crate::console_println!("✅ Mock exit code: 0");
Ok(0)
}
}