rustc_metadata: encode miscellaneous information opaquely.

This commit is contained in:
Eduard Burtescu 2016-08-30 09:00:04 +03:00
parent 3cbe4b8bce
commit 97864d41a6
4 changed files with 32 additions and 59 deletions

View file

@ -553,16 +553,14 @@ pub fn get_type<'a, 'tcx>(cdata: Cmd, id: DefIndex, tcx: TyCtxt<'a, 'tcx, 'tcx>)
pub fn get_stability(cdata: Cmd, id: DefIndex) -> Option<attr::Stability> { pub fn get_stability(cdata: Cmd, id: DefIndex) -> Option<attr::Stability> {
let item = cdata.lookup_item(id); let item = cdata.lookup_item(id);
reader::maybe_get_doc(item, tag_items_data_item_stability).map(|doc| { reader::maybe_get_doc(item, tag_items_data_item_stability).map(|doc| {
let mut decoder = reader::Decoder::new(doc); Decodable::decode(&mut doc.opaque()).unwrap()
Decodable::decode(&mut decoder).unwrap()
}) })
} }
pub fn get_deprecation(cdata: Cmd, id: DefIndex) -> Option<attr::Deprecation> { pub fn get_deprecation(cdata: Cmd, id: DefIndex) -> Option<attr::Deprecation> {
let item = cdata.lookup_item(id); let item = cdata.lookup_item(id);
reader::maybe_get_doc(item, tag_items_data_item_deprecation).map(|doc| { reader::maybe_get_doc(item, tag_items_data_item_deprecation).map(|doc| {
let mut decoder = reader::Decoder::new(doc); Decodable::decode(&mut doc.opaque()).unwrap()
Decodable::decode(&mut decoder).unwrap()
}) })
} }
@ -579,19 +577,12 @@ pub fn get_parent_impl(cdata: Cmd, id: DefIndex) -> Option<DefId> {
pub fn get_repr_attrs(cdata: Cmd, id: DefIndex) -> Vec<attr::ReprAttr> { pub fn get_repr_attrs(cdata: Cmd, id: DefIndex) -> Vec<attr::ReprAttr> {
let item = cdata.lookup_item(id); let item = cdata.lookup_item(id);
match reader::maybe_get_doc(item, tag_items_data_item_repr).map(|doc| { reader::maybe_get_doc(item, tag_items_data_item_repr).map_or(vec![], |doc| {
let mut decoder = reader::Decoder::new(doc); Decodable::decode(&mut doc.opaque()).unwrap()
Decodable::decode(&mut decoder).unwrap() })
}) {
Some(attrs) => attrs,
None => Vec::new(),
}
} }
pub fn get_impl_polarity<'tcx>(cdata: Cmd, pub fn get_impl_polarity(cdata: Cmd, id: DefIndex) -> Option<hir::ImplPolarity> {
id: DefIndex)
-> Option<hir::ImplPolarity>
{
let item_doc = cdata.lookup_item(id); let item_doc = cdata.lookup_item(id);
let fam = item_family(item_doc); let fam = item_family(item_doc);
match fam { match fam {
@ -602,15 +593,14 @@ pub fn get_impl_polarity<'tcx>(cdata: Cmd,
} }
} }
pub fn get_custom_coerce_unsized_kind<'tcx>( pub fn get_custom_coerce_unsized_kind(
cdata: Cmd, cdata: Cmd,
id: DefIndex) id: DefIndex)
-> Option<ty::adjustment::CustomCoerceUnsized> -> Option<ty::adjustment::CustomCoerceUnsized>
{ {
let item_doc = cdata.lookup_item(id); let item_doc = cdata.lookup_item(id);
reader::maybe_get_doc(item_doc, tag_impl_coerce_unsized_kind).map(|kind_doc| { reader::maybe_get_doc(item_doc, tag_impl_coerce_unsized_kind).map(|kind_doc| {
let mut decoder = reader::Decoder::new(kind_doc); Decodable::decode(&mut kind_doc.opaque()).unwrap()
Decodable::decode(&mut decoder).unwrap()
}) })
} }
@ -989,8 +979,7 @@ pub fn get_trait_item_def_ids(cdata: Cmd, id: DefIndex)
pub fn get_item_variances(cdata: Cmd, id: DefIndex) -> Vec<ty::Variance> { pub fn get_item_variances(cdata: Cmd, id: DefIndex) -> Vec<ty::Variance> {
let item_doc = cdata.lookup_item(id); let item_doc = cdata.lookup_item(id);
let variance_doc = reader::get_doc(item_doc, tag_item_variances); let variance_doc = reader::get_doc(item_doc, tag_item_variances);
let mut decoder = reader::Decoder::new(variance_doc); Decodable::decode(&mut variance_doc.opaque()).unwrap()
Decodable::decode(&mut decoder).unwrap()
} }
pub fn get_provided_trait_methods<'a, 'tcx>(cdata: Cmd, 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> {
fn get_attributes(md: rbml::Doc) -> Vec<ast::Attribute> { fn get_attributes(md: rbml::Doc) -> Vec<ast::Attribute> {
reader::maybe_get_doc(md, tag_attributes).map_or(vec![], |attrs_doc| { reader::maybe_get_doc(md, tag_attributes).map_or(vec![], |attrs_doc| {
let mut decoder = reader::Decoder::new(attrs_doc); let mut attrs = Vec::<ast::Attribute>::decode(&mut attrs_doc.opaque()).unwrap();
let mut attrs: Vec<ast::Attribute> = decoder.read_opaque(|opaque_decoder, _| {
Decodable::decode(opaque_decoder)
}).unwrap();
// Need new unique IDs: old thread-local IDs won't map to new threads. // Need new unique IDs: old thread-local IDs won't map to new threads.
for attr in attrs.iter_mut() { for attr in attrs.iter_mut() {
@ -1575,18 +1561,14 @@ pub fn get_imported_filemaps(metadata: &[u8]) -> Vec<syntax_pos::FileMap> {
let cm_doc = reader::get_doc(crate_doc, tag_codemap); let cm_doc = reader::get_doc(crate_doc, tag_codemap);
reader::tagged_docs(cm_doc, tag_codemap_filemap).map(|filemap_doc| { reader::tagged_docs(cm_doc, tag_codemap_filemap).map(|filemap_doc| {
let mut decoder = reader::Decoder::new(filemap_doc); Decodable::decode(&mut filemap_doc.opaque()).unwrap()
decoder.read_opaque(|opaque_decoder, _| {
Decodable::decode(opaque_decoder)
}).unwrap()
}).collect() }).collect()
} }
pub fn closure_kind(cdata: Cmd, closure_id: DefIndex) -> ty::ClosureKind { pub fn closure_kind(cdata: Cmd, closure_id: DefIndex) -> ty::ClosureKind {
let closure_doc = cdata.lookup_item(closure_id); let closure_doc = cdata.lookup_item(closure_id);
let closure_kind_doc = reader::get_doc(closure_doc, tag_items_closure_kind); let closure_kind_doc = reader::get_doc(closure_doc, tag_items_closure_kind);
let mut decoder = reader::Decoder::new(closure_kind_doc); ty::ClosureKind::decode(&mut closure_kind_doc.opaque()).unwrap()
ty::ClosureKind::decode(&mut decoder).unwrap()
} }
pub fn closure_ty<'a, 'tcx>(cdata: Cmd, closure_id: DefIndex, tcx: TyCtxt<'a, 'tcx, 'tcx>) 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 {
fn item_def_key(item_doc: rbml::Doc) -> hir_map::DefKey { fn item_def_key(item_doc: rbml::Doc) -> hir_map::DefKey {
match reader::maybe_get_doc(item_doc, tag_def_key) { match reader::maybe_get_doc(item_doc, tag_def_key) {
Some(def_key_doc) => { Some(def_key_doc) => {
let mut decoder = reader::Decoder::new(def_key_doc); let simple_key = def_key::DefKey::decode(&mut def_key_doc.opaque()).unwrap();
let simple_key = def_key::DefKey::decode(&mut decoder).unwrap();
let name = reader::maybe_get_doc(item_doc, tag_paths_data_name).map(|name| { let name = reader::maybe_get_doc(item_doc, tag_paths_data_name).map(|name| {
token::intern(name.as_str()).as_str() token::intern(name.as_str()).as_str()
}); });

View file

@ -132,7 +132,7 @@ fn encode_def_id(ecx: &mut EncodeContext, id: DefId) {
fn encode_def_key(ecx: &mut EncodeContext, key: DefKey) { fn encode_def_key(ecx: &mut EncodeContext, key: DefKey) {
let simple_key = def_key::simplify_def_key(key); let simple_key = def_key::simplify_def_key(key);
ecx.start_tag(tag_def_key); ecx.start_tag(tag_def_key);
simple_key.encode(ecx); simple_key.encode(&mut ecx.opaque());
ecx.end_tag(); ecx.end_tag();
} }
@ -171,7 +171,7 @@ pub fn def_to_string(_tcx: TyCtxt, did: DefId) -> String {
fn encode_item_variances(ecx: &mut EncodeContext, id: NodeId) { fn encode_item_variances(ecx: &mut EncodeContext, id: NodeId) {
let v = ecx.tcx.item_variances(ecx.tcx.map.local_def_id(id)); let v = ecx.tcx.item_variances(ecx.tcx.map.local_def_id(id));
ecx.start_tag(tag_item_variances); ecx.start_tag(tag_item_variances);
v.encode(ecx); v.encode(&mut ecx.opaque());
ecx.end_tag(); ecx.end_tag();
} }
@ -786,7 +786,7 @@ impl<'a, 'b, 'tcx> ItemContentBuilder<'a, 'b, 'tcx> {
attr)); attr));
} }
self.start_tag(tag_items_data_item_repr); self.start_tag(tag_items_data_item_repr);
repr_attrs.encode(self.ecx); repr_attrs.encode(&mut self.opaque());
self.end_tag(); self.end_tag();
} }
@ -821,7 +821,7 @@ fn encode_inherent_implementations(ecx: &mut EncodeContext,
fn encode_stability(ecx: &mut EncodeContext, stab_opt: Option<&attr::Stability>) { fn encode_stability(ecx: &mut EncodeContext, stab_opt: Option<&attr::Stability>) {
stab_opt.map(|stab| { stab_opt.map(|stab| {
ecx.start_tag(tag_items_data_item_stability); ecx.start_tag(tag_items_data_item_stability);
stab.encode(ecx).unwrap(); stab.encode(&mut ecx.opaque()).unwrap();
ecx.end_tag(); ecx.end_tag();
}); });
} }
@ -829,7 +829,7 @@ fn encode_stability(ecx: &mut EncodeContext, stab_opt: Option<&attr::Stability>)
fn encode_deprecation(ecx: &mut EncodeContext, depr_opt: Option<attr::Deprecation>) { fn encode_deprecation(ecx: &mut EncodeContext, depr_opt: Option<attr::Deprecation>) {
depr_opt.map(|depr| { depr_opt.map(|depr| {
ecx.start_tag(tag_items_data_item_deprecation); ecx.start_tag(tag_items_data_item_deprecation);
depr.encode(ecx).unwrap(); depr.encode(&mut ecx.opaque()).unwrap();
ecx.end_tag(); ecx.end_tag();
}); });
} }
@ -1068,7 +1068,7 @@ impl<'a, 'b, 'tcx> ItemContentBuilder<'a, 'b, 'tcx> {
{ {
Some(&kind) => { Some(&kind) => {
self.start_tag(tag_impl_coerce_unsized_kind); self.start_tag(tag_impl_coerce_unsized_kind);
kind.encode(self.ecx); kind.encode(&mut self.opaque());
self.end_tag(); self.end_tag();
} }
None => {} None => {}
@ -1386,7 +1386,7 @@ impl<'a, 'b, 'tcx> ItemContentBuilder<'a, 'b, 'tcx> {
self.end_tag(); self.end_tag();
self.start_tag(tag_items_closure_kind); self.start_tag(tag_items_closure_kind);
tcx.closure_kind(def_id).encode(self.ecx).unwrap(); tcx.closure_kind(def_id).encode(&mut self.opaque()).unwrap();
self.end_tag(); self.end_tag();
assert!(self.mir_map.map.contains_key(&def_id)); assert!(self.mir_map.map.contains_key(&def_id));
@ -1428,9 +1428,7 @@ fn encode_item_index(ecx: &mut EncodeContext, index: IndexData) {
fn encode_attributes(ecx: &mut EncodeContext, attrs: &[ast::Attribute]) { fn encode_attributes(ecx: &mut EncodeContext, attrs: &[ast::Attribute]) {
ecx.start_tag(tag_attributes); ecx.start_tag(tag_attributes);
ecx.emit_opaque(|opaque_encoder| { attrs.encode(&mut ecx.opaque()).unwrap();
attrs.encode(opaque_encoder)
}).unwrap();
ecx.end_tag(); ecx.end_tag();
} }
@ -1565,9 +1563,7 @@ fn encode_codemap(ecx: &mut EncodeContext) {
} }
ecx.start_tag(tag_codemap_filemap); ecx.start_tag(tag_codemap_filemap);
ecx.emit_opaque(|opaque_encoder| { filemap.encode(&mut ecx.opaque()).unwrap();
filemap.encode(opaque_encoder)
}).unwrap();
ecx.end_tag(); ecx.end_tag();
} }

View file

@ -158,6 +158,10 @@ impl<'doc> Doc<'doc> {
pub fn to_string(&self) -> String { pub fn to_string(&self) -> String {
self.as_str().to_string() self.as_str().to_string()
} }
pub fn opaque(&self) -> opaque::Decoder<'doc> {
opaque::Decoder::new(self.data, self.start)
}
} }
pub struct TaggedDoc<'a> { pub struct TaggedDoc<'a> {
@ -670,12 +674,7 @@ impl<'doc> Decoder<'doc> {
where F: FnOnce(&mut opaque::Decoder, Doc) -> DecodeResult<R> where F: FnOnce(&mut opaque::Decoder, Doc) -> DecodeResult<R>
{ {
let doc = self.next_doc(EsOpaque)?; let doc = self.next_doc(EsOpaque)?;
let result = op(&mut doc.opaque(), doc)?;
let result = {
let mut opaque_decoder = opaque::Decoder::new(doc.data, doc.start);
op(&mut opaque_decoder, doc)?
};
Ok(result) Ok(result)
} }

View file

@ -241,9 +241,7 @@ impl Encoder {
} }
pos pos
} }
}
impl Encoder {
// used internally to emit things like the vector length and so on // used internally to emit things like the vector length and so on
fn _emit_tagged_sub(&mut self, v: usize) -> EncodeResult { fn _emit_tagged_sub(&mut self, v: usize) -> EncodeResult {
if v as u8 as usize == v { if v as u8 as usize == v {
@ -256,16 +254,15 @@ impl Encoder {
} }
} }
pub fn opaque(&mut self) -> opaque::Encoder {
opaque::Encoder::new(&mut self.writer)
}
pub fn emit_opaque<F>(&mut self, f: F) -> EncodeResult pub fn emit_opaque<F>(&mut self, f: F) -> EncodeResult
where F: FnOnce(&mut opaque::Encoder) -> EncodeResult where F: FnOnce(&mut opaque::Encoder) -> EncodeResult
{ {
self.start_tag(EsOpaque as usize)?; self.start_tag(EsOpaque as usize)?;
f(&mut self.opaque())?;
{
let mut opaque_encoder = opaque::Encoder::new(&mut self.writer);
f(&mut opaque_encoder)?;
}
self.mark_stable_position(); self.mark_stable_position();
self.end_tag() self.end_tag()
} }