about summary refs log tree commit diff
path: root/src/comp/middle
diff options
context:
space:
mode:
authorMarijn Haverbeke <marijnh@gmail.com>2011-12-18 19:07:26 +0100
committerMarijn Haverbeke <marijnh@gmail.com>2011-12-18 19:07:26 +0100
commitb36ade1367a2dbca69386b58d225ceafa6a90d57 (patch)
treef5f9a9a04a30de721db3e30e4565aa3cbd3066c1 /src/comp/middle
parent3fa930f5986a47ee1fa1d25d96c3c17904d60b1f (diff)
downloadrust-b36ade1367a2dbca69386b58d225ceafa6a90d57.tar.gz
rust-b36ade1367a2dbca69386b58d225ceafa6a90d57.zip
Improve efficienty of impl cache in resolve
And fix a bug where importing anything from an external module would
import all impls in the module.

Issue #1227
Diffstat (limited to 'src/comp/middle')
-rw-r--r--src/comp/middle/resolve.rs25
1 files changed, 15 insertions, 10 deletions
diff --git a/src/comp/middle/resolve.rs b/src/comp/middle/resolve.rs
index b0b3c02db00..c00bd711eb0 100644
--- a/src/comp/middle/resolve.rs
+++ b/src/comp/middle/resolve.rs
@@ -1717,22 +1717,27 @@ fn find_impls_in_mod(e: env, m: def, &impls: [@_impl],
                      name: option::t<ident>) {
     alt m {
       ast::def_mod(defid) {
+        let cached;
         alt e.impl_cache.find(defid) {
-          some(v) { impls += *v; }
+          some(v) { cached = v; }
           none. {
-            let found = [];
-            if defid.crate == ast::local_crate {
-                let md = option::get(e.mod_map.get(defid.node).m);
-                for i in md.items {
-                    find_impls_in_item(i, found, name, some(md));
+            cached = if defid.crate == ast::local_crate {
+                let tmp = [];
+                for i in option::get(e.mod_map.get(defid.node).m).items {
+                    find_impls_in_item(i, tmp, name, none);
                 }
+                @tmp
             } else {
-                found = csearch::get_impls_for_mod(e.cstore, defid, name);
-            }
-            impls += found;
-            e.impl_cache.insert(defid, @found);
+                @csearch::get_impls_for_mod(e.cstore, defid, name)
+            };
+            e.impl_cache.insert(defid, cached);
           }
         }
+        for im in *cached {
+            if alt name { some(n) { n == im.ident } _ { true } } {
+                impls += [im];
+            }
+        }
       }
       _ {}
     }