Skip to content

Commit 71df8e6

Browse files
committed
librustc: Encode upvar_borrow_map in metadata.
1 parent 5dca9fb commit 71df8e6

File tree

4 files changed

+49
-9
lines changed

4 files changed

+49
-9
lines changed

src/librustc/metadata/common.rs

+2-1
Original file line numberDiff line numberDiff line change
@@ -140,9 +140,10 @@ pub enum astencode_tag { // Reserves 0x40 -- 0x5f
140140
tag_table_moves_map = 0x52,
141141
tag_table_capture_map = 0x53,
142142
tag_table_unboxed_closure_type = 0x54,
143+
tag_table_upvar_borrow_map = 0x55,
143144
}
144145
static first_astencode_tag: uint = tag_ast as uint;
145-
static last_astencode_tag: uint = tag_table_unboxed_closure_type as uint;
146+
static last_astencode_tag: uint = tag_table_upvar_borrow_map as uint;
146147
impl astencode_tag {
147148
pub fn from_uint(value : uint) -> Option<astencode_tag> {
148149
let is_a_tag = first_astencode_tag <= value && value <= last_astencode_tag;

src/librustc/middle/astencode.rs

+42-1
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ use driver::session::Session;
1818
use metadata::decoder;
1919
use middle::def;
2020
use e = metadata::encoder;
21+
use middle::freevars;
2122
use middle::freevars::freevar_entry;
2223
use middle::region;
2324
use metadata::tydecode;
@@ -551,6 +552,15 @@ impl tr for freevar_entry {
551552
}
552553
}
553554

555+
impl tr for ty::UpvarBorrow {
556+
fn tr(&self, xcx: &ExtendedDecodeContext) -> ty::UpvarBorrow {
557+
ty::UpvarBorrow {
558+
kind: self.kind,
559+
region: self.region.tr(xcx)
560+
}
561+
}
562+
}
563+
554564
// ______________________________________________________________________
555565
// Encoding and decoding of MethodCallee
556566

@@ -1061,7 +1071,29 @@ fn encode_side_tables_for_id(ecx: &e::EncodeContext,
10611071
Ok(encode_freevar_entry(rbml_w, fv_entry))
10621072
});
10631073
})
1064-
})
1074+
});
1075+
1076+
for freevar in fv.iter() {
1077+
match freevars::get_capture_mode(tcx, id) {
1078+
freevars::CaptureByRef => {
1079+
rbml_w.tag(c::tag_table_upvar_borrow_map, |rbml_w| {
1080+
rbml_w.id(id);
1081+
rbml_w.tag(c::tag_table_val, |rbml_w| {
1082+
let var_id = freevar.def.def_id().node;
1083+
let upvar_id = ty::UpvarId {
1084+
var_id: var_id,
1085+
closure_expr_id: id
1086+
};
1087+
let upvar_borrow = tcx.upvar_borrow_map.borrow()
1088+
.get_copy(&upvar_id);
1089+
var_id.encode(rbml_w);
1090+
upvar_borrow.encode(rbml_w);
1091+
})
1092+
})
1093+
}
1094+
_ => {}
1095+
}
1096+
}
10651097
}
10661098

10671099
let lid = ast::DefId { krate: ast::LOCAL_CRATE, node: id };
@@ -1468,6 +1500,15 @@ fn decode_side_tables(xcx: &ExtendedDecodeContext,
14681500
}).unwrap().move_iter().collect();
14691501
dcx.tcx.freevars.borrow_mut().insert(id, fv_info);
14701502
}
1503+
c::tag_table_upvar_borrow_map => {
1504+
let var_id: ast::NodeId = Decodable::decode(val_dsr).unwrap();
1505+
let upvar_id = ty::UpvarId {
1506+
var_id: xcx.tr_id(var_id),
1507+
closure_expr_id: id
1508+
};
1509+
let ub: ty::UpvarBorrow = Decodable::decode(val_dsr).unwrap();
1510+
dcx.tcx.upvar_borrow_map.borrow_mut().insert(upvar_id, ub.tr(xcx));
1511+
}
14711512
c::tag_table_tcache => {
14721513
let pty = val_dsr.read_polytype(xcx);
14731514
let lid = ast::DefId { krate: ast::LOCAL_CRATE, node: id };

src/librustc/middle/freevars.rs

+3-5
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414
#![allow(non_camel_case_types)]
1515

1616
use middle::def;
17+
use middle::mem_categorization::Typer;
1718
use middle::resolve;
1819
use middle::ty;
1920
use util::nodemap::{DefIdSet, NodeMap, NodeSet};
@@ -147,11 +148,8 @@ pub fn with_freevars<T>(tcx: &ty::ctxt, fid: ast::NodeId, f: |&[freevar_entry]|
147148
}
148149
}
149150

150-
pub fn get_capture_mode(tcx: &ty::ctxt,
151-
closure_expr_id: ast::NodeId)
152-
-> CaptureMode
153-
{
154-
let fn_ty = ty::node_id_to_type(tcx, closure_expr_id);
151+
pub fn get_capture_mode<T: Typer>(tcx: &T, closure_expr_id: ast::NodeId) -> CaptureMode {
152+
let fn_ty = tcx.node_ty(closure_expr_id).ok().expect("couldn't find closure ty?");
155153
match ty::ty_closure_store(fn_ty) {
156154
ty::RegionTraitStore(..) => CaptureByRef,
157155
ty::UniqTraitStore => CaptureByValue

src/librustc/middle/ty.rs

+2-2
Original file line numberDiff line numberDiff line change
@@ -539,7 +539,7 @@ pub struct UpvarId {
539539
pub closure_expr_id: ast::NodeId,
540540
}
541541

542-
#[deriving(Clone, PartialEq, Eq, Hash, Show)]
542+
#[deriving(Clone, PartialEq, Eq, Hash, Show, Encodable, Decodable)]
543543
pub enum BorrowKind {
544544
/// Data must be immutable and is aliasable.
545545
ImmBorrow,
@@ -634,7 +634,7 @@ pub enum BorrowKind {
634634
* the closure, so sometimes it is necessary for them to be larger
635635
* than the closure lifetime itself.
636636
*/
637-
#[deriving(PartialEq, Clone)]
637+
#[deriving(PartialEq, Clone, Encodable, Decodable)]
638638
pub struct UpvarBorrow {
639639
pub kind: BorrowKind,
640640
pub region: ty::Region,

0 commit comments

Comments
 (0)