From f72c031eb9a15f25834a7980008db764ff2867a0 Mon Sep 17 00:00:00 2001 From: Aleksey Kladov Date: Thu, 10 Jan 2019 13:04:04 +0300 Subject: [PATCH] implement RefUnwindSafe --- Cargo.lock | 2 +- crates/ra_db/src/lib.rs | 5 ++--- crates/ra_db/src/loc2id.rs | 11 ++++++++++- crates/ra_hir/src/mock.rs | 4 +++- 4 files changed, 16 insertions(+), 6 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index eb053a09c0..74e9d0e6ec 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1024,7 +1024,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "salsa" version = "0.9.1" -source = "git+https://github.com/matklad/salsa?branch=panic-hooks#add15d83eaa865571cd33e60b2eb611a366ca3ff" +source = "git+https://github.com/matklad/salsa?branch=panic-hooks#a17757bbaaadeed4839366745b848d66ac991cd0" dependencies = [ "derive-new 0.5.6 (registry+https://github.com/rust-lang/crates.io-index)", "indexmap 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", diff --git a/crates/ra_db/src/lib.rs b/crates/ra_db/src/lib.rs index 00d2d5ae9b..20e712afe3 100644 --- a/crates/ra_db/src/lib.rs +++ b/crates/ra_db/src/lib.rs @@ -20,7 +20,7 @@ pub use crate::{ loc2id::LocationIntener, }; -pub trait BaseDatabase: salsa::Database { +pub trait BaseDatabase: salsa::Database + panic::RefUnwindSafe { fn check_canceled(&self) -> Cancelable<()> { self.salsa_runtime() .if_current_revision_is_canceled(Canceled::throw); @@ -31,8 +31,7 @@ pub trait BaseDatabase: salsa::Database { &self, f: F, ) -> Result { - let me = panic::AssertUnwindSafe(self); - panic::catch_unwind(|| f(me.0)).map_err(|err| match err.downcast::() { + panic::catch_unwind(|| f(self)).map_err(|err| match err.downcast::() { Ok(canceled) => *canceled, Err(payload) => panic::resume_unwind(payload), }) diff --git a/crates/ra_db/src/loc2id.rs b/crates/ra_db/src/loc2id.rs index 254c526298..359cd893d8 100644 --- a/crates/ra_db/src/loc2id.rs +++ b/crates/ra_db/src/loc2id.rs @@ -1,4 +1,4 @@ -use std::hash::Hash; +use std::{panic, hash::Hash}; use parking_lot::Mutex; use rustc_hash::FxHashMap; @@ -70,6 +70,15 @@ where map: Mutex>, } +impl panic::RefUnwindSafe for LocationIntener +where + ID: ArenaId + Clone, + LOC: Clone + Eq + Hash, + ID: panic::RefUnwindSafe, + LOC: panic::RefUnwindSafe, +{ +} + impl Default for LocationIntener where ID: ArenaId + Clone, diff --git a/crates/ra_hir/src/mock.rs b/crates/ra_hir/src/mock.rs index 0fae7de82a..7a0301648a 100644 --- a/crates/ra_hir/src/mock.rs +++ b/crates/ra_hir/src/mock.rs @@ -1,4 +1,4 @@ -use std::sync::Arc; +use std::{sync::Arc, panic}; use parking_lot::Mutex; use salsa::{self, Database}; @@ -18,6 +18,8 @@ pub(crate) struct MockDatabase { file_counter: u32, } +impl panic::RefUnwindSafe for MockDatabase {} + impl MockDatabase { pub(crate) fn with_files(fixture: &str) -> (MockDatabase, SourceRoot) { let (db, source_root, position) = MockDatabase::from_fixture(fixture);