Skip to content

Commit c74d2d7

Browse files
committed
---
yaml --- r: 4083 b: refs/heads/master c: f2f8943 h: refs/heads/master i: 4081: f9481d8 4079: 0c2bb89 v: v3
1 parent 6071c78 commit c74d2d7

File tree

3 files changed

+24
-5
lines changed

3 files changed

+24
-5
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: e18d70fe12dcaa84e073f94922f625f3cebeea39
2+
refs/heads/master: f2f8943a8501e90c003ca4bddcb9f95cdb4f5dc7

trunk/src/comp/middle/freevars.rs

Lines changed: 17 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -18,8 +18,8 @@ export freevar_set;
1818
export freevar_map;
1919
export get_freevars;
2020
export has_freevars;
21-
export is_freevarof;
22-
21+
export is_freevar_of;
22+
export def_lookup;
2323

2424
type freevar_set = @ast::node_id[];
2525
type freevar_map = hashmap[ast::node_id, freevar_set];
@@ -138,10 +138,10 @@ fn annotate_freevars(&session::session sess, &resolve::def_map def_map,
138138

139139
fn get_freevars(&ty::ctxt tcx, ast::node_id fid) -> freevar_set {
140140
alt (tcx.freevars.find(fid)) {
141-
case (none) {
141+
none {
142142
fail "get_freevars: " + int::str(fid) + " has no freevars";
143143
}
144-
case (some(?d)) { ret d; }
144+
some(?d) { ret d; }
145145
}
146146
}
147147
fn has_freevars(&ty::ctxt tcx, ast::node_id fid) -> bool {
@@ -150,6 +150,19 @@ fn has_freevars(&ty::ctxt tcx, ast::node_id fid) -> bool {
150150
fn is_freevar_of(&ty::ctxt tcx, ast::node_id var, ast::node_id f) -> bool {
151151
ret ivec::member(var, *get_freevars(tcx, f));
152152
}
153+
fn def_lookup(&ty::ctxt tcx, ast::node_id f, ast::node_id id) ->
154+
option::t[ast::def] {
155+
alt (tcx.def_map.find(id)) {
156+
none { ret none; }
157+
some(?d) {
158+
auto did = ast::def_id_of_def(d);
159+
if is_freevar_of(tcx, did._1, f) {
160+
ret some(ast::def_upvar(did, @d));
161+
} else { ret some(d); }
162+
}
163+
}
164+
}
165+
153166

154167
// Local Variables:
155168
// mode: rust

trunk/src/comp/syntax/ast.rs

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,11 @@ tag def {
5252
def_use(def_id);
5353
def_native_ty(def_id);
5454
def_native_fn(def_id);
55+
56+
/* A "fake" def for upvars. This never appears in the def_map, but
57+
* freevars::def_lookup will return it for a def that is an upvar.
58+
* It contains the actual def. */
59+
def_upvar(def_id, @def);
5560
}
5661

5762
fn variant_def_ids(&def d) -> tup(def_id, def_id) {
@@ -76,6 +81,7 @@ fn def_id_of_def(def d) -> def_id {
7681
case (def_use(?id)) { ret id; }
7782
case (def_native_ty(?id)) { ret id; }
7883
case (def_native_fn(?id)) { ret id; }
84+
case (def_upvar(?id, _)) { ret id; }
7985
}
8086
fail;
8187
}

0 commit comments

Comments
 (0)