Skip to content

Commit f351963

Browse files
committed
pull out code for encoding enum variants
1 parent 5166682 commit f351963

File tree

2 files changed

+45
-56
lines changed

2 files changed

+45
-56
lines changed

src/librustc_metadata/decoder.rs

Lines changed: 5 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -240,11 +240,10 @@ fn reexports<'a>(d: rbml::Doc<'a>) -> reader::TaggedDocsIterator<'a> {
240240
reader::tagged_docs(d, tag_items_data_item_reexport)
241241
}
242242

243-
fn variant_disr_val(d: rbml::Doc) -> Option<u64> {
244-
reader::maybe_get_doc(d, tag_disr_val).and_then(|val_doc| {
245-
reader::with_doc_data(val_doc, |data| {
246-
str::from_utf8(data).ok().and_then(|s| s.parse().ok())
247-
})
243+
fn variant_disr_val(d: rbml::Doc) -> u64 {
244+
let val_doc = reader::get_doc(d, tag_disr_val);
245+
reader::with_doc_data(val_doc, |data| {
246+
str::from_utf8(data).unwrap().parse().unwrap()
248247
})
249248
}
250249

@@ -402,17 +401,10 @@ pub fn get_adt_def<'a, 'tcx>(cdata: Cmd,
402401
}
403402
}
404403
fn get_enum_variants<'tcx>(cdata: Cmd, doc: rbml::Doc) -> Vec<ty::VariantDefData<'tcx, 'tcx>> {
405-
let mut disr_val = 0;
406404
reader::tagged_docs(doc, tag_items_data_item_variant).map(|p| {
407405
let did = translated_def_id(cdata, p);
408406
let item = cdata.lookup_item(did.index);
409-
410-
if let Some(disr) = variant_disr_val(item) {
411-
disr_val = disr;
412-
}
413-
let disr = disr_val;
414-
disr_val = disr_val.wrapping_add(1);
415-
407+
let disr = variant_disr_val(item);
416408
ty::VariantDefData {
417409
did: did,
418410
name: item_name(item),

src/librustc_metadata/encoder.rs

Lines changed: 40 additions & 43 deletions
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,6 @@ use middle::dependency_format::Linkage;
2828
use rustc::dep_graph::DepNode;
2929
use rustc::traits::specialization_graph;
3030
use rustc::ty::{self, Ty, TyCtxt};
31-
use rustc::ty::util::IntTypeExt;
3231

3332
use rustc::hir::svh::Svh;
3433
use rustc::mir::mir_map::MirMap;
@@ -198,55 +197,53 @@ impl<'a, 'tcx, 'encoder> ItemContentBuilder<'a, 'tcx, 'encoder> {
198197
}
199198

200199
impl<'a, 'tcx, 'encoder> IndexBuilder<'a, 'tcx, 'encoder> {
201-
fn encode_enum_variant_info(&mut self,
202-
did: DefId,
203-
vis: &hir::Visibility) {
204-
debug!("encode_enum_variant_info(did={:?})", did);
200+
fn encode_enum_variant_infos(&mut self,
201+
enum_did: DefId,
202+
vis: &hir::Visibility) {
203+
debug!("encode_enum_variant_info(enum_did={:?})", enum_did);
205204
let ecx = self.ecx();
206-
let repr_hints = ecx.tcx.lookup_repr_hints(did);
207-
let repr_type = ecx.tcx.enum_repr_type(repr_hints.get(0));
208-
let mut disr_val = repr_type.initial_discriminant(ecx.tcx);
209-
let def = ecx.tcx.lookup_adt_def(did);
210-
for variant in &def.variants {
211-
let vid = variant.did;
212-
let variant_node_id = ecx.local_id(vid);
213-
205+
let def = ecx.tcx.lookup_adt_def(enum_did);
206+
for (i, variant) in def.variants.iter().enumerate() {
214207
for field in &variant.fields {
215208
self.encode_field(field);
216209
}
210+
self.record(variant.did, |this| this.encode_enum_variant_info(enum_did, i, vis));
211+
}
212+
}
213+
}
217214

218-
self.record(vid, |this| {
219-
encode_def_id_and_key(ecx, this.rbml_w, vid);
220-
encode_family(this.rbml_w, match variant.kind {
221-
ty::VariantKind::Struct => 'V',
222-
ty::VariantKind::Tuple => 'v',
223-
ty::VariantKind::Unit => 'w',
224-
});
225-
encode_name(this.rbml_w, variant.name);
226-
this.encode_parent_item(did);
227-
this.encode_visibility(vis);
228-
229-
let attrs = ecx.tcx.get_attrs(vid);
230-
encode_attributes(this.rbml_w, &attrs);
231-
this.encode_repr_attrs(&attrs);
232-
233-
let stab = ecx.tcx.lookup_stability(vid);
234-
let depr = ecx.tcx.lookup_deprecation(vid);
235-
encode_stability(this.rbml_w, stab);
236-
encode_deprecation(this.rbml_w, depr);
215+
impl<'a, 'tcx, 'encoder> ItemContentBuilder<'a, 'tcx, 'encoder> {
216+
fn encode_enum_variant_info(&mut self,
217+
enum_did: DefId, // enum def-id
218+
index: usize, // variant index
219+
vis: &hir::Visibility) {
220+
let ecx = self.ecx;
221+
let def = ecx.tcx.lookup_adt_def(enum_did);
222+
let variant = &def.variants[index];
223+
let vid = variant.did;
224+
let variant_node_id = ecx.local_id(vid);
225+
encode_def_id_and_key(ecx, self.rbml_w, vid);
226+
encode_family(self.rbml_w, match variant.kind {
227+
ty::VariantKind::Struct => 'V',
228+
ty::VariantKind::Tuple => 'v',
229+
ty::VariantKind::Unit => 'w',
230+
});
231+
encode_name(self.rbml_w, variant.name);
232+
self.encode_parent_item(enum_did);
233+
self.encode_visibility(vis);
237234

238-
this.encode_struct_fields(variant);
235+
let attrs = ecx.tcx.get_attrs(vid);
236+
encode_attributes(self.rbml_w, &attrs);
237+
self.encode_repr_attrs(&attrs);
239238

240-
let specified_disr_val = variant.disr_val;
241-
if specified_disr_val != disr_val {
242-
this.encode_disr_val(specified_disr_val);
243-
disr_val = specified_disr_val;
244-
}
245-
this.encode_bounds_and_type_for_item(variant_node_id);
246-
});
239+
let stab = ecx.tcx.lookup_stability(vid);
240+
let depr = ecx.tcx.lookup_deprecation(vid);
241+
encode_stability(self.rbml_w, stab);
242+
encode_deprecation(self.rbml_w, depr);
247243

248-
disr_val = disr_val.wrap_incr();
249-
}
244+
self.encode_struct_fields(variant);
245+
self.encode_disr_val(variant.disr_val);
246+
self.encode_bounds_and_type_for_item(variant_node_id);
250247
}
251248
}
252249

@@ -1045,7 +1042,7 @@ impl<'a, 'tcx, 'encoder> IndexBuilder<'a, 'tcx, 'encoder> {
10451042
// no sub-item recording needed in these cases
10461043
}
10471044
hir::ItemEnum(..) => {
1048-
self.encode_enum_variant_info(def_id, &item.vis);
1045+
self.encode_enum_variant_infos(def_id, &item.vis);
10491046
}
10501047
hir::ItemStruct(ref struct_def, _) => {
10511048
self.encode_addl_struct_info(def_id, struct_def.id(), item);

0 commit comments

Comments
 (0)