Skip to content

Commit 0c877f6

Browse files
committed
---
yaml --- r: 7081 b: refs/heads/master c: da519c8 h: refs/heads/master i: 7079: 87aeb52 v: v3
1 parent 20eb0ca commit 0c877f6

File tree

2 files changed

+22
-15
lines changed

2 files changed

+22
-15
lines changed

[refs]

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,2 @@
11
---
2-
refs/heads/master: 4f3171ea8150953b30b79aed9a3f35f14b40c0ba
2+
refs/heads/master: da519c8587c46ec519fada1aee7cc32ed2c1cd6a

trunk/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)