1 use super::wasmtime_component_val_t; 2 use crate::{WasmtimeStoreContextMut, wasmtime_component_func_type_t, wasmtime_error_t}; 3 use wasmtime::component::{Func, Val}; 4 5 #[unsafe(no_mangle)] 6 pub 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)] 30 pub 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)] 40 pub 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 } 46