pub struct InstanceAllocator { /* private fields */ }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.
Implementations§
Source§impl InstanceAllocator
impl InstanceAllocator
Sourcepub fn new(
module: &ModuleInfo,
) -> (Self, Vec<NonNull<VMMemoryDefinition>>, Vec<NonNull<VMTableDefinition>>, Vec<NonNull<VMGlobalDefinition>>)
pub fn new( module: &ModuleInfo, ) -> (Self, Vec<NonNull<VMMemoryDefinition>>, Vec<NonNull<VMTableDefinition>>, Vec<NonNull<VMGlobalDefinition>>)
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.
Sourcepub fn new_with_offsets(
offsets: VMOffsets,
module: &ModuleInfo,
) -> (Self, Vec<NonNull<VMMemoryDefinition>>, Vec<NonNull<VMTableDefinition>>, Vec<NonNull<VMGlobalDefinition>>)
pub fn new_with_offsets( offsets: VMOffsets, module: &ModuleInfo, ) -> (Self, Vec<NonNull<VMMemoryDefinition>>, Vec<NonNull<VMTableDefinition>>, Vec<NonNull<VMGlobalDefinition>>)
Same as InstanceAllocator::new, but accepts pre-computed
VMOffsets instead of computing them from the module.
VMOffsets::new(pointer_size, module) is deterministic given
(pointer_size, module), and the pointer_size is fixed to
size_of::<usize>() on the host. Callers that instantiate the
same module repeatedly (per-request wasm hosts: cloud workers,
CosmWasm, op-vm, …) can compute the offsets once at compile/cache
time and pass them here to skip the recomputation on every
Instance::new.
§Caller contract
offsets MUST equal VMOffsets::new(size_of::<usize>() as u8, module)
for the same module. Passing offsets computed for a different
module, or with a different pointer size, will produce an
incorrectly sized allocation and undefined behavior. Callers that
cache the offsets should key the cache by the same ModuleInfo
they pass here.
Trait Implementations§
Source§impl Drop for InstanceAllocator
impl Drop for InstanceAllocator
Auto Trait Implementations§
impl !RefUnwindSafe for InstanceAllocator
impl !Send for InstanceAllocator
impl !Sync for InstanceAllocator
impl !UnwindSafe for InstanceAllocator
impl Freeze for InstanceAllocator
impl Unpin for InstanceAllocator
impl UnsafeUnpin for InstanceAllocator
Blanket Implementations§
Source§impl<T> ArchivePointee for T
impl<T> ArchivePointee for T
Source§type ArchivedMetadata = ()
type ArchivedMetadata = ()
Source§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 moreSource§impl<T> LayoutRaw for T
impl<T> LayoutRaw for T
Source§fn layout_raw(_: <T as Pointee>::Metadata) -> Result<Layout, LayoutError>
fn layout_raw(_: <T as Pointee>::Metadata) -> Result<Layout, LayoutError>
Source§impl<T, N1, N2> Niching<NichedOption<T, N1>> for N2
impl<T, N1, N2> Niching<NichedOption<T, N1>> for N2
Source§unsafe fn is_niched(niched: *const NichedOption<T, N1>) -> bool
unsafe fn is_niched(niched: *const NichedOption<T, N1>) -> bool
Source§fn resolve_niched(out: Place<NichedOption<T, N1>>)
fn resolve_niched(out: Place<NichedOption<T, N1>>)
out indicating that a T is niched.