From ee42979eeb4b13bfb71116f330c735bc48fb38bc Mon Sep 17 00:00:00 2001 From: Eduard-Mihai Burtescu Date: Thu, 14 Nov 2019 02:44:24 +0200 Subject: rustc_metadata: use a separate TableBuilder type to build a Table. --- src/librustc_metadata/rmeta/encoder.rs | 46 +++++++++++++++++----------------- src/librustc_metadata/rmeta/table.rs | 26 +++++++++++-------- 2 files changed, 39 insertions(+), 33 deletions(-) (limited to 'src') diff --git a/src/librustc_metadata/rmeta/encoder.rs b/src/librustc_metadata/rmeta/encoder.rs index 5feb54bb8fa..e47047ae83d 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, Table}; +use crate::rmeta::table::{FixedSizeEncoding, TableBuilder}; use rustc::middle::cstore::{LinkagePreference, NativeLibrary, EncodedMetadata, ForeignModule}; @@ -47,7 +47,7 @@ struct EncodeContext<'tcx> { opaque: opaque::Encoder, tcx: TyCtxt<'tcx>, - per_def: PerDefTables<'tcx>, + per_def: PerDefTableBuilders<'tcx>, lazy_state: LazyState, type_shorthands: FxHashMap, usize>, @@ -61,27 +61,27 @@ struct EncodeContext<'tcx> { } #[derive(Default)] -struct PerDefTables<'tcx> { - 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>>, - inferred_outlives: Table, Span)]>>, - super_predicates: Table>>, - - mir: Table>>, - promoted_mir: Table>>>, +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 { diff --git a/src/librustc_metadata/rmeta/table.rs b/src/librustc_metadata/rmeta/table.rs index 833d84bfb5d..10122fbba1f 100644 --- a/src/librustc_metadata/rmeta/table.rs +++ b/src/librustc_metadata/rmeta/table.rs @@ -117,33 +117,39 @@ impl FixedSizeEncoding for Option> { } } -/// Random-access table (i.e. offeringconstant-time `get`/`set`), similar to +/// Random-access table (i.e. offering constant-time `get`/`set`), similar to /// `Vec>`, but without requiring encoding or decoding all the values /// eagerly and in-order. /// A total of `(max_idx + 1) * as FixedSizeEncoding>::BYTE_LEN` bytes -/// are used for a table, where `max_idx` is the largest index passed to `set`. -// FIXME(eddyb) replace `Vec` with `[_]` here, such that `Box>` would be used -// when building it, and `Lazy>` or `&Table` when reading it. -// (not sure if that is possible given that the `Vec` is being resized now) +/// are used for a table, where `max_idx` is the largest index passed to +/// `TableBuilder::set`. pub(super) struct Table where Option: FixedSizeEncoding { + _marker: PhantomData<(fn(&I), T)>, + // NOTE(eddyb) this makes `Table` not implement `Sized`, but no + // value of `Table` is ever created (it's always behind `Lazy`). + _bytes: [u8], +} + +/// Helper for constructing a table's serialization (also see `Table`). +pub(super) struct TableBuilder where Option: FixedSizeEncoding { // FIXME(eddyb) use `IndexVec>::BYTE_LEN]>` instead of // `Vec`, once that starts working (i.e. lazy normalization). - // Then again, that has the downside of not allowing `Table::encode` to + // Then again, that has the downside of not allowing `TableBuilder::encode` to // obtain a `&[u8]` entirely in safe code, for writing the bytes out. bytes: Vec, _marker: PhantomData<(fn(&I), T)>, } -impl Default for Table where Option: FixedSizeEncoding { +impl Default for TableBuilder where Option: FixedSizeEncoding { fn default() -> Self { - Table { + TableBuilder { bytes: vec![], _marker: PhantomData, } } } -impl Table where Option: FixedSizeEncoding { +impl TableBuilder where Option: FixedSizeEncoding { pub(super) fn set(&mut self, i: I, value: T) { // FIXME(eddyb) investigate more compact encodings for sparse tables. // On the PR @michaelwoerister mentioned: @@ -159,7 +165,7 @@ impl Table where Option: FixedSizeEncoding { Some(value).write_to_bytes_at(&mut self.bytes, i); } - pub(super) fn encode(&self, buf: &mut Encoder) -> Lazy { + pub(super) fn encode(&self, buf: &mut Encoder) -> Lazy> { let pos = buf.position(); buf.emit_raw_bytes(&self.bytes); Lazy::from_position_and_meta( -- cgit 1.4.1-3-g733a5