wasmtime_c_api/component/
func.rs1use 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)]
30#[cfg(feature = "component-model-async")]
31pub unsafe extern "C" fn wasmtime_component_func_call_async<'a>(
32 func: &'a Func,
33 mut context: WasmtimeStoreContextMut<'a>,
34 args: *const wasmtime_component_val_t,
35 args_len: usize,
36 results: *mut wasmtime_component_val_t,
37 results_len: usize,
38 err_ret: &'a mut *mut wasmtime_error_t,
39) -> Box<crate::wasmtime_call_future_t<'a>> {
40 let c_args = unsafe { crate::slice_from_raw_parts(args, args_len) };
41 let c_results = unsafe { crate::slice_from_raw_parts_mut(results, results_len) };
42 let fut = Box::pin(async move {
43 let args = c_args.iter().map(Val::from).collect::<Vec<_>>();
44 let mut results = vec![Val::Bool(false); c_results.len()];
45
46 match func.call_async(&mut context, &args, &mut results).await {
47 Ok(()) => {
48 for (c_val, rust_val) in std::iter::zip(c_results.iter_mut(), results) {
49 *c_val = wasmtime_component_val_t::from(&rust_val);
50 }
51 }
52 Err(err) => {
53 *err_ret = Box::into_raw(Box::new(wasmtime_error_t::from(err)));
54 }
55 }
56 });
57 Box::new(crate::wasmtime_call_future_t::new(fut))
58}
59
60#[deprecated(note = "no longer has any effect")]
61#[unsafe(no_mangle)]
62pub unsafe extern "C" fn wasmtime_component_func_post_return(
63 _func: &Func,
64 _context: WasmtimeStoreContextMut<'_>,
65) -> Option<Box<wasmtime_error_t>> {
66 None
67}
68
69#[unsafe(no_mangle)]
70pub extern "C" fn wasmtime_component_func_type(
71 func: &Func,
72 context: WasmtimeStoreContextMut<'_>,
73) -> Box<wasmtime_component_func_type_t> {
74 Box::new(func.ty(context).into())
75}