1macro_rules! ffi_fn {
3 ($(#[$doc:meta])* fn $name:ident($($arg:ident: $arg_ty:ty),*) -> $ret:ty $body:block) => {
4 $(#[$doc])*
5 #[no_mangle]
6 pub extern fn $name($($arg: $arg_ty),*) -> $ret {
7 use std::panic::{self, AssertUnwindSafe};
8
9 match panic::catch_unwind(AssertUnwindSafe(move || $body)) {
10 Ok(v) => v,
11 Err(_) => {
12 eprintln!("panic unwind caught, aborting");
15 std::process::abort();
16 }
17 }
18 }
19 };
20
21 ($(#[$doc:meta])* fn $name:ident($($arg:ident: $arg_ty:ty),*) $body:block) => {
22 ffi_fn!($(#[$doc])* fn $name($($arg: $arg_ty),*) -> () $body);
23 };
24}