1284: Assert that DB is unwind-safe, instead of proving r=matklad a=matklad



Co-authored-by: Aleksey Kladov <aleksey.kladov@gmail.com>
This commit is contained in:
bors[bot] 2019-05-18 10:06:21 +00:00
commit 5edddae523

View File

@ -15,7 +15,7 @@ pub use crate::{
}, },
}; };
pub trait CheckCanceled: panic::RefUnwindSafe { pub trait CheckCanceled {
/// Aborts current query if there are pending changes. /// Aborts current query if there are pending changes.
/// ///
/// rust-analyzer needs to be able to answer semantic questions about the /// rust-analyzer needs to be able to answer semantic questions about the
@ -36,14 +36,15 @@ pub trait CheckCanceled: panic::RefUnwindSafe {
Self: Sized, Self: Sized,
F: FnOnce(&Self) -> T + panic::UnwindSafe, F: FnOnce(&Self) -> T + panic::UnwindSafe,
{ {
panic::catch_unwind(|| f(self)).map_err(|err| match err.downcast::<Canceled>() { let this = panic::AssertUnwindSafe(self);
panic::catch_unwind(|| f(*this)).map_err(|err| match err.downcast::<Canceled>() {
Ok(canceled) => *canceled, Ok(canceled) => *canceled,
Err(payload) => panic::resume_unwind(payload), Err(payload) => panic::resume_unwind(payload),
}) })
} }
} }
impl<T: salsa::Database + panic::RefUnwindSafe> CheckCanceled for T { impl<T: salsa::Database> CheckCanceled for T {
fn check_canceled(&self) { fn check_canceled(&self) {
if self.salsa_runtime().is_current_revision_canceled() { if self.salsa_runtime().is_current_revision_canceled() {
Canceled::throw() Canceled::throw()