wasmtime_c_api/component/
func.rs

1use super::wasmtime_component_val_t;
2use crate::{WasmtimeStoreContextMut, wasmtime_component_func_type_t, wasmtime_error_t};
3use wasmtime::component::{Func, Val};
4
5#[unsafe(no_mangle)]
6pub unsafe extern "C" fn wasmtime_component_func_call(
7    func: &Func,
8    mut context: WasmtimeStoreContextMut<'_>,
9    args: *const wasmtime_component_val_t,
10    args_len: usize,
11    results: *mut wasmtime_component_val_t,
12    results_len: usize,
13) -> Option<Box<wasmtime_error_t>> {
14    let c_args = unsafe { crate::slice_from_raw_parts(args, args_len) };
15    let c_results = unsafe { crate::slice_from_raw_parts_mut(results, results_len) };
16
17    let args = c_args.iter().map(Val::from).collect::<Vec<_>>();
18    let mut results = vec![Val::Bool(false); results_len];
19
20    let result = func.call(&mut context, &args, &mut results);
21
22    crate::handle_result(result, |_| {
23        for (c_val, rust_val) in std::iter::zip(c_results, results) {
24            *c_val = wasmtime_component_val_t::from(&rust_val);
25        }
26    })
27}
28
29#[unsafe(no_mangle)]
30pub unsafe extern "C" fn wasmtime_component_func_post_return(
31    func: &Func,
32    mut context: WasmtimeStoreContextMut<'_>,
33) -> Option<Box<wasmtime_error_t>> {
34    let result = func.post_return(&mut context);
35
36    crate::handle_result(result, |_| {})
37}
38
39#[unsafe(no_mangle)]
40pub extern "C" fn wasmtime_component_func_type(
41    func: &Func,
42    context: WasmtimeStoreContextMut<'_>,
43) -> Box<wasmtime_component_func_type_t> {
44    Box::new(func.ty(context).into())
45}