]> git.lizzy.rs Git - rust.git/commitdiff
Improve efficienty of impl cache in resolve
authorMarijn Haverbeke <marijnh@gmail.com>
Sun, 18 Dec 2011 18:07:26 +0000 (19:07 +0100)
committerMarijn Haverbeke <marijnh@gmail.com>
Sun, 18 Dec 2011 18:07:26 +0000 (19:07 +0100)
And fix a bug where importing anything from an external module would
import all impls in the module.

Issue #1227

src/comp/middle/resolve.rs

index b0b3c02db00ec3ed32ccd66618a8afd37634f4f2..c00bd711eb0e1a1e583950563dc81ead5c55209f 100644 (file)
@@ -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];
+            }
+        }
       }
       _ {}
     }