31 lines
1.0 KiB
Rust
31 lines
1.0 KiB
Rust
use crate::call_frame::CallFrame;
|
|
use prometeu_bytecode::abi::{TrapInfo, TRAP_INVALID_LOCAL};
|
|
use prometeu_bytecode::FunctionMeta;
|
|
|
|
/// 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,
|
|
})
|
|
}
|
|
}
|