1use crate::{
2 AsStoreMut, AsStoreRef, BackendFunctionEnv, BackendFunctionEnvMut, FunctionEnvMut,
3 FunctionType, HostFunction, RuntimeError, StoreInner, StoreMut, StoreRef, Value, WithEnv,
4 WithoutEnv,
5 utils::{FromToNativeWasmType, IntoResult, NativeWasmTypeInto, WasmTypeList},
6};
7
8use std::panic::{self, AssertUnwindSafe};
9use std::{cell::UnsafeCell, cmp::max, ffi::c_void};
10use wasmer_types::{NativeWasmType, RawValue};
11
12macro_rules! impl_host_function {
13 ([$c_struct_representation:ident] $c_struct_name:ident, $( $x:ident ),* ) => {
14 #[allow(unused_parens)]
15 impl< $( $x, )* Rets, RetsAsResult, T, Func> crate::HostFunction<T, ( $( $x ),* ), Rets, WithEnv> for Func where
16 $( $x: FromToNativeWasmType, )*
17 Rets: WasmTypeList,
18 RetsAsResult: IntoResult<Rets>,
19 T: Send + 'static,
20 Func: Fn(FunctionEnvMut<'_, T>, $( $x , )*) -> RetsAsResult + 'static,
21 {
22 #[allow(non_snake_case)]
23 fn function_callback(&self, rt: crate::backend::BackendKind) -> crate::vm::VMFunctionCallback {
24 paste::paste! {
25 match rt {
26 #[cfg(feature = "sys")]
27 crate::backend::BackendKind::Headless => crate::vm::VMFunctionCallback::Sys(crate::backend::sys::function::[<gen_fn_callback_ $c_struct_name:lower >](self)),
28 #[cfg(feature = "llvm")]
29 crate::backend::BackendKind::LLVM => crate::vm::VMFunctionCallback::Sys(crate::backend::sys::function::[<gen_fn_callback_ $c_struct_name:lower >](self)),
30 #[cfg(feature = "cranelift")]
31 crate::backend::BackendKind::Cranelift => crate::vm::VMFunctionCallback::Sys(crate::backend::sys::function::[<gen_fn_callback_ $c_struct_name:lower >](self)),
32 #[cfg(feature = "singlepass")]
33 crate::backend::BackendKind::Singlepass => crate::vm::VMFunctionCallback::Sys(crate::backend::sys::function::[<gen_fn_callback_ $c_struct_name:lower >](self)),
34 #[cfg(feature = "js")]
35 crate::backend::BackendKind::Js => crate::vm::VMFunctionCallback::Js(crate::backend::js::function::[<gen_fn_callback_ $c_struct_name:lower >](self)),
36 #[cfg(feature = "jsc")]
37 crate::backend::BackendKind::Jsc => crate::vm::VMFunctionCallback::Jsc(crate::backend::jsc::function::[<gen_fn_callback_ $c_struct_name:lower >](self)),
38 #[cfg(feature = "wamr")]
39 crate::backend::BackendKind::Wamr => crate::vm::VMFunctionCallback::Wamr(crate::backend::wamr::function::[<gen_fn_callback_ $c_struct_name:lower >](self)),
40 #[cfg(feature = "wasmi")]
41 crate::backend::BackendKind::Wasmi => crate::vm::VMFunctionCallback::Wasmi(crate::backend::wasmi::function::[<gen_fn_callback_ $c_struct_name:lower >](self)),
42 #[cfg(feature = "v8")]
43 crate::backend::BackendKind::V8 => crate::vm::VMFunctionCallback::V8(crate::backend::v8::function::[<gen_fn_callback_ $c_struct_name:lower >](self))
44 }
45 }
46 }
47
48 #[cfg(feature = "sys")]
49 fn function_callback_sys(&self) -> crate::vm::VMFunctionCallback {
50 paste::paste! {
51 crate::vm::VMFunctionCallback::Sys(crate::backend::sys::function::[<gen_fn_callback_ $c_struct_name:lower >](self))
52 }
53 }
54
55 #[allow(non_snake_case)]
56 fn call_trampoline_address() -> crate::vm::VMTrampoline {
57 paste::paste! {
58 #[cfg(feature = "sys")]
59 {
60 crate::vm::VMTrampoline::Sys(crate::backend::sys::function::[<gen_call_trampoline_address_ $c_struct_name:lower >]::<$($x,)* Rets>())
61 }
62
63 #[cfg(not(feature = "sys"))]
64 {
65 unimplemented!("No backend available")
66 }
67 }
68 }
69 }
70
71 #[allow(unused_parens)]
73 impl< $( $x, )* Rets, RetsAsResult, Func >
74 crate::HostFunction<(), ( $( $x ),* ), Rets, WithoutEnv>
75 for
76 Func
77 where
78 $( $x: FromToNativeWasmType, )*
79 Rets: WasmTypeList,
80 RetsAsResult: IntoResult<Rets>,
81 Func: Fn($( $x , )*) -> RetsAsResult + 'static
82 {
83 #[allow(non_snake_case)]
84 fn function_callback(&self, rt: crate::backend::BackendKind) -> crate::vm::VMFunctionCallback {
85 paste::paste! {
86 match rt {
87 #[cfg(feature = "sys")]
88 crate::backend::BackendKind::Headless => crate::vm::VMFunctionCallback::Sys(crate::backend::sys::function::[<gen_fn_callback_ $c_struct_name:lower _no_env>](self)),
89 #[cfg(feature = "llvm")]
90 crate::backend::BackendKind::LLVM => crate::vm::VMFunctionCallback::Sys(crate::backend::sys::function::[<gen_fn_callback_ $c_struct_name:lower _no_env>](self)),
91 #[cfg(feature = "cranelift")]
92 crate::backend::BackendKind::Cranelift => crate::vm::VMFunctionCallback::Sys(crate::backend::sys::function::[<gen_fn_callback_ $c_struct_name:lower _no_env>](self)),
93 #[cfg(feature = "singlepass")]
94 crate::backend::BackendKind::Singlepass => crate::vm::VMFunctionCallback::Sys(crate::backend::sys::function::[<gen_fn_callback_ $c_struct_name:lower _no_env>](self)),
95 #[cfg(feature = "js")]
96 crate::backend::BackendKind::Js => crate::vm::VMFunctionCallback::Js(crate::backend::js::function::[<gen_fn_callback_ $c_struct_name:lower _no_env>](self)),
97 #[cfg(feature = "jsc")]
98 crate::backend::BackendKind::Jsc => crate::vm::VMFunctionCallback::Jsc(crate::backend::jsc::function::[<gen_fn_callback_ $c_struct_name:lower _no_env>](self)),
99 #[cfg(feature = "wamr")]
100 crate::backend::BackendKind::Wamr => crate::vm::VMFunctionCallback::Wamr(crate::backend::wamr::function::[<gen_fn_callback_ $c_struct_name:lower _no_env>](self)),
101 #[cfg(feature = "wasmi")]
102 crate::backend::BackendKind::Wasmi => crate::vm::VMFunctionCallback::Wasmi(crate::backend::wasmi::function::[<gen_fn_callback_ $c_struct_name:lower _no_env>](self)),
103 #[cfg(feature = "v8")]
104 crate::backend::BackendKind::V8 => crate::vm::VMFunctionCallback::V8(crate::backend::v8::function::[<gen_fn_callback_ $c_struct_name:lower _no_env>](self))
105 }
106 }
107 }
108
109 #[allow(non_snake_case)]
110 #[cfg(feature = "sys")]
111 fn function_callback_sys(&self) -> crate::vm::VMFunctionCallback {
112 paste::paste! {
113 crate::vm::VMFunctionCallback::Sys(crate::backend::sys::function::[<gen_fn_callback_ $c_struct_name:lower _no_env>](self))
114 }
115 }
116
117 #[allow(non_snake_case)]
118 fn call_trampoline_address() -> crate::vm::VMTrampoline {
119 paste::paste! {
120 #[cfg(feature = "sys")]
121 {
122 crate::vm::VMTrampoline::Sys(crate::backend::sys::function::[<gen_call_trampoline_address_ $c_struct_name:lower _no_env>]::<$($x,)* Rets>())
123 }
124
125 #[cfg(not(feature = "sys"))]
126 {
127 unimplemented!("No backend available")
128 }
129 }
130 }
131 }
132 };
133}
134
135macro_rules! count_idents {
137 ( $($idents:ident),* ) => {
138 {
139 #[allow(dead_code, non_camel_case_types)]
140 enum Idents { $( $idents, )* __CountIdentsLast }
141 const COUNT: usize = Idents::__CountIdentsLast as usize;
142 COUNT
143 }
144 };
145}
146
147impl_host_function!([C] S0,);
150impl_host_function!([transparent] S1, A1);
151impl_host_function!([C] S2, A1, A2);
152impl_host_function!([C] S3, A1, A2, A3);
153impl_host_function!([C] S4, A1, A2, A3, A4);
154impl_host_function!([C] S5, A1, A2, A3, A4, A5);
155impl_host_function!([C] S6, A1, A2, A3, A4, A5, A6);
156impl_host_function!([C] S7, A1, A2, A3, A4, A5, A6, A7);
157impl_host_function!([C] S8, A1, A2, A3, A4, A5, A6, A7, A8);
158impl_host_function!([C] S9, A1, A2, A3, A4, A5, A6, A7, A8, A9);
159impl_host_function!([C] S10, A1, A2, A3, A4, A5, A6, A7, A8, A9, A10);
160impl_host_function!([C] S11, A1, A2, A3, A4, A5, A6, A7, A8, A9, A10, A11);
161impl_host_function!([C] S12, A1, A2, A3, A4, A5, A6, A7, A8, A9, A10, A11, A12);
162impl_host_function!([C] S13, A1, A2, A3, A4, A5, A6, A7, A8, A9, A10, A11, A12, A13);
163impl_host_function!([C] S14, A1, A2, A3, A4, A5, A6, A7, A8, A9, A10, A11, A12, A13, A14);
164impl_host_function!([C] S15, A1, A2, A3, A4, A5, A6, A7, A8, A9, A10, A11, A12, A13, A14, A15);
165impl_host_function!([C] S16, A1, A2, A3, A4, A5, A6, A7, A8, A9, A10, A11, A12, A13, A14, A15, A16);
166impl_host_function!([C] S17, A1, A2, A3, A4, A5, A6, A7, A8, A9, A10, A11, A12, A13, A14, A15, A16, A17);
167impl_host_function!([C] S18, A1, A2, A3, A4, A5, A6, A7, A8, A9, A10, A11, A12, A13, A14, A15, A16, A17, A18);
168impl_host_function!([C] S19, A1, A2, A3, A4, A5, A6, A7, A8, A9, A10, A11, A12, A13, A14, A15, A16, A17, A18, A19);
169impl_host_function!([C] S20, A1, A2, A3, A4, A5, A6, A7, A8, A9, A10, A11, A12, A13, A14, A15, A16, A17, A18, A19, A20);
170impl_host_function!([C] S21, A1, A2, A3, A4, A5, A6, A7, A8, A9, A10, A11, A12, A13, A14, A15, A16, A17, A18, A19, A20, A21);
171impl_host_function!([C] S22, A1, A2, A3, A4, A5, A6, A7, A8, A9, A10, A11, A12, A13, A14, A15, A16, A17, A18, A19, A20, A21, A22);
172impl_host_function!([C] S23, A1, A2, A3, A4, A5, A6, A7, A8, A9, A10, A11, A12, A13, A14, A15, A16, A17, A18, A19, A20, A21, A22, A23);
173impl_host_function!([C] S24, A1, A2, A3, A4, A5, A6, A7, A8, A9, A10, A11, A12, A13, A14, A15, A16, A17, A18, A19, A20, A21, A22, A23, A24);
174impl_host_function!([C] S25, A1, A2, A3, A4, A5, A6, A7, A8, A9, A10, A11, A12, A13, A14, A15, A16, A17, A18, A19, A20, A21, A22, A23, A24, A25);
175impl_host_function!([C] S26, A1, A2, A3, A4, A5, A6, A7, A8, A9, A10, A11, A12, A13, A14, A15, A16, A17, A18, A19, A20, A21, A22, A23, A24, A25, A26);