diff --git a/src/librustc/middle/reachable.rs b/src/librustc/middle/reachable.rs index d665d279a175..61442e190956 100644 --- a/src/librustc/middle/reachable.rs +++ b/src/librustc/middle/reachable.rs @@ -374,7 +374,8 @@ impl ReachableContext { // this properly would result in the necessity of computing *type* // reachability, which might result in a compile time loss. fn mark_destructors_reachable(&self) { - for (_, destructor_def_id) in self.tcx.destructor_for_type.iter() { + let destructor_for_type = self.tcx.destructor_for_type.borrow(); + for (_, destructor_def_id) in destructor_for_type.get().iter() { if destructor_def_id.crate == ast::LOCAL_CRATE { self.reachable_symbols.insert(destructor_def_id.node); } diff --git a/src/librustc/middle/ty.rs b/src/librustc/middle/ty.rs index 354f0b7ae39f..1d0bc49b8c9d 100644 --- a/src/librustc/middle/ty.rs +++ b/src/librustc/middle/ty.rs @@ -327,7 +327,7 @@ struct ctxt_ { // of the method that implements its destructor. If the type is not // present in this map, it does not have a destructor. This map is // populated during the coherence phase of typechecking. - destructor_for_type: @mut HashMap, + destructor_for_type: RefCell>, // A method will be in this list if and only if it is a destructor. destructors: @mut HashSet, @@ -1003,7 +1003,7 @@ pub fn mk_ctxt(s: session::Session, lang_items: lang_items, provided_method_sources: RefCell::new(HashMap::new()), supertraits: RefCell::new(HashMap::new()), - destructor_for_type: @mut HashMap::new(), + destructor_for_type: RefCell::new(HashMap::new()), destructors: @mut HashSet::new(), trait_impls: @mut HashMap::new(), inherent_impls: @mut HashMap::new(), @@ -3813,7 +3813,8 @@ impl DtorKind { /* If struct_id names a struct with a dtor, return Some(the dtor's id). Otherwise return none. */ pub fn ty_dtor(cx: ctxt, struct_id: DefId) -> DtorKind { - match cx.destructor_for_type.find(&struct_id) { + let destructor_for_type = cx.destructor_for_type.borrow(); + match destructor_for_type.get().find(&struct_id) { Some(&method_def_id) => { let flag = !has_attr(cx, struct_id, "unsafe_no_drop_flag"); diff --git a/src/librustc/middle/typeck/check/method.rs b/src/librustc/middle/typeck/check/method.rs index 3838dce9472c..56e9f6be55e6 100644 --- a/src/librustc/middle/typeck/check/method.rs +++ b/src/librustc/middle/typeck/check/method.rs @@ -1157,7 +1157,10 @@ impl<'a> LookupContext<'a> { // that self has been merged in? -sully method_param(method_param { trait_id: trait_id, .. }) | method_object(method_object { trait_id: trait_id, .. }) => { - bad = self.tcx().destructor_for_type.contains_key(&trait_id); + let destructor_for_type = self.tcx() + .destructor_for_type + .borrow(); + bad = destructor_for_type.get().contains_key(&trait_id); } } diff --git a/src/librustc/middle/typeck/coherence.rs b/src/librustc/middle/typeck/coherence.rs index 47f4cc5ea152..0371f877f4fa 100644 --- a/src/librustc/middle/typeck/coherence.rs +++ b/src/librustc/middle/typeck/coherence.rs @@ -705,8 +705,10 @@ impl CoherenceChecker { let self_type = self.get_self_type_for_implementation(*impl_info); match ty::get(self_type.ty).sty { ty::ty_struct(type_def_id, _) => { - tcx.destructor_for_type.insert(type_def_id, - method_def_id); + let mut destructor_for_type = tcx.destructor_for_type + .borrow_mut(); + destructor_for_type.get().insert(type_def_id, + method_def_id); tcx.destructors.insert(method_def_id); } _ => {