@@ -30,7 +30,7 @@ pub fn duktape_fn(_attr: TokenStream, mut item: TokenStream) -> TokenStream {
30
30
duk:: duk_sys:: duk_push_error_object(
31
31
ctx,
32
32
duk:: duk_sys:: DUK_ERR_TYPE_ERROR as i32 ,
33
- std:: ffi:: CString :: new( format!( "{}" , e) ) . into_raw( ) ,
33
+ std:: ffi:: CString :: new( format!( "{}" , e) ) . unwrap_or_default ( ) . into_raw( ) ,
34
34
) ;
35
35
duk:: duk_sys:: duk_throw_raw( ctx) ;
36
36
return 0 ;
@@ -49,7 +49,7 @@ pub fn duktape_fn(_attr: TokenStream, mut item: TokenStream) -> TokenStream {
49
49
duk:: duk_sys:: duk_push_error_object(
50
50
ctx,
51
51
duk:: duk_sys:: DUK_ERR_TYPE_ERROR as i32 ,
52
- std:: ffi:: CString :: new( format!( "{}" , e) ) . into_raw( ) ,
52
+ std:: ffi:: CString :: new( format!( "{}" , e) ) . unwrap_or_default ( ) . into_raw( ) ,
53
53
) ;
54
54
duk:: duk_sys:: duk_throw_raw( ctx) ;
55
55
0
@@ -74,9 +74,27 @@ pub fn duktape_fn(_attr: TokenStream, mut item: TokenStream) -> TokenStream {
74
74
#(
75
75
#args
76
76
) *
77
- let res = fn_impl( #(
77
+ let res = match std :: panic :: catch_unwind ( || fn_impl( #(
78
78
#arg_names,
79
- ) * ) ;
79
+ ) * ) ) {
80
+ Ok ( res) => res,
81
+ Err ( e) => {
82
+ let error = if let Some ( msg) = e. downcast_ref:: <& str >( ) {
83
+ format!( "panic: {}" , * msg)
84
+ } else if let Some ( msg) = e. downcast_ref:: <String >( ) {
85
+ format!( "panic: {}" , msg)
86
+ } else {
87
+ "panic: unknown error" . into( )
88
+ } ;
89
+ duk:: duk_sys:: duk_push_error_object(
90
+ ctx,
91
+ duk:: duk_sys:: DUK_ERR_ERROR as i32 ,
92
+ std:: ffi:: CString :: new( error) . unwrap_or_default( ) . into_raw( ) ,
93
+ ) ;
94
+ duk:: duk_sys:: duk_throw_raw( ctx) ;
95
+ return 0 ;
96
+ }
97
+ } ;
80
98
#ret
81
99
}
82
100
}
0 commit comments