Skip to content

Commit da519c8

Browse files
committed
Eliminate a use of map::get in freevars
map::get is evil -- just say no!
1 parent 4f3171e commit da519c8

File tree

1 file changed

+21
-14
lines changed

1 file changed

+21
-14
lines changed

src/comp/middle/freevars.rs

Lines changed: 21 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
// A pass that annotates for each loops and functions with the free
22
// variables that they contain.
33

4+
import syntax::print::pprust::path_to_str;
45
import int;
56
import std::map::*;
67
import option::*;
@@ -47,21 +48,27 @@ fn collect_freevars(def_map: resolve::def_map, blk: ast::blk)
4748
visit::visit_expr(expr, depth + 1, v);
4849
}
4950
ast::expr_path(path) {
50-
let def = def_map.get(expr.id), i = 0;
51-
while i < depth {
52-
alt copy def {
53-
ast::def_upvar(_, inner, _) { def = *inner; }
54-
_ { break; }
51+
let i = 0;
52+
alt def_map.find(expr.id) {
53+
none. { fail ("Not found: " + path_to_str(path)) }
54+
some(df) {
55+
let def = df;
56+
while i < depth {
57+
alt copy def {
58+
ast::def_upvar(_, inner, _) { def = *inner; }
59+
_ { break; }
60+
}
61+
i += 1;
62+
}
63+
if i == depth { // Made it to end of loop
64+
let dnum = ast_util::def_id_of_def(def).node;
65+
if !seen.contains_key(dnum) {
66+
*refs += [@{def:def, span:expr.span}];
67+
seen.insert(dnum, ());
68+
}
69+
}
5570
}
56-
i += 1;
57-
}
58-
if i == depth { // Made it to end of loop
59-
let dnum = ast_util::def_id_of_def(def).node;
60-
if !seen.contains_key(dnum) {
61-
*refs += [@{def:def, span:expr.span}];
62-
seen.insert(dnum, ());
63-
}
64-
}
71+
}
6572
}
6673
_ { visit::visit_expr(expr, depth, v); }
6774
}

0 commit comments

Comments
 (0)