Struct wasmtime_runtime::VMFuncRef
source · #[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
.