Skip to content

Commit 327c706

Browse files
Bromeonnyanpasu64
andcommitted
Improve panic messages in init/terminate callbacks
Co-authored-by: nyanpasu64 <[email protected]>
1 parent 3731a64 commit 327c706

File tree

2 files changed

+26
-15
lines changed

2 files changed

+26
-15
lines changed

gdnative-core/src/init/macros.rs

Lines changed: 5 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -56,13 +56,9 @@ macro_rules! godot_nativescript_init {
5656
}
5757
}
5858

59-
let __result = ::std::panic::catch_unwind(|| {
59+
$crate::private::report_panics("nativescript_init", || {
6060
$callback($crate::init::InitHandle::new(handle));
6161
});
62-
63-
if __result.is_err() {
64-
$crate::godot_error!("gdnative-core: nativescript_init callback panicked");
65-
}
6662
}
6763
};
6864
}
@@ -104,13 +100,10 @@ macro_rules! godot_gdnative_init {
104100
return;
105101
}
106102

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)
110106
});
111-
if __result.is_err() {
112-
$crate::godot_error!("gdnative-core: gdnative_init callback panicked");
113-
}
114107
}
115108
};
116109
}
@@ -152,13 +145,10 @@ macro_rules! godot_gdnative_terminate {
152145
return;
153146
}
154147

155-
let __result = ::std::panic::catch_unwind(|| {
148+
$crate::private::report_panics("gdnative_terminate", || {
156149
let term_info = $crate::init::TerminateInfo::new(options);
157150
$callback(&term_info)
158151
});
159-
if __result.is_err() {
160-
$crate::godot_error!("gdnative-core: nativescript_init callback panicked");
161-
}
162152

163153
$crate::private::cleanup_internal_state();
164154
}

gdnative-core/src/private.rs

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
use std::ffi::CString;
2+
use std::panic::{catch_unwind, UnwindSafe};
23

34
use crate::sys;
45

@@ -181,6 +182,26 @@ unsafe fn report_init_error(
181182
}
182183
}
183184

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+
184205
pub mod godot_object {
185206
pub trait Sealed {}
186207
}

0 commit comments

Comments
 (0)