async_wasi/snapshots/common/
memory.rs

1use super::{
2    error::Errno,
3    types::{__wasi_ciovec_t, __wasi_iovec_t, __wasi_size_t},
4};
5use std::{
6    io::{IoSlice, IoSliceMut},
7    ops::{Add, Deref, DerefMut, Sub},
8};
9
10pub trait Memory {
11    fn get_data<T: Sized>(&self, offset: WasmPtr<T>) -> Result<&T, Errno>;
12
13    fn get_slice<T: Sized>(&self, offset: WasmPtr<T>, len: usize) -> Result<&[T], Errno>;
14
15    fn get_iovec<'a>(
16        &self,
17        iovec_ptr: WasmPtr<__wasi_ciovec_t>,
18        iovec_len: __wasi_size_t,
19    ) -> Result<Vec<IoSlice<'a>>, Errno>;
20
21    fn mut_data<T: Sized>(&mut self, offset: WasmPtr<T>) -> Result<&mut T, Errno>;
22
23    fn mut_slice<T: Sized>(&mut self, offset: WasmPtr<T>, len: usize) -> Result<&mut [T], Errno>;
24
25    fn mut_iovec(
26        &mut self,
27        iovec_ptr: WasmPtr<__wasi_iovec_t>,
28        iovec_len: __wasi_size_t,
29    ) -> Result<Vec<IoSliceMut<'_>>, Errno>;
30
31    fn write_data<T: Sized>(&mut self, offset: WasmPtr<T>, data: T) -> Result<(), Errno>;
32}
33
34#[derive(Debug, Clone, Copy)]
35pub struct WasmPtr<T: Sized>(pub usize, std::marker::PhantomData<T>);
36impl<T: Sized> WasmPtr<T> {
37    pub fn is_null(&self) -> bool {
38        self.0 == 0
39    }
40}
41impl<T: Sized> From<usize> for WasmPtr<T> {
42    fn from(i: usize) -> Self {
43        WasmPtr(i, Default::default())
44    }
45}
46impl<T: Sized> From<WasmPtr<T>> for usize {
47    fn from(val: WasmPtr<T>) -> Self {
48        val.0
49    }
50}
51impl<T: Sized> Add<usize> for WasmPtr<T> {
52    type Output = Self;
53    fn add(mut self, rhs: usize) -> Self::Output {
54        self.0 += rhs * std::mem::size_of::<T>();
55        self
56    }
57}
58impl<T: Sized> Sub<usize> for WasmPtr<T> {
59    type Output = Self;
60    fn sub(mut self, rhs: usize) -> Self::Output {
61        self.0 -= rhs * std::mem::size_of::<T>();
62        self
63    }
64}