mirror of
https://github.com/rust-lang/rust.git
synced 2026-05-22 02:00:00 +03:00
Add a "fake" def_upvar and mechanisms to create it.
This commit is contained in:
@@ -18,8 +18,8 @@
|
||||
export freevar_map;
|
||||
export get_freevars;
|
||||
export has_freevars;
|
||||
export is_freevarof;
|
||||
|
||||
export is_freevar_of;
|
||||
export def_lookup;
|
||||
|
||||
type freevar_set = @ast::node_id[];
|
||||
type freevar_map = hashmap[ast::node_id, freevar_set];
|
||||
@@ -138,10 +138,10 @@ fn walk_expr(env e, &@ast::expr expr) {
|
||||
|
||||
fn get_freevars(&ty::ctxt tcx, ast::node_id fid) -> freevar_set {
|
||||
alt (tcx.freevars.find(fid)) {
|
||||
case (none) {
|
||||
none {
|
||||
fail "get_freevars: " + int::str(fid) + " has no freevars";
|
||||
}
|
||||
case (some(?d)) { ret d; }
|
||||
some(?d) { ret d; }
|
||||
}
|
||||
}
|
||||
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 {
|
||||
fn is_freevar_of(&ty::ctxt tcx, ast::node_id var, ast::node_id f) -> bool {
|
||||
ret ivec::member(var, *get_freevars(tcx, f));
|
||||
}
|
||||
fn def_lookup(&ty::ctxt tcx, ast::node_id f, ast::node_id id) ->
|
||||
option::t[ast::def] {
|
||||
alt (tcx.def_map.find(id)) {
|
||||
none { ret none; }
|
||||
some(?d) {
|
||||
auto did = ast::def_id_of_def(d);
|
||||
if is_freevar_of(tcx, did._1, f) {
|
||||
ret some(ast::def_upvar(did, @d));
|
||||
} else { ret some(d); }
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// Local Variables:
|
||||
// mode: rust
|
||||
|
||||
@@ -52,6 +52,11 @@ fn local_def(node_id id) -> def_id {
|
||||
def_use(def_id);
|
||||
def_native_ty(def_id);
|
||||
def_native_fn(def_id);
|
||||
|
||||
/* A "fake" def for upvars. This never appears in the def_map, but
|
||||
* freevars::def_lookup will return it for a def that is an upvar.
|
||||
* It contains the actual def. */
|
||||
def_upvar(def_id, @def);
|
||||
}
|
||||
|
||||
fn variant_def_ids(&def d) -> tup(def_id, def_id) {
|
||||
@@ -76,6 +81,7 @@ fn def_id_of_def(def d) -> def_id {
|
||||
case (def_use(?id)) { ret id; }
|
||||
case (def_native_ty(?id)) { ret id; }
|
||||
case (def_native_fn(?id)) { ret id; }
|
||||
case (def_upvar(?id, _)) { ret id; }
|
||||
}
|
||||
fail;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user