summaryrefslogtreecommitdiffstats
path: root/vendor/git2/src/panic.rs
diff options
context:
space:
mode:
Diffstat (limited to 'vendor/git2/src/panic.rs')
-rw-r--r--vendor/git2/src/panic.rs33
1 files changed, 33 insertions, 0 deletions
diff --git a/vendor/git2/src/panic.rs b/vendor/git2/src/panic.rs
new file mode 100644
index 0000000..3e1b208
--- /dev/null
+++ b/vendor/git2/src/panic.rs
@@ -0,0 +1,33 @@
+use std::any::Any;
+use std::cell::RefCell;
+
+thread_local!(static LAST_ERROR: RefCell<Option<Box<dyn Any + Send>>> = {
+ RefCell::new(None)
+});
+
+pub fn wrap<T, F: FnOnce() -> T + std::panic::UnwindSafe>(f: F) -> Option<T> {
+ use std::panic;
+ if LAST_ERROR.with(|slot| slot.borrow().is_some()) {
+ return None;
+ }
+ match panic::catch_unwind(f) {
+ Ok(ret) => Some(ret),
+ Err(e) => {
+ LAST_ERROR.with(move |slot| {
+ *slot.borrow_mut() = Some(e);
+ });
+ None
+ }
+ }
+}
+
+pub fn check() {
+ let err = LAST_ERROR.with(|slot| slot.borrow_mut().take());
+ if let Some(err) = err {
+ std::panic::resume_unwind(err);
+ }
+}
+
+pub fn panicked() -> bool {
+ LAST_ERROR.with(|slot| slot.borrow().is_some())
+}