Struct WasmPtr
#[repr(transparent)]pub(crate) struct WasmPtr<T, M = Memory32>where
    M: MemorySize,{
    offset: <M as MemorySize>::Offset,
    _phantom: PhantomData<T>,
}Expand description
A zero-cost type that represents a pointer to something in Wasm linear memory.
This type can be used directly in the host function arguments:
pub fn host_import(mut env: FunctionEnvMut<()>, memory: Memory, ptr: WasmPtr<u32>) {
    let memory = memory.view(&env);
    let derefed_ptr = ptr.deref(&memory);
    let inner_val: u32 = derefed_ptr.read().expect("pointer in bounds");
    println!("Got {} from Wasm memory address 0x{:X}", inner_val, ptr.offset());
    // update the value being pointed to
    derefed_ptr.write(inner_val + 1).expect("pointer in bounds");
}This type can also be used with primitive-filled structs, but be careful of
guarantees required by ValueType.
// This is safe as the 12 bytes represented by this struct
// are valid for all bit combinations.
#[derive(Copy, Clone, Debug, ValueType)]
#[repr(C)]
struct V3 {
    x: f32,
    y: f32,
    z: f32
}
fn update_vector_3(mut env: FunctionEnvMut<()>, memory: Memory, ptr: WasmPtr<V3>) {
    let memory = memory.view(&env);
    let derefed_ptr = ptr.deref(&memory);
    let mut inner_val: V3 = derefed_ptr.read().expect("pointer in bounds");
    println!("Got {:?} from Wasm memory address 0x{:X}", inner_val, ptr.offset());
    // update the value being pointed to
    inner_val.x = 10.4;
    derefed_ptr.write(inner_val).expect("pointer in bounds");
}Fields§
§offset: <M as MemorySize>::Offset§_phantom: PhantomData<T>Implementations§
§impl<T, M> WasmPtr<T, M>where
    M: MemorySize,
 
impl<T, M> WasmPtr<T, M>where
    M: MemorySize,
pub fn new(offset: <M as MemorySize>::Offset) -> WasmPtr<T, M>
pub fn new(offset: <M as MemorySize>::Offset) -> WasmPtr<T, M>
Create a new WasmPtr at the given offset.
pub fn offset(&self) -> <M as MemorySize>::Offset
pub fn offset(&self) -> <M as MemorySize>::Offset
Get the offset into Wasm linear memory for this WasmPtr.
pub fn add_offset(
    self,
    offset: <M as MemorySize>::Offset,
) -> Result<WasmPtr<T, M>, MemoryAccessError>
pub fn add_offset( self, offset: <M as MemorySize>::Offset, ) -> Result<WasmPtr<T, M>, MemoryAccessError>
Calculates an offset from the current pointer address. The argument is
in units of T.
This method returns an error if an address overflow occurs.
pub fn sub_offset(
    self,
    offset: <M as MemorySize>::Offset,
) -> Result<WasmPtr<T, M>, MemoryAccessError>
pub fn sub_offset( self, offset: <M as MemorySize>::Offset, ) -> Result<WasmPtr<T, M>, MemoryAccessError>
Calculates an offset from the current pointer address. The argument is
in units of T.
This method returns an error if an address underflow occurs.
§impl<T, M> WasmPtr<T, M>where
    T: ValueType,
    M: MemorySize,
 
impl<T, M> WasmPtr<T, M>where
    T: ValueType,
    M: MemorySize,
