Skip to main content

rwasm/strategy/
types.rs

1use crate::{CompilationError, TrapCode};
2use alloc::vec::Vec;
3
4pub fn checked_memory_range_end(offset: usize, length: usize) -> Result<usize, TrapCode> {
5    offset
6        .checked_add(length)
7        .ok_or(TrapCode::MemoryOutOfBounds)
8}
9
10pub trait StoreTr<T> {
11    fn memory_read(&mut self, offset: usize, buffer: &mut [u8]) -> Result<(), TrapCode>;
12
13    fn memory_read_into_vec(&mut self, offset: usize, length: usize) -> Result<Vec<u8>, TrapCode>;
14
15    fn memory_write(&mut self, offset: usize, buffer: &[u8]) -> Result<(), TrapCode>;
16
17    fn data_mut(&mut self) -> &mut T;
18
19    fn data(&self) -> &T;
20
21    fn try_consume_fuel(&mut self, delta: u64) -> Result<(), TrapCode>;
22
23    fn remaining_fuel(&self) -> Option<u64>;
24
25    fn reset_fuel(&mut self, new_fuel_limit: u64);
26}
27
28pub trait CallerTr<T>: StoreTr<T> {}
29
30#[derive(Debug)]
31pub enum StrategyError {
32    CompilationError(CompilationError),
33    TrapCode(TrapCode),
34}
35
36impl From<CompilationError> for StrategyError {
37    fn from(err: CompilationError) -> Self {
38        StrategyError::CompilationError(err)
39    }
40}
41impl From<TrapCode> for StrategyError {
42    fn from(err: TrapCode) -> Self {
43        StrategyError::TrapCode(err)
44    }
45}
46
47#[cfg(test)]
48mod tests {
49    use super::*;
50
51    #[test]
52    fn checked_memory_range_end_rejects_overflow() {
53        assert_eq!(
54            checked_memory_range_end(usize::MAX, 1).unwrap_err(),
55            TrapCode::MemoryOutOfBounds
56        );
57    }
58}