Skip to content

Commit b36ade1

Browse files
committed
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
1 parent 3fa930f commit b36ade1

File tree

1 file changed

+15
-10
lines changed

1 file changed

+15
-10
lines changed

src/comp/middle/resolve.rs

Lines changed: 15 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1717,22 +1717,27 @@ fn find_impls_in_mod(e: env, m: def, &impls: [@_impl],
17171717
name: option::t<ident>) {
17181718
alt m {
17191719
ast::def_mod(defid) {
1720+
let cached;
17201721
alt e.impl_cache.find(defid) {
1721-
some(v) { impls += *v; }
1722+
some(v) { cached = v; }
17221723
none. {
1723-
let found = [];
1724-
if defid.crate == ast::local_crate {
1725-
let md = option::get(e.mod_map.get(defid.node).m);
1726-
for i in md.items {
1727-
find_impls_in_item(i, found, name, some(md));
1724+
cached = if defid.crate == ast::local_crate {
1725+
let tmp = [];
1726+
for i in option::get(e.mod_map.get(defid.node).m).items {
1727+
find_impls_in_item(i, tmp, name, none);
17281728
}
1729+
@tmp
17291730
} else {
1730-
found = csearch::get_impls_for_mod(e.cstore, defid, name);
1731-
}
1732-
impls += found;
1733-
e.impl_cache.insert(defid, @found);
1731+
@csearch::get_impls_for_mod(e.cstore, defid, name)
1732+
};
1733+
e.impl_cache.insert(defid, cached);
17341734
}
17351735
}
1736+
for im in *cached {
1737+
if alt name { some(n) { n == im.ident } _ { true } } {
1738+
impls += [im];
1739+
}
1740+
}
17361741
}
17371742
_ {}
17381743
}

0 commit comments

Comments
 (0)