]> git.lizzy.rs Git - rust.git/commitdiff
resolve: Don't use @RefCell in trait_map, nothing modifies its entries.
authorEduard Burtescu <edy.burt@gmail.com>
Mon, 24 Feb 2014 08:36:24 +0000 (10:36 +0200)
committerEduard Burtescu <edy.burt@gmail.com>
Tue, 25 Feb 2014 17:08:55 +0000 (19:08 +0200)
src/librustc/middle/resolve.rs
src/librustc/middle/typeck/check/method.rs

index dbf548bed98bf931714539e092e0962810c31a8f..5dc18bc08f18eb92f3b67664373f295407388653 100644 (file)
@@ -46,7 +46,7 @@ struct binding_info {
 type BindingMap = HashMap<Name,binding_info>;
 
 // Trait method resolution
-pub type TraitMap = HashMap<NodeId,@RefCell<~[DefId]>>;
+pub type TraitMap = HashMap<NodeId, ~[DefId]>;
 
 // This is the replacement export map. It maps a module to all of the exports
 // within.
@@ -5255,14 +5255,14 @@ fn record_candidate_traits_for_expr_if_necessary(&mut self, expr: &Expr) {
                 // the field name so that we can do some nice error reporting
                 // later on in typeck.
                 let traits = self.search_for_traits_containing_method(ident);
-                self.trait_map.insert(expr.id, @RefCell::new(traits));
+                self.trait_map.insert(expr.id, traits);
             }
             ExprMethodCall(_, ident, _, _) => {
                 debug!("(recording candidate traits for expr) recording \
                         traits for {}",
                        expr.id);
                 let traits = self.search_for_traits_containing_method(ident);
-                self.trait_map.insert(expr.id, @RefCell::new(traits));
+                self.trait_map.insert(expr.id, traits);
             }
             _ => {
                 // Nothing to do.
index 0dd0041344fdc0a17d441698d30e7363bf881e2b..4695521d0d91c76764f7ba3f46ead6b1bd1a1cde 100644 (file)
@@ -81,7 +81,6 @@ trait `ToStr` imported, and I call `to_str()` on a value of type `T`,
 
 
 use middle::subst::Subst;
-use middle::resolve;
 use middle::ty::*;
 use middle::ty;
 use middle::typeck::astconv::AstConv;
@@ -396,28 +395,10 @@ fn push_extension_candidates(&self) {
         // If the method being called is associated with a trait, then
         // find all the impls of that trait.  Each of those are
         // candidates.
-        let trait_map: &resolve::TraitMap = &self.fcx.ccx.trait_map;
-        let opt_applicable_traits = trait_map.find(&self.expr.id);
-        for applicable_traits in opt_applicable_traits.iter() {
-            let applicable_traits = applicable_traits.borrow();
-            for trait_did in applicable_traits.get().iter() {
-                ty::populate_implementations_for_trait_if_necessary(
-                    self.tcx(),
-                    *trait_did);
-
-                // Look for explicit implementations.
-                let trait_impls = self.tcx().trait_impls.borrow();
-                let opt_impl_infos = trait_impls.get().find(trait_did);
-                for impl_infos in opt_impl_infos.iter() {
-                    let impl_infos = impl_infos.borrow();
-                    for impl_info in impl_infos.get().iter() {
-                        let mut extension_candidates =
-                            self.extension_candidates.borrow_mut();
-                        self.push_candidates_from_impl(
-                            extension_candidates.get(), *impl_info);
-
-                    }
-                }
+        let opt_applicable_traits = self.fcx.ccx.trait_map.find(&self.expr.id);
+        for applicable_traits in opt_applicable_traits.move_iter() {
+            for trait_did in applicable_traits.iter() {
+                self.push_extension_candidate(*trait_did);
             }
         }
     }