[][src]Macro abi_stable::extern_fn_panic_handling

macro_rules! extern_fn_panic_handling {
    (no_early_return; $($fn_contents:tt)* ) => { ... };
    ( $($fn_contents:tt)* ) => { ... };
}

Use this to make sure that you handle panics inside extern fn correctly.

This macro causes an abort if a panic reaches this point.

It does not prevent functions inside from using ::std::panic::catch_unwind to catch the panic.

Early returns

This macro by default wraps the passed code in a closure so that any early returns that happen inside don't interfere with the macro generated code.

If you don't have an early return (a return/continue/break) in the code passed to this macro you can use extern_fn_panic_handling!{no_early_return; <code here> }, which might be cheaper(this has not been tested yet).

Example

use std::fmt;

use abi_stable::{
    extern_fn_panic_handling,
    std_types::RString,
};


pub extern "C" fn print_debug<T>(this: &T,buf: &mut RString)
where
    T: fmt::Debug,
{
    extern_fn_panic_handling! {
        use std::fmt::Write;

        println!("{:?}",this);
    }
}

Example, no_early_return

use std::fmt;

use abi_stable::{
    extern_fn_panic_handling,
    std_types::RString,
};


pub extern "C" fn print_debug<T>(this: &T,buf: &mut RString)
where
    T: fmt::Debug,
{
    extern_fn_panic_handling!{no_early_return;
        use std::fmt::Write;

        println!("{:?}",this);
    }
}