pub type VMTrampoline = unsafe extern "C" fn(_: *mut VMOpaqueContext, _: *mut VMContext, _: *const VMFunctionBody, _: *mut ValRaw);
Expand description

Type definition of the trampoline used to enter WebAssembly from the host.

This function type is what’s generated for the entry trampolines that are compiled into a WebAssembly module’s image. Note that trampolines are not always used by Wasmtime since the TypedFunc API allows bypassing the trampoline and directly calling the underlying wasm function (at the time of this writing).

The trampoline’s arguments here are:

  • *mut VMOpaqueContext - this a contextual pointer defined within the context of the receiving function pointer. For now this is always *mut VMContext but with the component model it may be the case that this is a different type of pointer.

  • *mut VMContext - this is the “caller” context, which at this time is always unconditionally core wasm (even in the component model). This contextual pointer cannot be NULL and provides information necessary to resolve the caller’s context for the Caller API in Wasmtime.

  • *const VMFunctionBody - this is the indirect function pointer which is the actual target function to invoke. This function uses the System-V ABI for its argumenst and a semi-custom ABI for the return values (one return value is returned directly, multiple return values have the first one returned directly and remaining ones returned indirectly through a stack pointer). This function pointer may be Cranelift-compiled code or it may also be a host-compiled trampoline (e.g. when a host function calls a host function through the wasmtime::Func wrapper). The definition of the first argument of this function depends on what this receiving function pointer desires.

  • *mut ValRaw - this is storage space for both arguments and results of the function. The trampoline will read the arguments from this array to pass to the function pointer provided. The results are then written to the array afterwards (both reads and writes start at index 0). It’s the caller’s responsibility to make sure this array is appropriately sized.