Skip to content

Commit ed593be

Browse files
committed
rustc_metadata: go back to not using the opaque format.
1 parent 903ec52 commit ed593be

File tree

6 files changed

+165
-203
lines changed

6 files changed

+165
-203
lines changed

src/librustc_metadata/astencode.rs

Lines changed: 101 additions & 121 deletions
Original file line numberDiff line numberDiff line change
@@ -14,9 +14,7 @@ use rustc::hir::map as ast_map;
1414

1515
use rustc::hir::intravisit::{Visitor, IdRangeComputingVisitor, IdRange};
1616

17-
use common as c;
18-
use cstore;
19-
17+
use cstore::CrateMetadata;
2018
use decoder::DecodeContext;
2119
use encoder::EncodeContext;
2220

@@ -28,60 +26,53 @@ use rustc::ty::{self, TyCtxt};
2826

2927
use syntax::ast;
3028

31-
use rbml::reader;
3229
use rbml;
3330
use rustc_serialize::{Decodable, Encodable};
3431

3532
// ______________________________________________________________________
3633
// Top-level methods.
3734

3835
pub fn encode_inlined_item(ecx: &mut EncodeContext, ii: InlinedItemRef) {
39-
ecx.tag(c::tag_ast, |ecx| {
40-
ecx.tag(c::tag_id_range, |ecx| {
41-
let mut visitor = IdRangeComputingVisitor::new();
42-
match ii {
43-
InlinedItemRef::Item(_, i) => visitor.visit_item(i),
44-
InlinedItemRef::TraitItem(_, ti) => visitor.visit_trait_item(ti),
45-
InlinedItemRef::ImplItem(_, ii) => visitor.visit_impl_item(ii)
46-
}
47-
visitor.result().encode(&mut ecx.opaque()).unwrap()
48-
});
36+
ecx.tag(::common::tag_ast, |ecx| {
37+
let mut visitor = IdRangeComputingVisitor::new();
38+
match ii {
39+
InlinedItemRef::Item(_, i) => visitor.visit_item(i),
40+
InlinedItemRef::TraitItem(_, ti) => visitor.visit_trait_item(ti),
41+
InlinedItemRef::ImplItem(_, ii) => visitor.visit_impl_item(ii)
42+
}
43+
visitor.result().encode(ecx).unwrap();
4944

50-
ecx.tag(c::tag_tree, |ecx| ii.encode(ecx).unwrap());
45+
ii.encode(ecx).unwrap();
5146

52-
ecx.tag(c::tag_table, |ecx| {
53-
let mut visitor = SideTableEncodingIdVisitor {
54-
ecx: ecx
55-
};
56-
match ii {
57-
InlinedItemRef::Item(_, i) => visitor.visit_item(i),
58-
InlinedItemRef::TraitItem(_, ti) => visitor.visit_trait_item(ti),
59-
InlinedItemRef::ImplItem(_, ii) => visitor.visit_impl_item(ii)
60-
}
61-
});
47+
let mut visitor = SideTableEncodingIdVisitor {
48+
ecx: ecx
49+
};
50+
match ii {
51+
InlinedItemRef::Item(_, i) => visitor.visit_item(i),
52+
InlinedItemRef::TraitItem(_, ti) => visitor.visit_trait_item(ti),
53+
InlinedItemRef::ImplItem(_, ii) => visitor.visit_impl_item(ii)
54+
}
6255
});
6356
}
6457

6558
/// Decodes an item from its AST in the cdata's metadata and adds it to the
6659
/// ast-map.
67-
pub fn decode_inlined_item<'a, 'tcx>(cdata: &cstore::CrateMetadata,
60+
pub fn decode_inlined_item<'a, 'tcx>(cdata: &CrateMetadata,
6861
tcx: TyCtxt<'a, 'tcx, 'tcx>,
6962
parent_def_path: ast_map::DefPath,
7063
parent_did: DefId,
7164
ast_doc: rbml::Doc,
7265
orig_did: DefId)
7366
-> &'tcx InlinedItem {
7467
debug!("> Decoding inlined fn: {:?}", tcx.item_path_str(orig_did));
75-
let from_id_range = {
76-
let decoder = &mut ast_doc.get(c::tag_id_range).opaque();
77-
IdRange {
78-
min: ast::NodeId::from_u32(u32::decode(decoder).unwrap()),
79-
max: ast::NodeId::from_u32(u32::decode(decoder).unwrap())
80-
}
81-
};
82-
let mut dcx = DecodeContext::new(tcx, cdata, from_id_range,
83-
ast_doc.get(c::tag_tree));
84-
let ii = InlinedItem::decode(&mut dcx).unwrap();
68+
let dcx = &mut ast_doc.decoder();
69+
dcx.tcx = Some(tcx);
70+
dcx.cdata = Some(cdata);
71+
dcx.from_id_range = IdRange::decode(dcx).unwrap();
72+
let cnt = dcx.from_id_range.max.as_usize() - dcx.from_id_range.min.as_usize();
73+
dcx.to_id_range.min = tcx.sess.reserve_node_ids(cnt);
74+
dcx.to_id_range.max = ast::NodeId::new(dcx.to_id_range.min.as_usize() + cnt);
75+
let ii = InlinedItem::decode(dcx).unwrap();
8576

8677
let ii = ast_map::map_decoded_item(&tcx.map,
8778
parent_def_path,
@@ -97,7 +88,7 @@ pub fn decode_inlined_item<'a, 'tcx>(cdata: &cstore::CrateMetadata,
9788
let inlined_did = tcx.map.local_def_id(item_node_id);
9889
tcx.register_item_type(inlined_did, tcx.lookup_item_type(orig_did));
9990

100-
decode_side_tables(&mut dcx, ast_doc);
91+
decode_side_tables(dcx, ast_doc);
10192

10293
ii
10394
}
@@ -116,7 +107,8 @@ impl<'a, 'tcx> EncodeContext<'a, 'tcx> {
116107
self.end_tag().unwrap();
117108
}
118109

119-
fn id(&mut self, id: ast::NodeId) {
110+
fn entry(&mut self, table: Table, id: ast::NodeId) {
111+
table.encode(self).unwrap();
120112
id.encode(self).unwrap();
121113
}
122114
}
@@ -131,67 +123,67 @@ impl<'a, 'b, 'tcx, 'v> Visitor<'v> for SideTableEncodingIdVisitor<'a, 'b, 'tcx>
131123
}
132124
}
133125

126+
#[derive(RustcEncodable, RustcDecodable, Debug)]
127+
enum Table {
128+
Def,
129+
NodeType,
130+
ItemSubsts,
131+
Freevars,
132+
MethodMap,
133+
Adjustment,
134+
UpvarCaptureMap,
135+
ConstQualif,
136+
CastKind
137+
}
138+
134139
fn encode_side_tables_for_id(ecx: &mut EncodeContext, id: ast::NodeId) {
135140
let tcx = ecx.tcx;
136141

137142
debug!("Encoding side tables for id {}", id);
138143

139144
if let Some(def) = tcx.expect_def_or_none(id) {
140-
ecx.tag(c::tag_table_def, |ecx| {
141-
ecx.id(id);
142-
def.encode(ecx).unwrap();
143-
})
145+
ecx.entry(Table::Def, id);
146+
def.encode(ecx).unwrap();
144147
}
145148

146149
if let Some(ty) = tcx.node_types().get(&id) {
147-
ecx.tag(c::tag_table_node_type, |ecx| {
148-
ecx.id(id);
149-
ty.encode(ecx).unwrap();
150-
})
150+
ecx.entry(Table::NodeType, id);
151+
ty.encode(ecx).unwrap();
151152
}
152153

153154
if let Some(item_substs) = tcx.tables.borrow().item_substs.get(&id) {
154-
ecx.tag(c::tag_table_item_subst, |ecx| {
155-
ecx.id(id);
156-
item_substs.substs.encode(ecx).unwrap();
157-
})
155+
ecx.entry(Table::ItemSubsts, id);
156+
item_substs.substs.encode(ecx).unwrap();
158157
}
159158

160159
if let Some(fv) = tcx.freevars.borrow().get(&id) {
161-
ecx.tag(c::tag_table_freevars, |ecx| {
162-
ecx.id(id);
163-
fv.encode(ecx).unwrap();
164-
});
160+
ecx.entry(Table::Freevars, id);
161+
fv.encode(ecx).unwrap();
165162

166163
for freevar in fv {
167-
ecx.tag(c::tag_table_upvar_capture_map, |ecx| {
168-
ecx.id(id);
169-
170-
let def_id = freevar.def.def_id();
171-
let var_id = tcx.map.as_local_node_id(def_id).unwrap();
172-
let upvar_id = ty::UpvarId {
173-
var_id: var_id,
174-
closure_expr_id: id
175-
};
176-
let upvar_capture = tcx.tables
177-
.borrow()
178-
.upvar_capture_map
179-
.get(&upvar_id)
180-
.unwrap()
181-
.clone();
182-
var_id.encode(ecx).unwrap();
183-
upvar_capture.encode(ecx).unwrap();
184-
})
164+
ecx.entry(Table::UpvarCaptureMap, id);
165+
let def_id = freevar.def.def_id();
166+
let var_id = tcx.map.as_local_node_id(def_id).unwrap();
167+
let upvar_id = ty::UpvarId {
168+
var_id: var_id,
169+
closure_expr_id: id
170+
};
171+
let upvar_capture = tcx.tables
172+
.borrow()
173+
.upvar_capture_map
174+
.get(&upvar_id)
175+
.unwrap()
176+
.clone();
177+
var_id.encode(ecx).unwrap();
178+
upvar_capture.encode(ecx).unwrap();
185179
}
186180
}
187181

188182
let method_call = ty::MethodCall::expr(id);
189183
if let Some(method) = tcx.tables.borrow().method_map.get(&method_call) {
190-
ecx.tag(c::tag_table_method_map, |ecx| {
191-
ecx.id(id);
192-
method_call.autoderef.encode(ecx).unwrap();
193-
method.encode(ecx).unwrap();
194-
})
184+
ecx.entry(Table::MethodMap, id);
185+
method_call.autoderef.encode(ecx).unwrap();
186+
method.encode(ecx).unwrap();
195187
}
196188

197189
if let Some(adjustment) = tcx.tables.borrow().adjustments.get(&id) {
@@ -200,91 +192,79 @@ fn encode_side_tables_for_id(ecx: &mut EncodeContext, id: ast::NodeId) {
200192
for autoderef in 0..adj.autoderefs {
201193
let method_call = ty::MethodCall::autoderef(id, autoderef as u32);
202194
if let Some(method) = tcx.tables.borrow().method_map.get(&method_call) {
203-
ecx.tag(c::tag_table_method_map, |ecx| {
204-
ecx.id(id);
205-
method_call.autoderef.encode(ecx).unwrap();
206-
method.encode(ecx).unwrap();
207-
})
195+
ecx.entry(Table::MethodMap, id);
196+
method_call.autoderef.encode(ecx).unwrap();
197+
method.encode(ecx).unwrap();
208198
}
209199
}
210200
}
211201
_ => {}
212202
}
213203

214-
ecx.tag(c::tag_table_adjustments, |ecx| {
215-
ecx.id(id);
216-
adjustment.encode(ecx).unwrap();
217-
})
204+
ecx.entry(Table::Adjustment, id);
205+
adjustment.encode(ecx).unwrap();
218206
}
219207

220208
if let Some(cast_kind) = tcx.cast_kinds.borrow().get(&id) {
221-
ecx.tag(c::tag_table_cast_kinds, |ecx| {
222-
ecx.id(id);
223-
cast_kind.encode(ecx).unwrap()
224-
})
209+
ecx.entry(Table::CastKind, id);
210+
cast_kind.encode(ecx).unwrap();
225211
}
226212

227213
if let Some(qualif) = tcx.const_qualif_map.borrow().get(&id) {
228-
ecx.tag(c::tag_table_const_qualif, |ecx| {
229-
ecx.id(id);
230-
qualif.encode(ecx).unwrap()
231-
})
214+
ecx.entry(Table::ConstQualif, id);
215+
qualif.encode(ecx).unwrap();
232216
}
233217
}
234218

235-
fn decode_side_tables<'a, 'tcx>(dcx: &mut DecodeContext<'a, 'tcx>,
236-
ast_doc: rbml::Doc<'a>) {
237-
for (tag, entry_doc) in reader::docs(ast_doc.get(c::tag_table)) {
238-
dcx.rbml_r = reader::Decoder::new(entry_doc);
219+
fn decode_side_tables(dcx: &mut DecodeContext, ast_doc: rbml::Doc) {
220+
while dcx.position() < ast_doc.end {
221+
let table = Decodable::decode(dcx).unwrap();
239222
let id = Decodable::decode(dcx).unwrap();
240-
debug!("decode_side_tables: entry for id={}, tag=0x{:x}", id, tag);
241-
match tag {
242-
c::tag_table_def => {
223+
debug!("decode_side_tables: entry for id={}, table={:?}", id, table);
224+
match table {
225+
Table::Def => {
243226
let def = Decodable::decode(dcx).unwrap();
244-
dcx.tcx.def_map.borrow_mut().insert(id, def::PathResolution::new(def));
227+
dcx.tcx().def_map.borrow_mut().insert(id, def::PathResolution::new(def));
245228
}
246-
c::tag_table_node_type => {
229+
Table::NodeType => {
247230
let ty = Decodable::decode(dcx).unwrap();
248-
dcx.tcx.node_type_insert(id, ty);
231+
dcx.tcx().node_type_insert(id, ty);
249232
}
250-
c::tag_table_item_subst => {
233+
Table::ItemSubsts => {
251234
let item_substs = Decodable::decode(dcx).unwrap();
252-
dcx.tcx.tables.borrow_mut().item_substs.insert(id, item_substs);
235+
dcx.tcx().tables.borrow_mut().item_substs.insert(id, item_substs);
253236
}
254-
c::tag_table_freevars => {
237+
Table::Freevars => {
255238
let fv_info = Decodable::decode(dcx).unwrap();
256-
dcx.tcx.freevars.borrow_mut().insert(id, fv_info);
239+
dcx.tcx().freevars.borrow_mut().insert(id, fv_info);
257240
}
258-
c::tag_table_upvar_capture_map => {
241+
Table::UpvarCaptureMap => {
259242
let upvar_id = ty::UpvarId {
260243
var_id: Decodable::decode(dcx).unwrap(),
261244
closure_expr_id: id
262245
};
263246
let ub = Decodable::decode(dcx).unwrap();
264-
dcx.tcx.tables.borrow_mut().upvar_capture_map.insert(upvar_id, ub);
247+
dcx.tcx().tables.borrow_mut().upvar_capture_map.insert(upvar_id, ub);
265248
}
266-
c::tag_table_method_map => {
249+
Table::MethodMap => {
267250
let method_call = ty::MethodCall {
268251
expr_id: id,
269252
autoderef: Decodable::decode(dcx).unwrap()
270253
};
271254
let method = Decodable::decode(dcx).unwrap();
272-
dcx.tcx.tables.borrow_mut().method_map.insert(method_call, method);
255+
dcx.tcx().tables.borrow_mut().method_map.insert(method_call, method);
273256
}
274-
c::tag_table_adjustments => {
257+
Table::Adjustment => {
275258
let adj = Decodable::decode(dcx).unwrap();
276-
dcx.tcx.tables.borrow_mut().adjustments.insert(id, adj);
259+
dcx.tcx().tables.borrow_mut().adjustments.insert(id, adj);
277260
}
278-
c::tag_table_cast_kinds => {
261+
Table::CastKind => {
279262
let cast_kind = Decodable::decode(dcx).unwrap();
280-
dcx.tcx.cast_kinds.borrow_mut().insert(id, cast_kind);
263+
dcx.tcx().cast_kinds.borrow_mut().insert(id, cast_kind);
281264
}
282-
c::tag_table_const_qualif => {
265+
Table::ConstQualif => {
283266
let qualif = Decodable::decode(dcx).unwrap();
284-
dcx.tcx.const_qualif_map.borrow_mut().insert(id, qualif);
285-
}
286-
_ => {
287-
bug!("unknown tag found in side tables: 0x{:x}", tag);
267+
dcx.tcx().const_qualif_map.borrow_mut().insert(id, qualif);
288268
}
289269
}
290270
}

src/librustc_metadata/common.rs

Lines changed: 2 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -97,28 +97,11 @@ pub const tag_items_data_item_reexport_name: usize = 0x48;
9797
// used to encode crate_ctxt side tables
9898
pub const tag_ast: usize = 0x50;
9999

100-
pub const tag_tree: usize = 0x51;
100+
// GAP 0x51
101101

102102
pub const tag_mir: usize = 0x52;
103103

104-
pub const tag_table: usize = 0x53;
105-
106-
pub const tag_id_range: usize = 0x54;
107-
108-
// GAP 0x55
109-
pub const tag_table_def: usize = 0x56;
110-
pub const tag_table_node_type: usize = 0x57;
111-
pub const tag_table_item_subst: usize = 0x58;
112-
pub const tag_table_freevars: usize = 0x59;
113-
// GAP 0x5a, 0x5b, 0x5c, 0x5d, 0x5e
114-
pub const tag_table_method_map: usize = 0x5f;
115-
// GAP 0x60
116-
pub const tag_table_adjustments: usize = 0x61;
117-
// GAP 0x62, 0x63, 0x64, 0x65
118-
pub const tag_table_upvar_capture_map: usize = 0x66;
119-
// GAP 0x67, 0x68
120-
pub const tag_table_const_qualif: usize = 0x69;
121-
pub const tag_table_cast_kinds: usize = 0x6a;
104+
// GAP 0x53...0x6a
122105

123106
pub const tag_item_trait_item_sort: usize = 0x70;
124107

0 commit comments

Comments
 (0)