rwasm 0.4.3

ZK-friendly WebAssembly runtime optimized for blockchain and zero-knowledge applications
Documentation
use crate::{types::TrapCode, CallerTr, RwasmStore, StoreTr};
use alloc::vec::Vec;

pub struct RwasmCaller<'a, T: 'static> {
    store: &'a mut RwasmStore<T>,
}

impl<'a, T: 'static> RwasmCaller<'a, T> {
    pub fn new(store: &'a mut RwasmStore<T>) -> Self {
        Self { store }
    }
}

impl<'a, T: 'static> StoreTr<T> for RwasmCaller<'a, T> {
    fn memory_read(&mut self, offset: usize, buffer: &mut [u8]) -> Result<(), TrapCode> {
        self.store.global_memory.read(offset, buffer)
    }

    fn memory_read_into_vec(&mut self, offset: usize, length: usize) -> Result<Vec<u8>, TrapCode> {
        self.store.global_memory.read_into_vec(offset, length)
    }

    fn memory_write(&mut self, offset: usize, buffer: &[u8]) -> Result<(), TrapCode> {
        self.store.global_memory.write(offset, buffer)?;
        #[cfg(feature = "tracing")]
        self.store
            .tracer
            .memory_change(offset as u32, buffer.len() as u32, buffer);
        Ok(())
    }

    fn data_mut(&mut self) -> &mut T {
        &mut self.store.data
    }

    fn data(&self) -> &T {
        &self.store.data
    }

    fn try_consume_fuel(&mut self, delta: u64) -> Result<(), TrapCode> {
        self.store.try_consume_fuel(delta)
    }

    fn remaining_fuel(&self) -> Option<u64> {
        self.store.remaining_fuel()
    }

    fn reset_fuel(&mut self, new_fuel_limit: u64) {
        self.store.reset_fuel(new_fuel_limit)
    }
}

impl<'a, T: 'static> CallerTr<T> for RwasmCaller<'a, T> {}