Files
hakorune/src/mir/join_ir_vm_bridge/runner.rs

66 lines
2.2 KiB
Rust
Raw Normal View History

use super::{bridge_joinir_to_mir, join_func_name, JoinIrVmBridgeError};
use crate::backend::{MirInterpreter, VMValue};
use crate::mir::join_ir::JoinFuncId;
use crate::mir::join_ir::JoinModule;
use crate::mir::join_ir_ops::JoinValue;
/// Phase 27-shortterm S-4.3: JoinIR → VM 実行のエントリーポイント
///
/// ## Arguments
/// - `join_module`: JoinIR モジュール(正規化済み)
/// - `entry_func`: エントリーポイント関数ID
/// - `args`: 初期引数JoinValue 形式)
///
/// ## Returns
/// - `Ok(JoinValue)`: 実行結果
/// - `Err(JoinIrVmBridgeError)`: 変換エラーまたは実行エラー
///
/// ## Example
/// ```ignore
/// let join_module = lower_skip_ws_to_joinir(&mir_module)?;
/// let result = run_joinir_via_vm(
/// &join_module,
/// JoinFuncId::new(0),
/// &[JoinValue::Str(" hello".to_string()), JoinValue::Int(7)]
/// )?;
/// assert_eq!(result, JoinValue::Int(2));
/// ```
pub fn run_joinir_via_vm(
join_module: &JoinModule,
entry_func: JoinFuncId,
args: &[JoinValue],
) -> Result<JoinValue, JoinIrVmBridgeError> {
debug_log!("[joinir_vm_bridge] Phase 27-shortterm S-4.3");
debug_log!("[joinir_vm_bridge] Converting JoinIR to MIR for VM execution");
// Step 1: JoinIR → MIR 変換
let mir_module = bridge_joinir_to_mir(join_module)?;
debug_log!(
"[joinir_vm_bridge] Converted {} JoinIR functions to MIR",
join_module.functions.len()
);
// Step 2: VM 実行
let mut vm = MirInterpreter::new();
debug_log!(
"[joinir_vm_bridge] Executing via VM with {} arguments",
args.len()
);
// Convert JoinValue → VMValue (BoxRef 含む)
let vm_args: Vec<VMValue> = args.iter().cloned().map(|v| v.into_vm_value()).collect();
let entry_name = join_func_name(entry_func);
let result = vm.execute_function_with_args(&mir_module, &entry_name, &vm_args)?;
// Step 3: VMValue → JoinValue 変換
let join_result = JoinValue::from_vm_value(&result)
.map_err(|e| JoinIrVmBridgeError::new(format!("Result conversion error: {}", e.message)))?;
debug_log!("[joinir_vm_bridge] Execution succeeded: {:?}", join_result);
Ok(join_result)
}