pub(crate) enum BackendFunction {
Sys(Function),
}Variants§
Implementations§
Source§impl BackendFunction
impl BackendFunction
Sourcepub fn new<FT, F>(store: &mut impl AsStoreMut, ty: FT, func: F) -> Selfwhere
FT: Into<FunctionType>,
F: Fn(&[Value]) -> Result<Vec<Value>, RuntimeError> + 'static + Send + Sync,
pub fn new<FT, F>(store: &mut impl AsStoreMut, ty: FT, func: F) -> Selfwhere
FT: Into<FunctionType>,
F: Fn(&[Value]) -> Result<Vec<Value>, RuntimeError> + 'static + Send + Sync,
Creates a new host Function (dynamic) with the provided signature.
If you know the signature of the host function at compile time,
consider using Self::new_typed for less runtime overhead.
Sourcepub fn new_with_env<FT, F, T: Send + 'static>(
store: &mut impl AsStoreMut,
env: &FunctionEnv<T>,
ty: FT,
func: F,
) -> Selfwhere
FT: Into<FunctionType>,
F: Fn(FunctionEnvMut<'_, T>, &[Value]) -> Result<Vec<Value>, RuntimeError> + 'static + Send + Sync,
pub fn new_with_env<FT, F, T: Send + 'static>(
store: &mut impl AsStoreMut,
env: &FunctionEnv<T>,
ty: FT,
func: F,
) -> Selfwhere
FT: Into<FunctionType>,
F: Fn(FunctionEnvMut<'_, T>, &[Value]) -> Result<Vec<Value>, RuntimeError> + 'static + Send + Sync,
Creates a new host Function (dynamic) with the provided signature.
If you know the signature of the host function at compile time,
consider using Self::new_typed_with_env for less runtime overhead.
Takes a FunctionEnv that is passed into func. If that is not required,
Self::new might be an option as well.
§Examples
let signature = FunctionType::new(vec![Type::I32, Type::I32], vec![Type::I32]);
let f = Function::new_with_env(&mut store, &env, &signature, |_env, 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_with_env(&mut store, &env, I32_I32_TO_I32, |_env, args| {
let sum = args[0].unwrap_i32() + args[1].unwrap_i32();
Ok(vec![Value::I32(sum)])
});Sourcepub fn new_typed<F, Args, Rets>(store: &mut impl AsStoreMut, func: F) -> Selfwhere
F: HostFunction<(), Args, Rets, WithoutEnv> + 'static + Send + Sync,
Args: WasmTypeList,
Rets: WasmTypeList,
pub fn new_typed<F, Args, Rets>(store: &mut impl AsStoreMut, func: F) -> Selfwhere
F: HostFunction<(), Args, Rets, WithoutEnv> + 'static + Send + Sync,
Args: WasmTypeList,
Rets: WasmTypeList,
Creates a new host Function from a native function.
Sourcepub fn new_typed_with_env<T: Send + 'static, F, Args, Rets>(
store: &mut impl AsStoreMut,
env: &FunctionEnv<T>,
func: F,
) -> Selfwhere
F: HostFunction<T, Args, Rets, WithEnv> + 'static + Send + Sync,
Args: WasmTypeList,
Rets: WasmTypeList,
pub fn new_typed_with_env<T: Send + 'static, F, Args, Rets>(
store: &mut impl AsStoreMut,
env: &FunctionEnv<T>,
func: F,
) -> Selfwhere
F: HostFunction<T, Args, Rets, WithEnv> + 'static + Send + Sync,
Args: WasmTypeList,
Rets: WasmTypeList,
Creates a new host Function with an environment from a typed function.
The function signature is automatically retrieved using the Rust typing system.
§Example
fn sum(_env: FunctionEnvMut<()>, a: i32, b: i32) -> i32 {
a + b
}
let f = Function::new_typed_with_env(&mut store, &env, sum);Sourcepub fn ty(&self, store: &impl AsStoreRef) -> FunctionType
pub fn ty(&self, store: &impl AsStoreRef) -> FunctionType
Returns the FunctionType of the Function.
§Example
fn sum(_env: FunctionEnvMut<()>, a: i32, b: i32) -> i32 {
a + b
}
let f = Function::new_typed_with_env(&mut store, &env, sum);
assert_eq!(f.ty(&mut store).params(), vec![Type::I32, Type::I32]);
assert_eq!(f.ty(&mut store).results(), vec![Type::I32]);Sourcepub fn param_arity(&self, store: &impl AsStoreRef) -> usize
pub fn param_arity(&self, store: &impl AsStoreRef) -> usize
Returns the number of parameters that this function takes.
§Example
fn sum(_env: FunctionEnvMut<()>, a: i32, b: i32) -> i32 {
a + b
}
let f = Function::new_typed_with_env(&mut store, &env, sum);
assert_eq!(f.param_arity(&mut store), 2);Sourcepub fn result_arity(&self, store: &impl AsStoreRef) -> usize
pub fn result_arity(&self, store: &impl AsStoreRef) -> usize
Returns the number of results this function produces.
§Example
fn sum(_env: FunctionEnvMut<()>, a: i32, b: i32) -> i32 {
a + b
}
let f = Function::new_typed_with_env(&mut store, &env, sum);
assert_eq!(f.result_arity(&mut store), 1);Sourcepub fn call(
&self,
store: &mut impl AsStoreMut,
params: &[Value],
) -> Result<Box<[Value]>, RuntimeError>
pub fn call( &self, store: &mut impl AsStoreMut, params: &[Value], ) -> Result<Box<[Value]>, 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(&mut store, &[Value::I32(1), Value::I32(2)]).unwrap().to_vec(), vec![Value::I32(3)]);pub(crate) fn vm_funcref(&self, store: &impl AsStoreRef) -> VMFuncRef
pub(crate) unsafe fn from_vm_funcref( store: &mut impl AsStoreMut, funcref: VMFuncRef, ) -> Self
Sourcepub fn typed<Args, Rets>(
&self,
store: &impl AsStoreRef,
) -> Result<TypedFunction<Args, Rets>, RuntimeError>where
Args: WasmTypeList,
Rets: WasmTypeList,
pub fn typed<Args, Rets>(
&self,
store: &impl AsStoreRef,
) -> Result<TypedFunction<Args, Rets>, RuntimeError>where
Args: WasmTypeList,
Rets: WasmTypeList,
Transform this WebAssembly function into a typed function.
See TypedFunction to learn more.
§Examples
let sum = instance.exports.get_function("sum").unwrap();
let sum_typed: TypedFunction<(i32, i32), i32> = sum.typed(&mut store).unwrap();
assert_eq!(sum_typed.call(&mut store, 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_typed : TypedFunction<(i64, i64), i32> = sum.typed(&mut store).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_typed: TypedFunction<(i32, i32), i64> = sum.typed(&mut store).unwrap();pub(crate) fn from_vm_extern( store: &mut impl AsStoreMut, vm_extern: VMExternFunction, ) -> Self
Sourcepub fn is_from_store(&self, store: &impl AsStoreRef) -> bool
pub fn is_from_store(&self, store: &impl AsStoreRef) -> bool
Checks whether this Function can be used with the given store.
pub(crate) fn to_vm_extern(&self) -> VMExtern
Trait Implementations§
Source§impl Clone for BackendFunction
impl Clone for BackendFunction
Source§fn clone(&self) -> BackendFunction
fn clone(&self) -> BackendFunction
1.0.0 · Source§fn clone_from(&mut self, source: &Self)
fn clone_from(&mut self, source: &Self)
source. Read moreSource§impl Debug for BackendFunction
impl Debug for BackendFunction
Source§impl<'a> Exportable<'a> for BackendFunction
impl<'a> Exportable<'a> for BackendFunction
Source§fn get_self_from_extern(_extern: &'a Extern) -> Result<&'a Self, ExportError>
fn get_self_from_extern(_extern: &'a Extern) -> Result<&'a Self, ExportError>
Instance by name.Source§impl PartialEq for BackendFunction
impl PartialEq for BackendFunction
impl Eq for BackendFunction
impl StructuralPartialEq for BackendFunction
Auto Trait Implementations§
impl Freeze for BackendFunction
impl RefUnwindSafe for BackendFunction
impl Send for BackendFunction
impl Sync for BackendFunction
impl Unpin for BackendFunction
impl UnwindSafe for BackendFunction
Blanket Implementations§
§impl<T> ArchivePointee for T
impl<T> ArchivePointee for T
§type ArchivedMetadata = ()
type ArchivedMetadata = ()
§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,
§impl<Q, K> Equivalent<K> for Q
impl<Q, K> Equivalent<K> for Q
§fn equivalent(&self, key: &K) -> bool
fn equivalent(&self, key: &K) -> bool
§impl<Q, K> Equivalent<K> for Q
impl<Q, K> Equivalent<K> for Q
§fn equivalent(&self, key: &K) -> bool
fn equivalent(&self, key: &K) -> bool
§impl<Q, K> Equivalent<K> for Q
impl<Q, K> Equivalent<K> for Q
§fn equivalent(&self, key: &K) -> bool
fn equivalent(&self, key: &K) -> bool
key and return true if they are equal.§impl<Q, K> Equivalent<K> for Q
impl<Q, K> Equivalent<K> for Q
§fn equivalent(&self, key: &K) -> bool
fn equivalent(&self, key: &K) -> bool
Source§impl<'a, T> ExportableWithGenerics<'a, (), ()> for Twhere
T: Exportable<'a> + Clone + 'static,
impl<'a, T> ExportableWithGenerics<'a, (), ()> for Twhere
T: Exportable<'a> + Clone + 'static,
Source§fn get_self_from_extern_with_generics(
_extern: &'a Extern,
) -> Result<T, ExportError>
fn get_self_from_extern_with_generics( _extern: &'a Extern, ) -> Result<T, ExportError>
§impl<T> Instrument for T
impl<T> Instrument for T
§fn instrument(self, span: Span) -> Instrumented<Self>
fn instrument(self, span: Span) -> Instrumented<Self>
§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