Skip to content

Commit 97864d4

Browse files
committed
rustc_metadata: encode miscellaneous information opaquely.
1 parent 3cbe4b8 commit 97864d4

File tree

4 files changed

+32
-59
lines changed

4 files changed

+32
-59
lines changed

src/librustc_metadata/decoder.rs

Lines changed: 13 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -553,16 +553,14 @@ pub fn get_type<'a, 'tcx>(cdata: Cmd, id: DefIndex, tcx: TyCtxt<'a, 'tcx, 'tcx>)
553553
pub fn get_stability(cdata: Cmd, id: DefIndex) -> Option<attr::Stability> {
554554
let item = cdata.lookup_item(id);
555555
reader::maybe_get_doc(item, tag_items_data_item_stability).map(|doc| {
556-
let mut decoder = reader::Decoder::new(doc);
557-
Decodable::decode(&mut decoder).unwrap()
556+
Decodable::decode(&mut doc.opaque()).unwrap()
558557
})
559558
}
560559

561560
pub fn get_deprecation(cdata: Cmd, id: DefIndex) -> Option<attr::Deprecation> {
562561
let item = cdata.lookup_item(id);
563562
reader::maybe_get_doc(item, tag_items_data_item_deprecation).map(|doc| {
564-
let mut decoder = reader::Decoder::new(doc);
565-
Decodable::decode(&mut decoder).unwrap()
563+
Decodable::decode(&mut doc.opaque()).unwrap()
566564
})
567565
}
568566

@@ -579,19 +577,12 @@ pub fn get_parent_impl(cdata: Cmd, id: DefIndex) -> Option<DefId> {
579577

580578
pub fn get_repr_attrs(cdata: Cmd, id: DefIndex) -> Vec<attr::ReprAttr> {
581579
let item = cdata.lookup_item(id);
582-
match reader::maybe_get_doc(item, tag_items_data_item_repr).map(|doc| {
583-
let mut decoder = reader::Decoder::new(doc);
584-
Decodable::decode(&mut decoder).unwrap()
585-
}) {
586-
Some(attrs) => attrs,
587-
None => Vec::new(),
588-
}
580+
reader::maybe_get_doc(item, tag_items_data_item_repr).map_or(vec![], |doc| {
581+
Decodable::decode(&mut doc.opaque()).unwrap()
582+
})
589583
}
590584

591-
pub fn get_impl_polarity<'tcx>(cdata: Cmd,
592-
id: DefIndex)
593-
-> Option<hir::ImplPolarity>
594-
{
585+
pub fn get_impl_polarity(cdata: Cmd, id: DefIndex) -> Option<hir::ImplPolarity> {
595586
let item_doc = cdata.lookup_item(id);
596587
let fam = item_family(item_doc);
597588
match fam {
@@ -602,15 +593,14 @@ pub fn get_impl_polarity<'tcx>(cdata: Cmd,
602593
}
603594
}
604595

605-
pub fn get_custom_coerce_unsized_kind<'tcx>(
596+
pub fn get_custom_coerce_unsized_kind(
606597
cdata: Cmd,
607598
id: DefIndex)
608599
-> Option<ty::adjustment::CustomCoerceUnsized>
609600
{
610601
let item_doc = cdata.lookup_item(id);
611602
reader::maybe_get_doc(item_doc, tag_impl_coerce_unsized_kind).map(|kind_doc| {
612-
let mut decoder = reader::Decoder::new(kind_doc);
613-
Decodable::decode(&mut decoder).unwrap()
603+
Decodable::decode(&mut kind_doc.opaque()).unwrap()
614604
})
615605
}
616606

@@ -989,8 +979,7 @@ pub fn get_trait_item_def_ids(cdata: Cmd, id: DefIndex)
989979
pub fn get_item_variances(cdata: Cmd, id: DefIndex) -> Vec<ty::Variance> {
990980
let item_doc = cdata.lookup_item(id);
991981
let variance_doc = reader::get_doc(item_doc, tag_item_variances);
992-
let mut decoder = reader::Decoder::new(variance_doc);
993-
Decodable::decode(&mut decoder).unwrap()
982+
Decodable::decode(&mut variance_doc.opaque()).unwrap()
994983
}
995984

996985
pub fn get_provided_trait_methods<'a, 'tcx>(cdata: Cmd,
@@ -1109,10 +1098,7 @@ pub fn get_struct_field_names(cdata: Cmd, id: DefIndex) -> Vec<ast::Name> {
11091098

11101099
fn get_attributes(md: rbml::Doc) -> Vec<ast::Attribute> {
11111100
reader::maybe_get_doc(md, tag_attributes).map_or(vec![], |attrs_doc| {
1112-
let mut decoder = reader::Decoder::new(attrs_doc);
1113-
let mut attrs: Vec<ast::Attribute> = decoder.read_opaque(|opaque_decoder, _| {
1114-
Decodable::decode(opaque_decoder)
1115-
}).unwrap();
1101+
let mut attrs = Vec::<ast::Attribute>::decode(&mut attrs_doc.opaque()).unwrap();
11161102

11171103
// Need new unique IDs: old thread-local IDs won't map to new threads.
11181104
for attr in attrs.iter_mut() {
@@ -1575,18 +1561,14 @@ pub fn get_imported_filemaps(metadata: &[u8]) -> Vec<syntax_pos::FileMap> {
15751561
let cm_doc = reader::get_doc(crate_doc, tag_codemap);
15761562

15771563
reader::tagged_docs(cm_doc, tag_codemap_filemap).map(|filemap_doc| {
1578-
let mut decoder = reader::Decoder::new(filemap_doc);
1579-
decoder.read_opaque(|opaque_decoder, _| {
1580-
Decodable::decode(opaque_decoder)
1581-
}).unwrap()
1564+
Decodable::decode(&mut filemap_doc.opaque()).unwrap()
15821565
}).collect()
15831566
}
15841567

15851568
pub fn closure_kind(cdata: Cmd, closure_id: DefIndex) -> ty::ClosureKind {
15861569
let closure_doc = cdata.lookup_item(closure_id);
15871570
let closure_kind_doc = reader::get_doc(closure_doc, tag_items_closure_kind);
1588-
let mut decoder = reader::Decoder::new(closure_kind_doc);
1589-
ty::ClosureKind::decode(&mut decoder).unwrap()
1571+
ty::ClosureKind::decode(&mut closure_kind_doc.opaque()).unwrap()
15901572
}
15911573

15921574
pub fn closure_ty<'a, 'tcx>(cdata: Cmd, closure_id: DefIndex, tcx: TyCtxt<'a, 'tcx, 'tcx>)
@@ -1606,8 +1588,7 @@ pub fn def_key(cdata: Cmd, id: DefIndex) -> hir_map::DefKey {
16061588
fn item_def_key(item_doc: rbml::Doc) -> hir_map::DefKey {
16071589
match reader::maybe_get_doc(item_doc, tag_def_key) {
16081590
Some(def_key_doc) => {
1609-
let mut decoder = reader::Decoder::new(def_key_doc);
1610-
let simple_key = def_key::DefKey::decode(&mut decoder).unwrap();
1591+
let simple_key = def_key::DefKey::decode(&mut def_key_doc.opaque()).unwrap();
16111592
let name = reader::maybe_get_doc(item_doc, tag_paths_data_name).map(|name| {
16121593
token::intern(name.as_str()).as_str()
16131594
});

src/librustc_metadata/encoder.rs

Lines changed: 9 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -132,7 +132,7 @@ fn encode_def_id(ecx: &mut EncodeContext, id: DefId) {
132132
fn encode_def_key(ecx: &mut EncodeContext, key: DefKey) {
133133
let simple_key = def_key::simplify_def_key(key);
134134
ecx.start_tag(tag_def_key);
135-
simple_key.encode(ecx);
135+
simple_key.encode(&mut ecx.opaque());
136136
ecx.end_tag();
137137
}
138138

@@ -171,7 +171,7 @@ pub fn def_to_string(_tcx: TyCtxt, did: DefId) -> String {
171171
fn encode_item_variances(ecx: &mut EncodeContext, id: NodeId) {
172172
let v = ecx.tcx.item_variances(ecx.tcx.map.local_def_id(id));
173173
ecx.start_tag(tag_item_variances);
174-
v.encode(ecx);
174+
v.encode(&mut ecx.opaque());
175175
ecx.end_tag();
176176
}
177177

@@ -786,7 +786,7 @@ impl<'a, 'b, 'tcx> ItemContentBuilder<'a, 'b, 'tcx> {
786786
attr));
787787
}
788788
self.start_tag(tag_items_data_item_repr);
789-
repr_attrs.encode(self.ecx);
789+
repr_attrs.encode(&mut self.opaque());
790790
self.end_tag();
791791
}
792792

@@ -821,15 +821,15 @@ fn encode_inherent_implementations(ecx: &mut EncodeContext,
821821
fn encode_stability(ecx: &mut EncodeContext, stab_opt: Option<&attr::Stability>) {
822822
stab_opt.map(|stab| {
823823
ecx.start_tag(tag_items_data_item_stability);
824-
stab.encode(ecx).unwrap();
824+
stab.encode(&mut ecx.opaque()).unwrap();
825825
ecx.end_tag();
826826
});
827827
}
828828

829829
fn encode_deprecation(ecx: &mut EncodeContext, depr_opt: Option<attr::Deprecation>) {
830830
depr_opt.map(|depr| {
831831
ecx.start_tag(tag_items_data_item_deprecation);
832-
depr.encode(ecx).unwrap();
832+
depr.encode(&mut ecx.opaque()).unwrap();
833833
ecx.end_tag();
834834
});
835835
}
@@ -1068,7 +1068,7 @@ impl<'a, 'b, 'tcx> ItemContentBuilder<'a, 'b, 'tcx> {
10681068
{
10691069
Some(&kind) => {
10701070
self.start_tag(tag_impl_coerce_unsized_kind);
1071-
kind.encode(self.ecx);
1071+
kind.encode(&mut self.opaque());
10721072
self.end_tag();
10731073
}
10741074
None => {}
@@ -1386,7 +1386,7 @@ impl<'a, 'b, 'tcx> ItemContentBuilder<'a, 'b, 'tcx> {
13861386
self.end_tag();
13871387

13881388
self.start_tag(tag_items_closure_kind);
1389-
tcx.closure_kind(def_id).encode(self.ecx).unwrap();
1389+
tcx.closure_kind(def_id).encode(&mut self.opaque()).unwrap();
13901390
self.end_tag();
13911391

13921392
assert!(self.mir_map.map.contains_key(&def_id));
@@ -1428,9 +1428,7 @@ fn encode_item_index(ecx: &mut EncodeContext, index: IndexData) {
14281428

14291429
fn encode_attributes(ecx: &mut EncodeContext, attrs: &[ast::Attribute]) {
14301430
ecx.start_tag(tag_attributes);
1431-
ecx.emit_opaque(|opaque_encoder| {
1432-
attrs.encode(opaque_encoder)
1433-
}).unwrap();
1431+
attrs.encode(&mut ecx.opaque()).unwrap();
14341432
ecx.end_tag();
14351433
}
14361434

@@ -1565,9 +1563,7 @@ fn encode_codemap(ecx: &mut EncodeContext) {
15651563
}
15661564

15671565
ecx.start_tag(tag_codemap_filemap);
1568-
ecx.emit_opaque(|opaque_encoder| {
1569-
filemap.encode(opaque_encoder)
1570-
}).unwrap();
1566+
filemap.encode(&mut ecx.opaque()).unwrap();
15711567
ecx.end_tag();
15721568
}
15731569

src/librustc_metadata/rbml/reader.rs

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -158,6 +158,10 @@ impl<'doc> Doc<'doc> {
158158
pub fn to_string(&self) -> String {
159159
self.as_str().to_string()
160160
}
161+
162+
pub fn opaque(&self) -> opaque::Decoder<'doc> {
163+
opaque::Decoder::new(self.data, self.start)
164+
}
161165
}
162166

163167
pub struct TaggedDoc<'a> {
@@ -670,12 +674,7 @@ impl<'doc> Decoder<'doc> {
670674
where F: FnOnce(&mut opaque::Decoder, Doc) -> DecodeResult<R>
671675
{
672676
let doc = self.next_doc(EsOpaque)?;
673-
674-
let result = {
675-
let mut opaque_decoder = opaque::Decoder::new(doc.data, doc.start);
676-
op(&mut opaque_decoder, doc)?
677-
};
678-
677+
let result = op(&mut doc.opaque(), doc)?;
679678
Ok(result)
680679
}
681680

src/librustc_metadata/rbml/writer.rs

Lines changed: 5 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -241,9 +241,7 @@ impl Encoder {
241241
}
242242
pos
243243
}
244-
}
245244

246-
impl Encoder {
247245
// used internally to emit things like the vector length and so on
248246
fn _emit_tagged_sub(&mut self, v: usize) -> EncodeResult {
249247
if v as u8 as usize == v {
@@ -256,16 +254,15 @@ impl Encoder {
256254
}
257255
}
258256

257+
pub fn opaque(&mut self) -> opaque::Encoder {
258+
opaque::Encoder::new(&mut self.writer)
259+
}
260+
259261
pub fn emit_opaque<F>(&mut self, f: F) -> EncodeResult
260262
where F: FnOnce(&mut opaque::Encoder) -> EncodeResult
261263
{
262264
self.start_tag(EsOpaque as usize)?;
263-
264-
{
265-
let mut opaque_encoder = opaque::Encoder::new(&mut self.writer);
266-
f(&mut opaque_encoder)?;
267-
}
268-
265+
f(&mut self.opaque())?;
269266
self.mark_stable_position();
270267
self.end_tag()
271268
}

0 commit comments

Comments
 (0)