File tree Expand file tree Collapse file tree 2 files changed +26
-15
lines changed Expand file tree Collapse file tree 2 files changed +26
-15
lines changed Original file line number Diff line number Diff line change @@ -56,13 +56,9 @@ macro_rules! godot_nativescript_init {
56
56
}
57
57
}
58
58
59
- let __result = :: std :: panic :: catch_unwind ( || {
59
+ $crate :: private :: report_panics ( "nativescript_init" , || {
60
60
$callback( $crate:: init:: InitHandle :: new( handle) ) ;
61
61
} ) ;
62
-
63
- if __result. is_err( ) {
64
- $crate:: godot_error!( "gdnative-core: nativescript_init callback panicked" ) ;
65
- }
66
62
}
67
63
} ;
68
64
}
@@ -104,13 +100,10 @@ macro_rules! godot_gdnative_init {
104
100
return ;
105
101
}
106
102
107
- let __result = :: std :: panic :: catch_unwind ( || {
108
- let callback_options = $crate:: init:: InitializeInfo :: new( options) ;
109
- $callback( & callback_options )
103
+ $crate :: private :: report_panics ( "gdnative_init" , || {
104
+ let init_info = $crate:: init:: InitializeInfo :: new( options) ;
105
+ $callback( & init_info )
110
106
} ) ;
111
- if __result. is_err( ) {
112
- $crate:: godot_error!( "gdnative-core: gdnative_init callback panicked" ) ;
113
- }
114
107
}
115
108
} ;
116
109
}
@@ -152,13 +145,10 @@ macro_rules! godot_gdnative_terminate {
152
145
return ;
153
146
}
154
147
155
- let __result = :: std :: panic :: catch_unwind ( || {
148
+ $crate :: private :: report_panics ( "gdnative_terminate" , || {
156
149
let term_info = $crate:: init:: TerminateInfo :: new( options) ;
157
150
$callback( & term_info)
158
151
} ) ;
159
- if __result. is_err( ) {
160
- $crate:: godot_error!( "gdnative-core: nativescript_init callback panicked" ) ;
161
- }
162
152
163
153
$crate:: private:: cleanup_internal_state( ) ;
164
154
}
Original file line number Diff line number Diff line change 1
1
use std:: ffi:: CString ;
2
+ use std:: panic:: { catch_unwind, UnwindSafe } ;
2
3
3
4
use crate :: sys;
4
5
@@ -181,6 +182,26 @@ unsafe fn report_init_error(
181
182
}
182
183
}
183
184
185
+ #[ inline]
186
+ pub fn report_panics ( context : & str , callback : impl FnOnce ( ) + UnwindSafe ) {
187
+ let __result = catch_unwind ( callback) ;
188
+
189
+ if let Err ( e) = __result {
190
+ godot_error ! ( "gdnative-core: {} callback panicked" , context) ;
191
+ print_error ( e) ;
192
+ }
193
+ }
194
+
195
+ fn print_error ( err : Box < dyn std:: any:: Any + Send > ) {
196
+ if let Some ( s) = err. downcast_ref :: < String > ( ) {
197
+ godot_error ! ( "Panic message: {}" , s) ;
198
+ } else if let Some ( s) = err. downcast_ref :: < & ' static str > ( ) {
199
+ godot_error ! ( "Panic message: {}" , s) ;
200
+ } else {
201
+ godot_error ! ( "Panic message unknown, type {:?}" , err. type_id( ) ) ;
202
+ }
203
+ }
204
+
184
205
pub mod godot_object {
185
206
pub trait Sealed { }
186
207
}
You can’t perform that action at this time.
0 commit comments