Struct wasmer_wasix::syscalls::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: Copy,
impl<T> CloneToUninit for Twhere
T: Copy,
source§unsafe fn clone_to_uninit(&self, dst: *mut T)
unsafe fn clone_to_uninit(&self, dst: *mut T)
clone_to_uninit
)source§impl<T> CloneToUninit for Twhere
T: Clone,
impl<T> CloneToUninit for Twhere
T: Clone,
source§default unsafe fn clone_to_uninit(&self, dst: *mut T)
default unsafe fn clone_to_uninit(&self, dst: *mut T)
clone_to_uninit
)§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
source§impl<Q, K> Equivalent<K> for Q
impl<Q, K> Equivalent<K> for Q
source§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<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> 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> Pointable for T
impl<T> Pointable for T
§impl<T> Pointee for T
impl<T> Pointee for T
§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