WasmPtr

Struct WasmPtr 

Source
pub struct WasmPtr<T, Ty = Item>
where T: Copy,
{ /* private fields */ }
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(ctx: &mut Ctx, ptr: WasmPtr<u32>) {
    let memory = ctx.memory(0);
    let derefed_ptr = ptr.deref(memory).expect("pointer in bounds");
    let inner_val: u32 = derefed_ptr.get();
    println!("Got {} from Wasm memory address 0x{:X}", inner_val, ptr.offset());
    // update the value being pointed to
    derefed_ptr.set(inner_val + 1);
}

Implementations§

Source§

impl<T, Ty> WasmPtr<T, Ty>
where T: Copy,

Methods relevant to all types of WasmPtr.

Source

pub fn new(offset: u32) -> WasmPtr<T, Ty>

Create a new WasmPtr at the given offset.

Source

pub fn offset(self) -> u32

Get the offset into Wasm linear memory for this WasmPtr.

Source§

impl<T> WasmPtr<T>
where T: Copy + ValueType,

Methods for WasmPtrs to data that can be dereferenced, namely to types that implement ValueType, meaning that they’re valid for all possible bit patterns.

Source

pub fn deref<'a>(self, memory: &'a Memory) -> Option<&'a Cell<T>>

Dereference the WasmPtr getting access to a &Cell<T> allowing for reading and mutating of the inner value.

This method is unsound if used with unsynchronized shared memory. If you’re unsure what that means, it likely does not apply to you. This invariant will be enforced in the future.

Source

pub unsafe fn deref_mut<'a>(self, memory: &'a Memory) -> Option<&'a mut Cell<T>>

Mutably dereference this WasmPtr getting a &mut Cell<T> allowing for direct access to a &mut T.

§Safety
  • This method does not do any aliasing checks: it’s possible to create &mut T that point to the same memory. You should ensure that you have exclusive access to Wasm linear memory before calling this method.
Source§

impl<T> WasmPtr<T, Array>
where T: Copy + ValueType,

Methods for WasmPtrs to arrays of data that can be dereferenced, namely to types that implement ValueType, meaning that they’re valid for all possible bit patterns.

Source

pub fn deref( self, memory: &Memory, index: u32, length: u32, ) -> Option<&[Cell<T>]>

Dereference the WasmPtr getting access to a &[Cell<T>] allowing for reading and mutating of the inner values.

This method is unsound if used with unsynchronized shared memory. If you’re unsure what that means, it likely does not apply to you. This invariant will be enforced in the future.

Source

pub unsafe fn deref_mut( self, memory: &Memory, index: u32, length: u32, ) -> Option<&mut [Cell<T>]>

Mutably dereference this WasmPtr getting a &mut [Cell<T>] allowing for direct access to a &mut [T].

§Safety
  • This method does not do any aliasing checks: it’s possible to create &mut T that point to the same memory. You should ensure that you have exclusive access to Wasm linear memory before calling this method.
Source

pub fn get_utf8_string(self, memory: &Memory, str_len: u32) -> Option<&str>

Get a UTF-8 string from the WasmPtr with the given length.

Note that this method returns a reference to Wasm linear memory. The underlying data can be mutated if the Wasm is allowed to execute or an aliasing WasmPtr is used to mutate memory.

Source

pub fn get_utf8_string_with_nul(self, memory: &Memory) -> Option<&str>

Get a UTF-8 string from the WasmPtr, where the string is nul-terminated.

Note that this does not account for UTF-8 strings that contain nul themselves, [get_utf8_string] has to be used for those.

Also note that this method returns a reference to Wasm linear memory. The underlying data can be mutated if the Wasm is allowed to execute or an aliasing WasmPtr is used to mutate memory.

Trait Implementations§

Source§

impl<T, Ty> Clone for WasmPtr<T, Ty>
where T: Copy,

Source§

fn clone(&self) -> WasmPtr<T, Ty>

