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.call(&mut context, &args, &mut results);
23 
24     crate::handle_result(result, |_| {
25         for (c_val, rust_val) in std::iter::zip(c_results, results) {
26             *c_val = wasmtime_component_val_t::from(&rust_val);
27         }
28     })
29 }
30 
31 #[unsafe(no_mangle)]
32 pub unsafe extern "C" fn wasmtime_component_func_post_return(
33     func: &Func,
34     mut context: WasmtimeStoreContextMut<'_>,
35 ) -> Option<Box<wasmtime_error_t>> {
36     let result = func.post_return(&mut context);
37 
38     crate::handle_result(result, |_| {})
39 }
40