Struct wasmi::MemoryInstance

source ·
pub struct MemoryInstance { /* private fields */ }
Expand description

Runtime representation of a linear memory (or memory for short).

A memory is a contiguous, mutable array of raw bytes. Wasm code can load and store values from/to a linear memory at any byte address. A trap occurs if an access is not within the bounds of the current memory size.

A memory is created with an initial size but can be grown dynamically. The growth can be limited by specifying maximum size. The size of a memory is always a integer multiple of a page size - 64KiB.

At the moment, wasm doesn’t provide any way to shrink the memory.

Implementations§

source§

impl MemoryInstance

source

pub fn alloc(initial: Pages, maximum: Option<Pages>) -> Result<MemoryRef, Error>

Allocate a memory instance.

The memory allocated with initial number of pages specified by initial. Minimal possible value for initial is 0 and maximum possible is 65536. (Since maximum addressible memory is 232 = 4GiB = 65536 * 64KiB).

It is possible to limit maximum number of pages this memory instance can have by specifying maximum. If not specified, this memory instance would be able to allocate up to 4GiB.

Allocated memory is always zeroed.

Errors

Returns Err if:

  • initial is greater than maximum
  • either initial or maximum is greater than 65536.
source

pub fn initial(&self) -> Pages

Returns number of pages this MemoryInstance was created with.

source

pub fn maximum(&self) -> Option<Pages>

Returns maximum amount of pages this MemoryInstance can grow to.

Returns None if there is no limit set. Maximum memory size cannot exceed 65536 pages or 4GiB.

source

pub fn current_size(&self) -> Pages

Returns current linear memory size.

Maximum memory size cannot exceed 65536 pages or 4GiB.

Example

To convert number of pages to number of bytes you can use the following code:

use wasmi::MemoryInstance;
use wasmi::memory_units::*;

let memory = MemoryInstance::alloc(Pages(1), None).unwrap();
let byte_size: Bytes = memory.current_size().into();
assert_eq!(
    byte_size,
    Bytes(65536),
);
source

pub fn get_value<T: LittleEndianConvert>(&self, offset: u32) -> Result<T, Error>

Get value from memory at given offset.

source

pub fn get(&self, offset: u32, size: usize) -> Result<Vec<u8>, Error>

👎Deprecated since 0.10.0: use get_into or get_value method instead

Copy data from memory at given offset.

This will allocate vector for you. If you can provide a mutable slice you can use get_into.

source

pub fn get_into(&self, offset: u32, target: &mut [u8]) -> Result<(), Error>

Copy data from given offset in the memory into target slice.

Errors

Returns Err if the specified region is out of bounds.

source

pub fn set(&self, offset: u32, value: &[u8]) -> Result<(), Error>

Copy data in the memory at given offset.

source

pub fn set_value<T: LittleEndianConvert>( &self, offset: u32, value: T ) -> Result<(), Error>

Copy value in the memory at given offset.

source

pub fn grow(&self, additional: Pages) -> Result<Pages, Error>

Increases the size of the linear memory by given number of pages. Returns previous memory size if succeeds.

Errors

Returns Err if attempted to allocate more memory than permited by the limit.

source

pub fn copy( &self, src_offset: usize, dst_offset: usize, len: usize ) -> Result<(), Error>

Copy contents of one memory region to another.

Semantically equivalent to memmove.

Errors

Returns Err if either of specified regions is out of bounds.

source

pub fn copy_nonoverlapping( &self, src_offset: usize, dst_offset: usize, len: usize ) -> Result<(), Error>

Copy contents of one memory region to another (non-overlapping version).

Semantically equivalent to memcpy. but returns Error if source overlaping with destination.

Errors

Returns Err if:

  • either of specified regions is out of bounds,
  • these regions overlaps.
source

pub fn transfer( src: &MemoryRef, src_offset: usize, dst: &MemoryRef, dst_offset: usize, len: usize ) -> Result<(), Error>

Copy memory between two (possibly distinct) memory instances.

If the same memory instance passed as src and dst then usual copy will be used.

source

pub fn clear(&self, offset: usize, new_val: u8, len: usize) -> Result<(), Error>

Fill the memory region with the specified value.

Semantically equivalent to memset.

Errors

Returns Err if the specified region is out of bounds.

source

pub fn zero(&self, offset: usize, len: usize) -> Result<(), Error>

Fill the specified memory region with zeroes.

Errors

Returns Err if the specified region is out of bounds.

source

pub fn erase(&self) -> Result<(), Error>

Set every byte in the entire linear memory to 0, preserving its size.

Might be useful for some optimization shenanigans.

source

pub fn with_direct_access<R, F: FnOnce(&[u8]) -> R>(&self, f: F) -> R

Provides direct access to the underlying memory buffer.

Panics

Any call that requires write access to memory (such as set, clear, etc) made within the closure will panic.

source

pub fn with_direct_access_mut<R, F: FnOnce(&mut [u8]) -> R>(&self, f: F) -> R

Provides direct mutable access to the underlying memory buffer.

Panics

Any calls that requires either read or write access to memory (such as get, set, copy, etc) made within the closure will panic. Proceed with caution.

source

pub fn direct_access(&self) -> impl AsRef<[u8]> + '_

Provides direct access to the underlying memory buffer.

Panics

Any call that requires write access to memory (such as set, clear, etc) made while the returned value is alive will panic.

source

pub fn direct_access_mut(&self) -> impl AsMut<[u8]> + '_

Provides direct mutable access to the underlying memory buffer.

Panics

Any call that requires either read or write access to memory (such as get, set, copy, etc) made while the returned value is alive will panic. Proceed with caution.

Trait Implementations§

source§

impl Debug for MemoryInstance

source§

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

Formats the value using the given formatter. Read more

Auto Trait Implementations§

Blanket Implementations§

source§

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

source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
source§

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

source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
source§

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

source§

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

Mutably borrows from an owned value. Read more
source§

impl<T> Downcast for Twhere T: Any,

source§

fn into_any(self: Box<T, Global>) -> Box<dyn Any, Global>

Convert Box<dyn Trait> (where Trait: Downcast) to Box<dyn Any>. Box<dyn Any> can then be further downcast into Box<ConcreteType> where ConcreteType implements Trait.
source§

fn into_any_rc(self: Rc<T>) -> Rc<dyn Any>

Convert Rc<Trait> (where Trait: Downcast) to Rc<Any>. Rc<Any> can then be further downcast into Rc<ConcreteType> where ConcreteType implements Trait.
source§

fn as_any(&self) -> &(dyn Any + 'static)

Convert &Trait (where Trait: Downcast) to &Any. This is needed since Rust cannot generate &Any’s vtable from &Trait’s.
source§

fn as_any_mut(&mut self) -> &mut (dyn Any + 'static)

Convert &mut Trait (where Trait: Downcast) to &Any. This is needed since Rust cannot generate &mut Any’s vtable from &mut Trait’s.
source§

impl<T> From<T> for T

source§

fn from(t: T) -> T

Returns the argument unchanged.

source§

impl<T, U> Into<U> for Twhere 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, U> TryFrom<U> for Twhere U: Into<T>,

§

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 Twhere U: TryFrom<T>,

§

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.