summaryrefslogtreecommitdiffstats
path: root/third_party/rust/rure/src/macros.rs
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--third_party/rust/rure/src/macros.rs36
1 files changed, 36 insertions, 0 deletions
diff --git a/third_party/rust/rure/src/macros.rs b/third_party/rust/rure/src/macros.rs
new file mode 100644
index 0000000000..7807cf8535
--- /dev/null
+++ b/third_party/rust/rure/src/macros.rs
@@ -0,0 +1,36 @@
+macro_rules! ffi_fn {
+ (fn $name:ident($($arg:ident: $arg_ty:ty),*,) -> $ret:ty $body:block) => {
+ ffi_fn!(fn $name($($arg: $arg_ty),*) -> $ret $body);
+ };
+ (fn $name:ident($($arg:ident: $arg_ty:ty),*) -> $ret:ty $body:block) => {
+ #[no_mangle]
+ pub extern fn $name($($arg: $arg_ty),*) -> $ret {
+ use ::std::io::{self, Write};
+ use ::std::panic::{self, AssertUnwindSafe};
+ use ::libc::abort;
+ match panic::catch_unwind(AssertUnwindSafe(move || $body)) {
+ Ok(v) => v,
+ Err(err) => {
+ let msg = if let Some(&s) = err.downcast_ref::<&str>() {
+ s.to_owned()
+ } else if let Some(s) = err.downcast_ref::<String>() {
+ s.to_owned()
+ } else {
+ "UNABLE TO SHOW RESULT OF PANIC.".to_owned()
+ };
+ let _ = writeln!(
+ &mut io::stderr(),
+ "panic unwind caught, aborting: {:?}",
+ msg);
+ unsafe { abort() }
+ }
+ }
+ }
+ };
+ (fn $name:ident($($arg:ident: $arg_ty:ty),*,) $body:block) => {
+ ffi_fn!(fn $name($($arg: $arg_ty),*) -> () $body);
+ };
+ (fn $name:ident($($arg:ident: $arg_ty:ty),*) $body:block) => {
+ ffi_fn!(fn $name($($arg: $arg_ty),*) -> () $body);
+ };
+}