#[repr(C)]
pub struct VMFuncRef { pub native_call: NonNull<VMNativeCallFunction>, pub array_call: VMArrayCallFunction, pub wasm_call: Option<NonNull<VMWasmCallFunction>>, pub type_index: VMSharedTypeIndex, pub vmctx: *mut VMOpaqueContext, }
Expand description

The VM caller-checked “funcref” record, for caller-side signature checking.

It consists of function pointer(s), a type id to be checked by the caller, and the vmctx closure associated with this function.

Fields§

§native_call: NonNull<VMNativeCallFunction>

Function pointer for this funcref if being called via the native calling convention.

§array_call: VMArrayCallFunction

Function pointer for this funcref if being called via the “array” calling convention that Func::new et al use.

§wasm_call: Option<NonNull<VMWasmCallFunction>>

Function pointer for this funcref if being called via the calling convention we use when compiling Wasm.

Most functions come with a function pointer that we can use when they are called from Wasm. The notable exception is when we Func::wrap a host function, and we don’t have a Wasm compiler on hand to compile a Wasm-to-native trampoline for the function. In this case, we leave wasm_call empty until the function is passed as an import to Wasm (or otherwise exposed to Wasm via tables/globals). At this point, we look up a Wasm-to-native trampoline for the function in the the Wasm’s compiled module and use that fill in VMFunctionImport::wasm_call. However there is no guarantee that the Wasm module has a trampoline for this function’s signature. The Wasm module only has trampolines for its types, and if this function isn’t of one of those types, then the Wasm module will not have a trampoline for it. This is actually okay, because it means that the Wasm cannot actually call this function. But it does mean that this field needs to be an Option even though it is non-null the vast vast vast majority of the time.

§type_index: VMSharedTypeIndex

Function signature’s type id.

§vmctx: *mut VMOpaqueContext

The VM state associated with this function.

The actual definition of what this pointer points to depends on the function being referenced: for core Wasm functions, this is a *mut VMContext, for host functions it is a *mut VMHostFuncContext, and for component functions it is a *mut VMComponentContext.

Trait Implementations§

source§

impl Clone for VMFuncRef

source§

fn clone(&self) -> VMFuncRef

Returns a copy of the value. Read more
1.0.0 · source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
source§

impl Debug for VMFuncRef

source§

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

Formats the value using the given formatter. Read more
source§

impl Send for VMFuncRef

source§

impl Sync for VMFuncRef

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
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.

source§

impl<T> ToOwned for T
where T: Clone,

§

type Owned = T

The resulting type after obtaining ownership.
source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
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.