async_wasi/snapshots/common/
memory.rs1use 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}