36 lines
1.1 KiB
Rust
36 lines
1.1 KiB
Rust
use crate::call_frame::CallFrame;
|
|
use prometeu_bytecode::FunctionMeta;
|
|
use prometeu_bytecode::{TRAP_INVALID_LOCAL, TrapInfo};
|
|
|
|
// /// Computes the absolute stack index for the start of the current frame's locals (including args).
|
|
// pub fn local_base(frame: &CallFrame) -> usize {
|
|
// frame.stack_base
|
|
// }
|
|
|
|
/// Computes the absolute stack index for a given local slot.
|
|
pub fn local_index(frame: &CallFrame, slot: u32) -> usize {
|
|
frame.stack_base + slot as usize
|
|
}
|
|
|
|
/// Validates that a local slot index is within the valid range for the function.
|
|
/// Range: 0 <= slot < (param_slots + local_slots)
|
|
pub fn check_local_slot(
|
|
meta: &FunctionMeta,
|
|
slot: u32,
|
|
opcode: u16,
|
|
pc: u32,
|
|
) -> Result<(), TrapInfo> {
|
|
let limit = meta.param_slots as u32 + meta.local_slots as u32;
|
|
if slot < limit {
|
|
Ok(())
|
|
} else {
|
|
Err(TrapInfo {
|
|
code: TRAP_INVALID_LOCAL,
|
|
opcode,
|
|
message: format!("Local slot {} out of bounds for function (limit {})", slot, limit),
|
|
pc,
|
|
span: None,
|
|
})
|
|
}
|
|
}
|