Struct wasmer_vm::InstanceAllocator

source ·
pub struct InstanceAllocator {
    instance_ptr: NonNull<Instance>,
    instance_layout: Layout,
    offsets: VMOffsets,
    consumed: bool,
}
Expand description

This is an intermediate type that manages the raw allocation and metadata when creating an Instance.

This type will free the allocated memory if it’s dropped before being used.

It is important to remind that Instance is dynamically-sized based on VMOffsets: The Instance.vmctx field represents a dynamically-sized array that extends beyond the nominal end of the type. So in order to create an instance of it, we must:

  1. Define the correct layout for Instance (size and alignment),
  2. Allocate it properly.

The InstanceAllocator::instance_layout computes the correct layout to represent the wanted Instance.

Then we use this layout to allocate an empty Instance properly.

Fields§

§instance_ptr: NonNull<Instance>

The buffer that will contain the Instance and dynamic fields.

§instance_layout: Layout

The layout of the instance_ptr buffer.

§offsets: VMOffsets

Information about the offsets into the instance_ptr buffer for the dynamic fields.

§consumed: bool

Whether or not this type has transferred ownership of the instance_ptr buffer. If it has not when being dropped, the buffer should be freed.

Implementations§

source§

impl InstanceAllocator

source

pub fn new( module: &ModuleInfo, ) -> (Self, Vec<NonNull<VMMemoryDefinition>>, Vec<NonNull<VMTableDefinition>>)

Allocates instance data for use with VMInstance::new.

Returns a wrapper type around the allocation and 2 vectors of pointers into the allocated buffer. These lists of pointers correspond to the location in memory for the local memories and tables respectively. These pointers should be written to before calling VMInstance::new.

source

fn instance_layout(offsets: &VMOffsets) -> Layout

Calculate the appropriate layout for the Instance.

source

unsafe fn memory_definition_locations(&self) -> Vec<NonNull<VMMemoryDefinition>>

Get the locations of where the local VMMemoryDefinitions should be stored.

This function lets us create Memory objects on the host with backing memory in the VM.

§Safety
  • Self.instance_ptr must point to enough memory that all of the offsets in Self.offsets point to valid locations in memory, i.e. Self.instance_ptr must have been allocated by Self::new.
source

unsafe fn table_definition_locations(&self) -> Vec<NonNull<VMTableDefinition>>

Get the locations of where the VMTableDefinitions should be stored.

This function lets us create [Table] objects on the host with backing memory in the VM.

§Safety
  • Self.instance_ptr must point to enough memory that all of the offsets in Self.offsets point to valid locations in memory, i.e. Self.instance_ptr must have been allocated by Self::new.
source

pub(crate) fn into_vminstance(self, instance: Instance) -> VMInstance

Finish preparing by writing the Instance into memory, and consume this InstanceAllocator.

source

pub(crate) fn offsets(&self) -> &VMOffsets

Get the VMOffsets for the allocated buffer.

Trait Implementations§

source§

impl Drop for InstanceAllocator

source§

fn drop(&mut self)

Executes the destructor for this type. Read more

Auto Trait Implementations§

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
§

impl<T> ArchivePointee for T

§

type ArchivedMetadata = ()

The archived version of the pointer metadata for this type.
§

fn pointer_metadata( _: &<T as ArchivePointee>::ArchivedMetadata, ) -> <T as Pointee>::Metadata

Converts some archived metadata to the pointer metadata for itself.
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> 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.

§

impl<T> LayoutRaw for T

§

fn layout_raw(_: <T as Pointee>::Metadata) -> Result<Layout, LayoutError>

Returns the layout of the type.
§

impl<T> Pointee for T

§

type Metadata = ()

The metadata type for pointers and references to this type.
source§

impl<T> Same for T

§

type Output = T

Should always be Self
source§

impl<T, U> TryFrom<U> for T
where 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 T
where 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.