pub fn deref<'a>(&self, view: &'a MemoryView<'_>) -> WasmRef<'a, T>
pub fn deref<'a>(&self, view: &'a MemoryView<'_>) -> WasmRef<'a, T>
Creates a WasmRef from this WasmPtr which allows reading and
mutating of the value being pointed to.
pub fn read(&self, view: &MemoryView<'_>) -> Result<T, MemoryAccessError>
pub fn read(&self, view: &MemoryView<'_>) -> Result<T, MemoryAccessError>
Reads the address pointed to by this WasmPtr in a memory.
pub fn write(
    &self,
    view: &MemoryView<'_>,
    val: T,
) -> Result<(), MemoryAccessError>
pub fn write( &self, view: &MemoryView<'_>, val: T, ) -> Result<(), MemoryAccessError>
Writes to the address pointed to by this WasmPtr in a memory.
pub fn slice<'a>(
    &self,
    view: &'a MemoryView<'_>,
    len: <M as MemorySize>::Offset,
) -> Result<WasmSlice<'a, T>, MemoryAccessError>
pub fn slice<'a>( &self, view: &'a MemoryView<'_>, len: <M as MemorySize>::Offset, ) -> Result<WasmSlice<'a, T>, MemoryAccessError>
Creates a WasmSlice starting at this WasmPtr which allows reading
and mutating of an array of value being pointed to.
Returns a MemoryAccessError if the slice length overflows a 64-bit
address.
pub fn read_until(
    &self,
    view: &MemoryView<'_>,
    end: impl FnMut(&T) -> bool,
) -> Result<Vec<T>, MemoryAccessError>
pub fn read_until( &self, view: &MemoryView<'_>, end: impl FnMut(&T) -> bool, ) -> Result<Vec<T>, MemoryAccessError>
Reads a sequence of values from this WasmPtr until a value that
matches the given condition is found.
This last value is not included in the returned vector.
pub fn access<'a>(
    &self,
    view: &'a MemoryView<'_>,
) -> Result<WasmRefAccess<'a, T>, MemoryAccessError>
pub fn access<'a>( &self, view: &'a MemoryView<'_>, ) -> Result<WasmRefAccess<'a, T>, MemoryAccessError>
Creates a WasmAccess
§impl<M> WasmPtr<u8, M>where
    M: MemorySize,
 
impl<M> WasmPtr<u8, M>where
    M: MemorySize,
pub fn read_utf8_string(
    &self,
    view: &MemoryView<'_>,
    len: <M as MemorySize>::Offset,
) -> Result<String, MemoryAccessError>
pub fn read_utf8_string( &self, view: &MemoryView<'_>, len: <M as MemorySize>::Offset, ) -> Result<String, MemoryAccessError>
Reads a UTF-8 string from the WasmPtr with the given length.
This method is safe to call even if the memory is being concurrently modified.
pub fn read_utf8_string_with_nul(
    &self,
    view: &MemoryView<'_>,
) -> Result<String, MemoryAccessError>
pub fn read_utf8_string_with_nul( &self, view: &MemoryView<'_>, ) -> Result<String, MemoryAccessError>
Reads a null-terminated UTF-8 string from the WasmPtr.
This method is safe to call even if the memory is being concurrently modified.
Trait Implementations§
§impl<T, M> Clone for WasmPtr<T, M>where
    T: ValueType,
    M: MemorySize,
 
impl<T, M> Clone for WasmPtr<T, M>where
    T: ValueType,
    M: MemorySize,
§impl<T, M> Debug for WasmPtr<T, M>where
    T: ValueType,
    M: MemorySize,
 
impl<T, M> Debug for WasmPtr<T, M>where
    T: ValueType,
    M: MemorySize,
§impl<T, M> FromToNativeWasmType for WasmPtr<T, M>
 
impl<T, M> FromToNativeWasmType for WasmPtr<T, M>
§type Native = <M as MemorySize>::Native
 
type Native = <M as MemorySize>::Native
§fn to_native(self) -> <WasmPtr<T, M> as FromToNativeWasmType>::Native
 
fn to_native(self) -> <WasmPtr<T, M> as FromToNativeWasmType>::Native
Self::Native. Read more§fn from_native(
    n: <WasmPtr<T, M> as FromToNativeWasmType>::Native,
) -> WasmPtr<T, M>
 
fn from_native( n: <WasmPtr<T, M> as FromToNativeWasmType>::Native, ) -> WasmPtr<T, M>
§fn is_from_store(&self, _store: &impl AsStoreRef) -> bool
 
fn is_from_store(&self, _store: &impl AsStoreRef) -> bool
§impl<T, M> PartialEq for WasmPtr<T, M>where
    T: ValueType,
    M: MemorySize,
 
impl<T, M> PartialEq for WasmPtr<T, M>where
    T: ValueType,
    M: MemorySize,
§impl<T, M> ValueType for WasmPtr<T, M>where
    T: ValueType,
    M: MemorySize,
 
impl<T, M> ValueType for WasmPtr<T, M>where
    T: ValueType,
    M: MemorySize,
§fn zero_padding_bytes(&self, _bytes: &mut [MaybeUninit<u8>])
 
fn zero_padding_bytes(&self, _bytes: &mut [MaybeUninit<u8>])
self. It must zero out any bytes which are
uninitialized (e.g. padding bytes).impl<T, M> Copy for WasmPtr<T, M>where
    T: ValueType,
    M: MemorySize,
impl<T, M> Eq for WasmPtr<T, M>where
    T: ValueType,
    M: MemorySize,
Auto Trait Implementations§
impl<T, M> Freeze for WasmPtr<T, M>
impl<T, M> RefUnwindSafe for WasmPtr<T, M>
impl<T, M> Send for WasmPtr<T, M>where
    T: Send,
impl<T, M> Sync for WasmPtr<T, M>where
    T: Sync,
impl<T, M> Unpin for WasmPtr<T, M>
impl<T, M> UnwindSafe for WasmPtr<T, M>
Blanket Implementations§
§impl<T> ArchivePointee for T
 
impl<T> ArchivePointee for T
§type ArchivedMetadata = ()
 
type ArchivedMetadata = ()
§fn pointer_metadata(
    _: &<T as ArchivePointee>::ArchivedMetadata,
) -> <T as Pointee>::Metadata
 
fn pointer_metadata( _: &<T as ArchivePointee>::ArchivedMetadata, ) -> <T as Pointee>::Metadata
Source§impl<T> BorrowMut<T> for Twhere
    T: ?Sized,
 
impl<T> BorrowMut<T> for Twhere
    T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
 
fn borrow_mut(&mut self) -> &mut T
Source§impl<T> CloneToUninit for Twhere
    T: Clone,
 
impl<T> CloneToUninit for Twhere
    T: Clone,
§impl<Q, K> Equivalent<K> for Q
 
impl<Q, K> Equivalent<K> for Q
§fn equivalent(&self, key: &K) -> bool
 
fn equivalent(&self, key: &K) -> bool
§impl<Q, K> Equivalent<K> for Q
 
impl<Q, K> Equivalent<K> for Q
§fn equivalent(&self, key: &K) -> bool
 
fn equivalent(&self, key: &K) -> bool
§impl<Q, K> Equivalent<K> for Q
 
impl<Q, K> Equivalent<K> for Q
§fn equivalent(&self, key: &K) -> bool
 
fn equivalent(&self, key: &K) -> bool
key and return true if they are equal.§impl<Q, K> Equivalent<K> for Q
 
impl<Q, K> Equivalent<K> for Q
§fn equivalent(&self, key: &K) -> bool
 
fn equivalent(&self, key: &K) -> bool
§impl<T> Instrument for T
 
impl<T> Instrument for T
§fn instrument(self, span: Span) -> Instrumented<Self> ⓘ
 
fn instrument(self, span: Span) -> Instrumented<Self> ⓘ
Source§impl<T> IntoEither for T
 
impl<T> IntoEither for T
Source§fn into_either(self, into_left: bool) -> Either<Self, Self> ⓘ
 
fn into_either(self, into_left: bool) -> Either<Self, Self> ⓘ
self into a Left variant of Either<Self, Self>
if into_left is true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read moreSource§fn into_either_with<F>(self, into_left: F) -> Either<Self, Self> ⓘ
 
fn into_either_with<F>(self, into_left: F) -> Either<Self, Self> ⓘ
self into a Left variant of Either<Self, Self>
if into_left(&self) returns true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read more§impl<T> IntoResult<T> for Twhere
    T: WasmTypeList,
 
impl<T> IntoResult<T> for Twhere
    T: WasmTypeList,
§type Error = Infallible
 
type Error = Infallible
§fn into_result(self) -> Result<T, Infallible>
 
fn into_result(self) -> Result<T, Infallible>
Self into a Result.§impl<T> LayoutRaw for T
 
impl<T> LayoutRaw for T
§fn layout_raw(_: <T as Pointee>::Metadata) -> Result<Layout, LayoutError>
 
fn layout_raw(_: <T as Pointee>::Metadata) -> Result<Layout, LayoutError>
§impl<T, N1, N2> Niching<NichedOption<T, N1>> for N2where
    T: SharedNiching<N1, N2>,
    N1: Niching<T>,
    N2: Niching<T>,
 
impl<T, N1, N2> Niching<NichedOption<T, N1>> for N2where
    T: SharedNiching<N1, N2>,
    N1: Niching<T>,
    N2: Niching<T>,
§impl<T> Pointable for T
 
impl<T> Pointable for T
§impl<T> Pointee for T
 
impl<T> Pointee for T
§impl<T> PolicyExt for Twhere
    T: ?Sized,
 
impl<T> PolicyExt for Twhere
    T: ?Sized,
§impl<T> Upcastable for T
 
impl<T> Upcastable for T
fn upcast_any_ref(&self) -> &(dyn Any + 'static)
fn upcast_any_mut(&mut self) -> &mut (dyn Any + 'static)
fn upcast_any_box(self: Box<T>) -> Box<dyn Any>
§impl<T> Upcastable for T
 
impl<T> Upcastable for T
§fn upcast_any_ref(&self) -> &(dyn Any + 'static)
 
fn upcast_any_ref(&self) -> &(dyn Any + 'static)
§fn upcast_any_mut(&mut self) -> &mut (dyn Any + 'static)
 
fn upcast_any_mut(&mut self) -> &mut (dyn Any + 'static)
§fn upcast_any_box(self: Box<T>) -> Box<dyn Any>
 
fn upcast_any_box(self: Box<T>) -> Box<dyn Any>
§impl<A1> WasmTypeList for A1where
    A1: FromToNativeWasmType,
 
impl<A1> WasmTypeList for A1where
    A1: FromToNativeWasmType,
§unsafe fn from_array(
    _store: &mut impl AsStoreMut,
    array: <A1 as WasmTypeList>::Array,
) -> A1
 
unsafe fn from_array( _store: &mut impl AsStoreMut, array: <A1 as WasmTypeList>::Array, ) -> A1
Self based on an array of values. Read more§unsafe fn from_slice(
    store: &mut impl AsStoreMut,
    slice: &[RawValue],
) -> Result<A1, TryFromSliceError>
 
unsafe fn from_slice( store: &mut impl AsStoreMut, slice: &[RawValue], ) -> Result<A1, TryFromSliceError>
Self based on a slice of values. Read more§unsafe fn into_array(
    self,
    _store: &mut impl AsStoreMut,
) -> <A1 as WasmTypeList>::Array
 
unsafe fn into_array( self, _store: &mut impl AsStoreMut, ) -> <A1 as WasmTypeList>::Array
Array from a tuple
(list) of values. Read more§fn empty_array() -> <A1 as WasmTypeList>::Array
 
fn empty_array() -> <A1 as WasmTypeList>::Array
Array that
will hold a tuple (list) of values, usually to hold the
returned values of a WebAssembly function call.§unsafe fn from_c_struct(
    _store: &mut impl AsStoreMut,
    c_struct: <A1 as WasmTypeList>::CStruct,
) -> A1
 
unsafe fn from_c_struct( _store: &mut impl AsStoreMut, c_struct: <A1 as WasmTypeList>::CStruct, ) -> A1
CStruct. Read more§unsafe fn into_c_struct(
    self,
    _store: &mut impl AsStoreMut,
) -> <A1 as WasmTypeList>::CStruct
 
unsafe fn into_c_struct( self, _store: &mut impl AsStoreMut, ) -> <A1 as WasmTypeList>::CStruct
CStruct from a
tuple (list) of values. Read more§unsafe fn write_c_struct_to_ptr(
    c_struct: <A1 as WasmTypeList>::CStruct,
    _ptr: *mut RawValue,
)
 
unsafe fn write_c_struct_to_ptr( c_struct: <A1 as WasmTypeList>::CStruct, _ptr: *mut RawValue, )
RawValue. Read more