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