diff --git a/src/librustc_metadata/rmeta/encoder.rs b/src/librustc_metadata/rmeta/encoder.rs index 9410b19064683..8074bde61237d 100644 --- a/src/librustc_metadata/rmeta/encoder.rs +++ b/src/librustc_metadata/rmeta/encoder.rs @@ -1,5 +1,5 @@ use crate::rmeta::*; -use crate::rmeta::table::{FixedSizeEncoding, TableBuilder}; +use crate::rmeta::table::FixedSizeEncoding; use rustc::middle::cstore::{LinkagePreference, NativeLibrary, EncodedMetadata, ForeignModule}; @@ -8,7 +8,7 @@ use rustc::hir::def_id::{CrateNum, CRATE_DEF_INDEX, DefIndex, DefId, LocalDefId, use rustc::hir::{GenericParamKind, AnonConst}; use rustc::hir::map::definitions::DefPathTable; use rustc_data_structures::fingerprint::Fingerprint; -use rustc_index::vec::{Idx, IndexVec}; +use rustc_index::vec::Idx; use rustc::middle::dependency_format::Linkage; use rustc::middle::exported_symbols::{ExportedSymbol, SymbolExportLevel, metadata_symbol_name}; @@ -60,30 +60,6 @@ struct EncodeContext<'tcx> { source_file_cache: Lrc, } -#[derive(Default)] -struct PerDefTableBuilders<'tcx> { - kind: TableBuilder>>, - visibility: TableBuilder>, - span: TableBuilder>, - attributes: TableBuilder>, - children: TableBuilder>, - stability: TableBuilder>, - deprecation: TableBuilder>, - - ty: TableBuilder>>, - fn_sig: TableBuilder>>, - impl_trait_ref: TableBuilder>>, - inherent_impls: TableBuilder>, - variances: TableBuilder>, - generics: TableBuilder>, - explicit_predicates: TableBuilder>>, - inferred_outlives: TableBuilder, Span)]>>, - super_predicates: TableBuilder>>, - - mir: TableBuilder>>, - promoted_mir: TableBuilder>>>, -} - macro_rules! encoder_methods { ($($name:ident($ty:ty);)*) => { $(fn $name(&mut self, value: $ty) -> Result<(), Self::Error> { @@ -509,28 +485,7 @@ impl<'tcx> EncodeContext<'tcx> { i = self.position(); - let per_def = LazyPerDefTables { - kind: self.per_def.kind.encode(&mut self.opaque), - visibility: self.per_def.visibility.encode(&mut self.opaque), - span: self.per_def.span.encode(&mut self.opaque), - attributes: self.per_def.attributes.encode(&mut self.opaque), - children: self.per_def.children.encode(&mut self.opaque), - stability: self.per_def.stability.encode(&mut self.opaque), - deprecation: self.per_def.deprecation.encode(&mut self.opaque), - - ty: self.per_def.ty.encode(&mut self.opaque), - fn_sig: self.per_def.fn_sig.encode(&mut self.opaque), - impl_trait_ref: self.per_def.impl_trait_ref.encode(&mut self.opaque), - inherent_impls: self.per_def.inherent_impls.encode(&mut self.opaque), - variances: self.per_def.variances.encode(&mut self.opaque), - generics: self.per_def.generics.encode(&mut self.opaque), - explicit_predicates: self.per_def.explicit_predicates.encode(&mut self.opaque), - inferred_outlives: self.per_def.inferred_outlives.encode(&mut self.opaque), - super_predicates: self.per_def.super_predicates.encode(&mut self.opaque), - - mir: self.per_def.mir.encode(&mut self.opaque), - promoted_mir: self.per_def.promoted_mir.encode(&mut self.opaque), - }; + let per_def = self.per_def.encode(&mut self.opaque); let per_def_bytes = self.position() - i; // Encode the proc macro data diff --git a/src/librustc_metadata/rmeta/mod.rs b/src/librustc_metadata/rmeta/mod.rs index a17809b24c0ff..1bca2836a3a07 100644 --- a/src/librustc_metadata/rmeta/mod.rs +++ b/src/librustc_metadata/rmeta/mod.rs @@ -1,5 +1,5 @@ use decoder::Metadata; -use table::Table; +use table::{Table, TableBuilder}; use rustc::hir; use rustc::hir::def::{self, CtorKind}; @@ -15,6 +15,7 @@ use rustc_target::spec::{PanicStrategy, TargetTriple}; use rustc_index::vec::IndexVec; use rustc_data_structures::svh::Svh; use rustc_data_structures::sync::MetadataRef; +use rustc_serialize::opaque::Encoder; use syntax::{ast, attr}; use syntax::edition::Edition; use syntax::symbol::Symbol; @@ -230,31 +231,53 @@ crate struct TraitImpls { impls: Lazy<[DefIndex]>, } -#[derive(RustcEncodable, RustcDecodable)] -crate struct LazyPerDefTables<'tcx> { - kind: Lazy!(Table)>), - visibility: Lazy!(Table>), - span: Lazy!(Table>), - attributes: Lazy!(Table>), - children: Lazy!(Table>), - stability: Lazy!(Table>), - deprecation: Lazy!(Table>), - ty: Lazy!(Table)>), - fn_sig: Lazy!(Table)>), - impl_trait_ref: Lazy!(Table)>), - inherent_impls: Lazy!(Table>), - variances: Lazy!(Table>), - generics: Lazy!(Table>), - explicit_predicates: Lazy!(Table)>), +/// Define `LazyPerDefTables` and `PerDefTableBuilders` at the same time. +macro_rules! define_per_def_tables { + ($($name:ident: Table),+ $(,)?) => { + #[derive(RustcEncodable, RustcDecodable)] + crate struct LazyPerDefTables<'tcx> { + $($name: Lazy!(Table)),+ + } + + #[derive(Default)] + struct PerDefTableBuilders<'tcx> { + $($name: TableBuilder),+ + } + + impl PerDefTableBuilders<'tcx> { + fn encode(&self, buf: &mut Encoder) -> LazyPerDefTables<'tcx> { + LazyPerDefTables { + $($name: self.$name.encode(buf)),+ + } + } + } + } +} + +define_per_def_tables! { + kind: Table)>, + visibility: Table>, + span: Table>, + attributes: Table>, + children: Table>, + stability: Table>, + deprecation: Table>, + ty: Table)>, + fn_sig: Table)>, + impl_trait_ref: Table)>, + inherent_impls: Table>, + variances: Table>, + generics: Table>, + explicit_predicates: Table)>, // FIXME(eddyb) this would ideally be `Lazy<[...]>` but `ty::Predicate` // doesn't handle shorthands in its own (de)serialization impls, // as it's an `enum` for which we want to derive (de)serialization, // so the `ty::codec` APIs handle the whole `&'tcx [...]` at once. // Also, as an optimization, a missing entry indicates an empty `&[]`. - inferred_outlives: Lazy!(Table, Span)])>), - super_predicates: Lazy!(Table)>), - mir: Lazy!(Table)>), - promoted_mir: Lazy!(Table>)>), + inferred_outlives: Table, Span)])>, + super_predicates: Table)>, + mir: Table)>, + promoted_mir: Table>)>, } #[derive(Copy, Clone, RustcEncodable, RustcDecodable)]