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 a VMInstance.
This type will free the allocated memory if it’s dropped before being used.
It is important to remind that VMInstance 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:
- Define the correct layout for
Instance(size and alignment), - Allocate it properly.
The InstanceAllocator::instance_layout helper computes the correct
layout to represent the wanted VMInstance.
Then we use this layout to allocate an empty Instance properly.
Fields§
§instance_ptr: NonNull<Instance>The buffer that will contain the VMInstance and dynamic fields.
instance_layout: LayoutThe layout of the instance_ptr buffer.
offsets: VMOffsetsInformation about the offsets into the instance_ptr buffer for
the dynamic fields.
consumed: boolWhether 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
impl InstanceAllocator
Sourcepub fn new(
module: &ModuleInfo,
) -> (Self, Vec<NonNull<VMMemoryDefinition>>, Vec<NonNull<VMTableDefinition>>)
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.
Sourcefn instance_layout(offsets: &VMOffsets) -> Layout
fn instance_layout(offsets: &VMOffsets) -> Layout
Calculate the appropriate layout for the internal Instance structure.
Sourceunsafe fn memory_definition_locations(&self) -> Vec<NonNull<VMMemoryDefinition>>
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_ptrmust point to enough memory that all of the offsets inSelf.offsetspoint to valid locations in memory, i.e.Self.instance_ptrmust have been allocated bySelf::new.
Sourceunsafe fn table_definition_locations(&self) -> Vec<NonNull<VMTableDefinition>>
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_ptrmust point to enough memory that all of the offsets inSelf.offsetspoint to valid locations in memory, i.e.Self.instance_ptrmust have been allocated bySelf::new.
Sourcepub(crate) fn into_vminstance(self, instance: Instance) -> VMInstance
pub(crate) fn into_vminstance(self, instance: Instance) -> VMInstance
Finish preparing by writing the internal Instance into memory, and
consume this InstanceAllocator.
Trait Implementations§
Auto Trait Implementations§
impl Freeze for InstanceAllocator
impl !RefUnwindSafe for InstanceAllocator
impl !Send for InstanceAllocator
impl !Sync for InstanceAllocator
impl Unpin for InstanceAllocator
impl !UnwindSafe for InstanceAllocator
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> 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