Returns a duplicate of the value. Read more
1.0.0 · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl<T, Ty> Debug for WasmPtr<T, Ty>
where T: Copy,

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), Error>

Formats the value using the given formatter. Read more
Source§

impl<T, Ty> PartialEq for WasmPtr<T, Ty>
where T: Copy,

Source§

fn eq(&self, other: &WasmPtr<T, Ty>) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · Source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, and should not be overridden without very good reason.
Source§

impl<T, Ty> WasmExternType for WasmPtr<T, Ty>
where T: Copy,

Source§

type Native = i32

Native wasm type for this WasmExternType.
Source§

fn to_native(self) -> <WasmPtr<T, Ty> as WasmExternType>::Native

Convert self to Native type.
Source§

fn from_native(n: <WasmPtr<T, Ty> as WasmExternType>::Native) -> WasmPtr<T, Ty>

Convert from given Native type to self.
Source§

impl<T, Ty> Copy for WasmPtr<T, Ty>
where T: Copy,

Source§

impl<T, Ty> Eq for WasmPtr<T, Ty>
where T: Copy,

Source§

impl<T, Ty> ValueType for WasmPtr<T, Ty>
where T: Copy,

Auto Trait Implementations§

§

impl<T, Ty> Freeze for WasmPtr<T, Ty>

§

impl<T, Ty> RefUnwindSafe for WasmPtr<T, Ty>

§

impl<T, Ty> Send for WasmPtr<T, Ty>
where T: Send, Ty: Send,

§

impl<T, Ty> Sync for WasmPtr<T, Ty>
where T: Sync, Ty: Sync,

§

impl<T, Ty> Unpin for WasmPtr<T, Ty>
where T: Unpin, Ty: Unpin,

§

impl<T, Ty> UnwindSafe for WasmPtr<T, Ty>
where T: UnwindSafe, Ty: UnwindSafe,

Blanket Implementations§

Source§

impl<T> Any for T
where T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> CloneToUninit for T
where T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
Source§

impl<Q, K> Equivalent<K> for Q
where Q: Eq + ?Sized, K: Borrow<Q> + ?Sized,

Source§

fn equivalent(&self, key: &K) -> bool

Checks if this value is equivalent to the given key. Read more
Source§

impl<Q, K> Equivalent<K> for Q
where Q: Eq + ?Sized, K: Borrow<Q> + ?Sized,

Source§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

Source§

impl<T, U> Into<U> for T
where U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

Source§

impl<T> ToOwned for T
where T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<Rets> TrapEarly<Rets> for Rets
where Rets: WasmTypeList,

Source§

type Error = Infallible

The error type for this trait.
Source§

fn report(self) -> Result<Rets, Infallible>

Get returns or error result.
Source§

impl<T, U> TryFrom<U> for T
where U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
Source§

impl<A> WasmTypeList for A
where A: WasmExternType,

Source§

type CStruct = S1<A>

CStruct type.
Source§

type RetArray = [u64; 1]

Array of return values.
Source§

fn from_ret_array(array: <A as WasmTypeList>::RetArray) -> A

Construct Self based on an array of returned values.
Source§

fn empty_ret_array() -> <A as WasmTypeList>::RetArray

Generates an empty array that will hold the returned values of the WebAssembly function.
Source§

fn from_c_struct(c_struct: <A as WasmTypeList>::CStruct) -> A

Transforms C values into Rust values.
Source§

fn into_c_struct(self) -> <A as WasmTypeList>::CStruct

Transforms Rust values into C values.
Source§

fn types() -> &'static [Type]

Get types of the current values.
Source§

unsafe fn call<Rets>( self, f: NonNull<Func>, wasm: Wasm, ctx: *mut Ctx, ) -> Result<Rets, RuntimeError>
where Rets: WasmTypeList,

This method is used to distribute the values onto a function, e.g. (1, 2).call(func, …). This form is unlikely to be used directly in the code, see the Func::call implementation.