pub struct Function { /* private fields */ }
Expand description
A WebAssembly function
instance.
A function instance is the runtime representation of a function.
It effectively is a closure of the original function (defined in either
the host or the WebAssembly module) over the runtime Instance
of its
originating Module
.
The module instance is used to resolve references to other definitions during execution of the function.
Spec: https://webassembly.github.io/spec/core/exec/runtime.html#function-instances
§Panics
- Closures (functions with captured environments) are not currently supported
with native functions. Attempting to create a native
Function
with one will result in a panic. Closures as host functions tracking issue
Implementations§
Source§impl Function
impl Function
Sourcepub fn new<FT, F>(store: &Store, ty: FT, func: F) -> Function
pub fn new<FT, F>(store: &Store, ty: FT, func: F) -> Function
Creates a new host Function
(dynamic) with the provided signature.
If you know the signature of the host function at compile time,
consider using Function::new_native
for less runtime overhead.
§Examples
let signature = FunctionType::new(vec![Type::I32, Type::I32], vec![Type::I32]);
let f = Function::new(&store, &signature, |args| {
let sum = args[0].unwrap_i32() + args[1].unwrap_i32();
Ok(vec![Value::I32(sum)])
});
With constant signature:
const I32_I32_TO_I32: ([Type; 2], [Type; 1]) = ([Type::I32, Type::I32], [Type::I32]);
let f = Function::new(&store, I32_I32_TO_I32, |args| {
let sum = args[0].unwrap_i32() + args[1].unwrap_i32();
Ok(vec![Value::I32(sum)])
});
Sourcepub fn new_with_env<FT, F, Env>(
store: &Store,
ty: FT,
env: Env,
func: F,
) -> Function
pub fn new_with_env<FT, F, Env>( store: &Store, ty: FT, env: Env, func: F, ) -> Function
Creates a new host Function
(dynamic) with the provided signature and environment.
If you know the signature of the host function at compile time,
consider using Function::new_native_with_env
for less runtime
overhead.
§Examples
#[derive(WasmerEnv, Clone)]
struct Env {
multiplier: i32,
};
let env = Env { multiplier: 2 };
let signature = FunctionType::new(vec![Type::I32, Type::I32], vec![Type::I32]);
let f = Function::new_with_env(&store, &signature, env, |env, args| {
let result = env.multiplier * (args[0].unwrap_i32() + args[1].unwrap_i32());
Ok(vec![Value::I32(result)])
});
With constant signature:
const I32_I32_TO_I32: ([Type; 2], [Type; 1]) = ([Type::I32, Type::I32], [Type::I32]);
#[derive(WasmerEnv, Clone)]
struct Env {
multiplier: i32,
};
let env = Env { multiplier: 2 };
let f = Function::new_with_env(&store, I32_I32_TO_I32, env, |env, args| {
let result = env.multiplier * (args[0].unwrap_i32() + args[1].unwrap_i32());
Ok(vec![Value::I32(result)])
});
Sourcepub fn new_native<F, Args, Rets, Env>(store: &Store, func: F) -> Functionwhere
F: HostFunction<Args, Rets, WithoutEnv, Env>,
Args: WasmTypeList,
Rets: WasmTypeList,
Env: 'static,
pub fn new_native<F, Args, Rets, Env>(store: &Store, func: F) -> Functionwhere
F: HostFunction<Args, Rets, WithoutEnv, Env>,
Args: WasmTypeList,
Rets: WasmTypeList,
Env: 'static,
Creates a new host Function
from a native function.
The function signature is automatically retrieved using the Rust typing system.
§Example
fn sum(a: i32, b: i32) -> i32 {
a + b
}
let f = Function::new_native(&store, sum);
Sourcepub fn new_native_with_env<F, Args, Rets, Env>(
store: &Store,
env: Env,
func: F,
) -> Functionwhere
F: HostFunction<Args, Rets, WithEnv, Env>,
Args: WasmTypeList,
Rets: WasmTypeList,
Env: WasmerEnv + 'static,
pub fn new_native_with_env<F, Args, Rets, Env>(
store: &Store,
env: Env,
func: F,
) -> Functionwhere
F: HostFunction<Args, Rets, WithEnv, Env>,
Args: WasmTypeList,
Rets: WasmTypeList,
Env: WasmerEnv + 'static,
Creates a new host Function
from a native function and a provided environment.
The function signature is automatically retrieved using the Rust typing system.
§Example
#[derive(WasmerEnv, Clone)]
struct Env {
multiplier: i32,
};
let env = Env { multiplier: 2 };
fn sum_and_multiply(env: &Env, a: i32, b: i32) -> i32 {
(a + b) * env.multiplier
}
let f = Function::new_native_with_env(&store, env, sum_and_multiply);
Sourcepub fn ty(&self) -> &FunctionType
pub fn ty(&self) -> &FunctionType
Returns the FunctionType
of the Function
.
§Example
fn sum(a: i32, b: i32) -> i32 {
a + b
}
let f = Function::new_native(&store, sum);
assert_eq!(f.ty().params(), vec![Type::I32, Type::I32]);
assert_eq!(f.ty().results(), vec![Type::I32]);
Sourcepub fn param_arity(&self) -> usize
pub fn param_arity(&self) -> usize
Returns the number of parameters that this function takes.
§Example
fn sum(a: i32, b: i32) -> i32 {
a + b
}
let f = Function::new_native(&store, sum);
assert_eq!(f.param_arity(), 2);
Sourcepub fn result_arity(&self) -> usize
pub fn result_arity(&self) -> usize
Returns the number of results this function produces.
§Example
fn sum(a: i32, b: i32) -> i32 {
a + b
}
let f = Function::new_native(&store, sum);
assert_eq!(f.result_arity(), 1);
Sourcepub fn call(
&self,
params: &[Value<Function>],
) -> Result<Box<[Value<Function>]>, RuntimeError>
pub fn call( &self, params: &[Value<Function>], ) -> Result<Box<[Value<Function>]>, RuntimeError>
Call the Function
function.
Depending on where the Function is defined, it will call it.
- If the function is defined inside a WebAssembly, it will call the trampoline for the function signature.
- If the function is defined in the host (in a native way), it will call the trampoline.
§Examples
let sum = instance.exports.get_function("sum").unwrap();
assert_eq!(sum.call(&[Value::I32(1), Value::I32(2)]).unwrap().to_vec(), vec![Value::I32(3)]);
Sourcepub fn native<Args, Rets>(&self) -> Result<NativeFunc<Args, Rets>, RuntimeError>where
Args: WasmTypeList,
Rets: WasmTypeList,
pub fn native<Args, Rets>(&self) -> Result<NativeFunc<Args, Rets>, RuntimeError>where
Args: WasmTypeList,
Rets: WasmTypeList,
Transform this WebAssembly function into a function with the
native ABI. See NativeFunc
to learn more.
§Examples
let sum = instance.exports.get_function("sum").unwrap();
let sum_native = sum.native::<(i32, i32), i32>().unwrap();
assert_eq!(sum_native.call(1, 2).unwrap(), 3);
§Errors
If the Args
generic parameter does not match the exported function
an error will be raised:
let sum = instance.exports.get_function("sum").unwrap();
// This results in an error: `RuntimeError`
let sum_native = sum.native::<(i64, i64), i32>().unwrap();
If the Rets
generic parameter does not match the exported function
an error will be raised:
let sum = instance.exports.get_function("sum").unwrap();
// This results in an error: `RuntimeError`
let sum_native = sum.native::<(i32, i32), i64>().unwrap();
Trait Implementations§
Source§impl<'a> Exportable<'a> for Function
impl<'a> Exportable<'a> for Function
Source§fn get_self_from_extern(
_extern: &'a Extern,
) -> Result<&'a Function, ExportError>
fn get_self_from_extern( _extern: &'a Extern, ) -> Result<&'a Function, ExportError>
Instance
by name.Source§fn into_weak_instance_ref(&mut self)
fn into_weak_instance_ref(&mut self)
InstanceRef
.
This is useful for preventing cycles, for example for data stored in a
type implementing WasmerEnv
.Source§impl<Args, Rets> From<NativeFunc<Args, Rets>> for Functionwhere
Args: WasmTypeList,
Rets: WasmTypeList,
impl<Args, Rets> From<NativeFunc<Args, Rets>> for Functionwhere
Args: WasmTypeList,
Rets: WasmTypeList,
Source§fn from(other: NativeFunc<Args, Rets>) -> Function
fn from(other: NativeFunc<Args, Rets>) -> Function
Source§impl MemoryUsage for Function
impl MemoryUsage for Function
Source§fn size_of_val(&self, visited: &mut dyn MemoryUsageTracker) -> usize
fn size_of_val(&self, visited: &mut dyn MemoryUsageTracker) -> usize
Source§impl WasmValueType for Function
impl WasmValueType for Function
impl StructuralPartialEq for Function
Auto Trait Implementations§
impl Freeze for Function
impl !RefUnwindSafe for Function
impl Send for Function
impl Sync for Function
impl Unpin for Function
impl !UnwindSafe for Function
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> CloneToUninit for Twhere
T: Clone,
impl<T> CloneToUninit for Twhere
T: Clone,
Source§impl<F, W, T, D> Deserialize<With<T, W>, D> for F
impl<F, W, T, D> Deserialize<With<T, W>, D> for F
Source§impl<T> Instrument for T
impl<T> Instrument for T
Source§fn instrument(self, span: Span) -> Instrumented<Self>
fn instrument(self, span: Span) -> Instrumented<Self>
Source§fn in_current_span(self) -> Instrumented<Self>
fn in_current_span(self) -> Instrumented<Self>
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