Skip to content

Commit 2f29cde

Browse files
committed
Remove the capture mode map and just store the capture mode for individual variables.
Also add test. Fixes #16749.
1 parent e0f5980 commit 2f29cde

File tree

19 files changed

+418
-439
lines changed

19 files changed

+418
-439
lines changed

src/librustc/metadata/common.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -140,7 +140,7 @@ pub enum astencode_tag { // Reserves 0x40 -- 0x5f
140140
tag_table_moves_map = 0x52,
141141
tag_table_capture_map = 0x53,
142142
tag_table_closures = 0x54,
143-
tag_table_upvar_borrow_map = 0x55,
143+
tag_table_upvar_capture_map = 0x55,
144144
tag_table_capture_modes = 0x56,
145145
tag_table_object_cast_map = 0x57,
146146
}

src/librustc/middle/astencode.rs

+25-41
Original file line numberDiff line numberDiff line change
@@ -518,10 +518,6 @@ fn encode_freevar_entry(rbml_w: &mut Encoder, fv: &ty::Freevar) {
518518
(*fv).encode(rbml_w).unwrap();
519519
}
520520

521-
fn encode_capture_mode(rbml_w: &mut Encoder, cm: ast::CaptureClause) {
522-
cm.encode(rbml_w).unwrap();
523-
}
524-
525521
trait rbml_decoder_helper {
526522
fn read_freevar_entry(&mut self, dcx: &DecodeContext)
527523
-> ty::Freevar;
@@ -559,6 +555,15 @@ impl tr for ty::UpvarBorrow {
559555
}
560556
}
561557

558+
impl tr for ty::UpvarCapture {
559+
fn tr(&self, dcx: &DecodeContext) -> ty::UpvarCapture {
560+
match *self {
561+
ty::UpvarCapture::ByValue => ty::UpvarCapture::ByValue,
562+
ty::UpvarCapture::ByRef(ref data) => ty::UpvarCapture::ByRef(data.tr(dcx)),
563+
}
564+
}
565+
}
566+
562567
// ______________________________________________________________________
563568
// Encoding and decoding of MethodCallee
564569

@@ -1210,34 +1215,20 @@ fn encode_side_tables_for_id(ecx: &e::EncodeContext,
12101215
});
12111216

