Skip to content

Commit 004d702

Browse files
committed
track, for each upvar, its index in list of upvars
1 parent 9b52c5b commit 004d702

File tree

7 files changed

+23
-23
lines changed

7 files changed

+23
-23
lines changed

src/librustc/middle/astencode.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -470,8 +470,8 @@ impl tr for def::Def {
470470
def::DefPrimTy(p) => def::DefPrimTy(p),
471471
def::DefTyParam(s, index, def_id, n) => def::DefTyParam(s, index, def_id.tr(dcx), n),
472472
def::DefUse(did) => def::DefUse(did.tr(dcx)),
473-
def::DefUpvar(nid1, nid2) => {
474-
def::DefUpvar(dcx.tr_id(nid1), dcx.tr_id(nid2))
473+
def::DefUpvar(nid1, index, nid2) => {
474+
def::DefUpvar(dcx.tr_id(nid1), index, dcx.tr_id(nid2))
475475
}
476476
def::DefStruct(did) => def::DefStruct(did.tr(dcx)),
477477
def::DefRegion(nid) => def::DefRegion(dcx.tr_id(nid)),

src/librustc/middle/def.rs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,7 @@ pub enum Def {
3838
DefTyParam(ParamSpace, u32, DefId, ast::Name),
3939
DefUse(DefId),
4040
DefUpvar(ast::NodeId, // id of closed over local
41+
usize, // index in the freevars list of the closure
4142
ast::NodeId), // expr node that creates the closure
4243

4344
/// Note that if it's a tuple struct's definition, the node id of the DefId
@@ -129,7 +130,7 @@ impl Def {
129130
id
130131
}
131132
DefLocal(id) |
132-
DefUpvar(id, _) |
133+
DefUpvar(id, _, _) |
133134
DefRegion(id) |
134135
DefLabel(id) |
135136
DefSelfTy(_, Some((_, id))) => {

src/librustc/middle/mem_categorization.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -578,7 +578,7 @@ impl<'t, 'a,'tcx> MemCategorizationContext<'t, 'a, 'tcx> {
578578
}))
579579
}
580580

581-
def::DefUpvar(var_id, fn_node_id) => {
581+
def::DefUpvar(var_id, _, fn_node_id) => {
582582
let ty = try!(self.node_ty(fn_node_id));
583583
match ty.sty {
584584
ty::TyClosure(closure_id, _) => {

src/librustc_resolve/lib.rs

Lines changed: 13 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -62,7 +62,7 @@ use rustc::middle::pat_util::pat_bindings;
6262
use rustc::middle::privacy::*;
6363
use rustc::middle::subst::{ParamSpace, FnSpace, TypeSpace};
6464
use rustc::middle::ty::{Freevar, FreevarMap, TraitMap, GlobMap};
65-
use rustc::util::nodemap::{NodeMap, NodeSet, DefIdSet, FnvHashMap};
65+
use rustc::util::nodemap::{NodeMap, DefIdSet, FnvHashMap};
6666
use rustc::util::lev_distance::lev_distance;
6767

6868
use syntax::ast;
@@ -95,7 +95,6 @@ use rustc_front::hir::TypeImplItem;
9595
use rustc_front::util::walk_pat;
9696

9797
use std::collections::{HashMap, HashSet};
98-
use std::collections::hash_map::Entry::{Occupied, Vacant};
9998
use std::cell::{Cell, RefCell};
10099
use std::fmt;
101100
use std::mem::replace;
@@ -1152,7 +1151,7 @@ pub struct Resolver<'a, 'tcx:'a> {
11521151

11531152
def_map: DefMap,
11541153
freevars: RefCell<FreevarMap>,
1155-
freevars_seen: RefCell<NodeMap<NodeSet>>,
1154+
freevars_seen: RefCell<NodeMap<NodeMap<usize>>>,
11561155
export_map: ExportMap,
11571156
trait_map: TraitMap,
11581157
external_exports: ExternalExports,
@@ -1992,21 +1991,21 @@ impl<'a, 'tcx> Resolver<'a, 'tcx> {
19921991
}
19931992
ClosureRibKind(function_id) => {
19941993
let prev_def = def;
1995-
def = DefUpvar(node_id, function_id);
19961994

19971995
let mut seen = self.freevars_seen.borrow_mut();
1998-
let seen = match seen.entry(function_id) {
1999-
Occupied(v) => v.into_mut(),
2000-
Vacant(v) => v.insert(NodeSet()),
2001-
};
2002-
if seen.contains(&node_id) {
1996+
let seen = seen.entry(function_id).or_insert_with(|| NodeMap());
1997+
if let Some(&index) = seen.get(&node_id) {
1998+
def = DefUpvar(node_id, index, function_id);
20031999
continue;
20042000
}
2005-
match self.freevars.borrow_mut().entry(function_id) {
2006-
Occupied(v) => v.into_mut(),
2007-
Vacant(v) => v.insert(vec![]),
2008-
}.push(Freevar { def: prev_def, span: span });
2009-
seen.insert(node_id);
2001+
let mut freevars = self.freevars.borrow_mut();
2002+
let vec = freevars.entry(function_id)
2003+
.or_insert_with(|| vec![]);
2004+
let depth = vec.len();
2005+
vec.push(Freevar { def: prev_def, span: span });
2006+
2007+
def = DefUpvar(node_id, depth, function_id);
2008+
seen.insert(node_id, depth);
20102009
}
20112010
ItemRibKind | MethodRibKind => {
20122011
// This was an attempt to access an upvar inside a

src/librustc_trans/trans/_match.rs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1428,19 +1428,19 @@ pub fn trans_match<'blk, 'tcx>(bcx: Block<'blk, 'tcx>,
14281428
fn is_discr_reassigned(bcx: Block, discr: &hir::Expr, body: &hir::Expr) -> bool {
14291429
let (vid, field) = match discr.node {
14301430
hir::ExprPath(..) => match bcx.def(discr.id) {
1431-
def::DefLocal(vid) | def::DefUpvar(vid, _) => (vid, None),
1431+
def::DefLocal(vid) | def::DefUpvar(vid, _, _) => (vid, None),
14321432
_ => return false
14331433
},
14341434
hir::ExprField(ref base, field) => {
14351435
let vid = match bcx.tcx().def_map.borrow().get(&base.id).map(|d| d.full_def()) {
1436-
Some(def::DefLocal(vid)) | Some(def::DefUpvar(vid, _)) => vid,
1436+
Some(def::DefLocal(vid)) | Some(def::DefUpvar(vid, _, _)) => vid,
14371437
_ => return false
14381438
};
14391439
(vid, Some(mc::NamedField(field.node.name)))
14401440
},
14411441
hir::ExprTupField(ref base, field) => {
14421442
let vid = match bcx.tcx().def_map.borrow().get(&base.id).map(|d| d.full_def()) {
1443-
Some(def::DefLocal(vid)) | Some(def::DefUpvar(vid, _)) => vid,
1443+
Some(def::DefLocal(vid)) | Some(def::DefUpvar(vid, _, _)) => vid,
14441444
_ => return false
14451445
};
14461446
(vid, Some(mc::PositionalField(field.node)))

src/librustc_trans/trans/expr.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1319,7 +1319,7 @@ pub fn trans_local_var<'blk, 'tcx>(bcx: Block<'blk, 'tcx>,
13191319
let _icx = push_ctxt("trans_local_var");
13201320

13211321
match def {
1322-
def::DefUpvar(nid, _) => {
1322+
def::DefUpvar(nid, _, _) => {
13231323
// Can't move upvars, so this is never a ZeroMemLastUse.
13241324
let local_ty = node_id_type(bcx, nid);
13251325
let lval = Lvalue::new_with_hint("expr::trans_local_var (upvar)",

src/librustc_typeck/check/mod.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4318,7 +4318,7 @@ fn type_scheme_and_predicates_for_def<'a, 'tcx>(fcx: &FnCtxt<'a, 'tcx>,
43184318
defn: def::Def)
43194319
-> (TypeScheme<'tcx>, GenericPredicates<'tcx>) {
43204320
match defn {
4321-
def::DefLocal(nid) | def::DefUpvar(nid, _) => {
4321+
def::DefLocal(nid) | def::DefUpvar(nid, _, _) => {
43224322
let typ = fcx.local_ty(sp, nid);
43234323
(ty::TypeScheme { generics: ty::Generics::empty(), ty: typ },
43244324
ty::GenericPredicates::empty())

0 commit comments

Comments
 (0)