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