12121217
for freevar in fv.iter() {
1213-
match tcx.capture_mode(id) {
1214-
ast::CaptureByRef => {
1215-
rbml_w.tag(c::tag_table_upvar_borrow_map, |rbml_w| {
1216-
rbml_w.id(id);
1217-
rbml_w.tag(c::tag_table_val, |rbml_w| {
1218-
let var_id = freevar.def.def_id().node;
1219-
let upvar_id = ty::UpvarId {
1220-
var_id: var_id,
1221-
closure_expr_id: id
1222-
};
1223-
let upvar_borrow = tcx.upvar_borrow_map.borrow()[upvar_id].clone();
1224-
var_id.encode(rbml_w);
1225-
upvar_borrow.encode(rbml_w);
1226-
})
1227-
})
1228-
}
1229-
_ => {}
1230-
}
1231-
}
1232-
}
1233-
1234-
for &cm in tcx.capture_modes.borrow().get(&id).iter() {
1235-
rbml_w.tag(c::tag_table_capture_modes, |rbml_w| {
1236-
rbml_w.id(id);
1237-
rbml_w.tag(c::tag_table_val, |rbml_w| {
1238-
encode_capture_mode(rbml_w, *cm);
1218+
rbml_w.tag(c::tag_table_upvar_capture_map, |rbml_w| {
1219+
rbml_w.id(id);
1220+
rbml_w.tag(c::tag_table_val, |rbml_w| {
1221+
let var_id = freevar.def.def_id().node;
1222+
let upvar_id = ty::UpvarId {
1223+
var_id: var_id,
1224+
closure_expr_id: id
1225+
};
1226+
let upvar_capture = tcx.upvar_capture_map.borrow()[upvar_id].clone();
1227+
var_id.encode(rbml_w);
1228+
upvar_capture.encode(rbml_w);
1229+
})
12391230
})
1240-
})
1231+
}
12411232
}
12421233

12431234
let lid = ast::DefId { krate: ast::LOCAL_CRATE, node: id };
@@ -1911,21 +1902,14 @@ fn decode_side_tables(dcx: &DecodeContext,
19111902
}).unwrap().into_iter().collect();
19121903
dcx.tcx.freevars.borrow_mut().insert(id, fv_info);
19131904
}
1914-
c::tag_table_upvar_borrow_map => {
1905+
c::tag_table_upvar_capture_map => {
19151906
let var_id: ast::NodeId = Decodable::decode(val_dsr).unwrap();
19161907
let upvar_id = ty::UpvarId {
19171908
var_id: dcx.tr_id(var_id),
19181909
closure_expr_id: id
19191910
};
1920-
let ub: ty::UpvarBorrow = Decodable::decode(val_dsr).unwrap();
1921-
dcx.tcx.upvar_borrow_map.borrow_mut().insert(upvar_id, ub.tr(dcx));
1922-
}
1923-
c::tag_table_capture_modes => {
1924-
let capture_mode = val_dsr.read_capture_mode();
1925-
dcx.tcx
1926-
.capture_modes
1927-
.borrow_mut()
1928-
.insert(id, capture_mode);
1911+
let ub: ty::UpvarCapture = Decodable::decode(val_dsr).unwrap();
1912+
dcx.tcx.upvar_capture_map.borrow_mut().insert(upvar_id, ub.tr(dcx));
19291913
}
19301914
c::tag_table_tcache => {
19311915
let type_scheme = val_dsr.read_type_scheme(dcx);

src/librustc/middle/expr_use_visitor.rs

+21-42
Original file line numberDiff line numberDiff line change
@@ -1208,53 +1208,32 @@ impl<'d,'t,'tcx,TYPER:mc::Typer<'tcx>> ExprUseVisitor<'d,'t,'tcx,TYPER> {
12081208
debug!("walk_captures({})", closure_expr.repr(self.tcx()));
12091209

12101210
ty::with_freevars(self.tcx(), closure_expr.id, |freevars| {
1211-
match self.tcx().capture_mode(closure_expr.id) {
1212-
ast::CaptureByRef => {
1213-
self.walk_by_ref_captures(closure_expr, freevars);
1214-
}
1215-
ast::CaptureByValue => {
1216-
self.walk_by_value_captures(closure_expr, freevars);
1211+
for freevar in freevars.iter() {
1212+
let id_var = freevar.def.def_id().node;
1213+
let upvar_id = ty::UpvarId { var_id: id_var,
1214+
closure_expr_id: closure_expr.id };
1215+
let upvar_capture = self.typer.upvar_capture(upvar_id).unwrap();
1216+
let cmt_var = return_if_err!(self.cat_captured_var(closure_expr.id,
1217+
closure_expr.span,
1218+
freevar.def));
1219+
match upvar_capture {
1220+
ty::UpvarCapture::ByValue => {
1221+
let mode = copy_or_move(self.typer, &cmt_var, CaptureMove);
1222+
self.delegate.consume(closure_expr.id, freevar.span, cmt_var, mode);
1223+
}
1224+
ty::UpvarCapture::ByRef(upvar_borrow) => {
1225+
self.delegate.borrow(closure_expr.id,
1226+
closure_expr.span,
1227+
cmt_var,
1228+
upvar_borrow.region,
1229+
upvar_borrow.kind,
1230+
ClosureCapture(freevar.span));
1231+
}
12171232
}
12181233
}
12191234
});
12201235
}
12211236

1222-
fn walk_by_ref_captures(&mut self,
1223-
closure_expr: &ast::Expr,
1224-
freevars: &[ty::Freevar]) {
1225-
for freevar in freevars.iter() {
1226-
let id_var = freevar.def.def_id().node;
1227-
let cmt_var = return_if_err!(self.cat_captured_var(closure_expr.id,
1228-
closure_expr.span,
1229-
freevar.def));
1230-
1231-
// Lookup the kind of borrow the callee requires, as
1232-
// inferred by regionbk
1233-
let upvar_id = ty::UpvarId { var_id: id_var,
1234-
closure_expr_id: closure_expr.id };
1235-
let upvar_borrow = self.typer.upvar_borrow(upvar_id).unwrap();
1236-
1237-
self.delegate.borrow(closure_expr.id,
1238-
closure_expr.span,
1239-
cmt_var,
1240-
upvar_borrow.region,
1241-
upvar_borrow.kind,
1242-
ClosureCapture(freevar.span));
1243-
}
1244-
}
1245-
1246-
fn walk_by_value_captures(&mut self,
1247-
closure_expr: &ast::Expr,
1248-
freevars: &[ty::Freevar]) {
1249-
for freevar in freevars.iter() {
1250-
let cmt_var = return_if_err!(self.cat_captured_var(closure_expr.id,
1251-
closure_expr.span,
1252-
freevar.def));
1253-
let mode = copy_or_move(self.typer, &cmt_var, CaptureMove);
1254-
self.delegate.consume(closure_expr.id, freevar.span, cmt_var, mode);
1255-
}
1256-
}
1257-
12581237
fn cat_captured_var(&mut self,
12591238
closure_id: ast::NodeId,
12601239
closure_span: Span,

0 commit comments

Comments
 (0)