diff options
| -rw-r--r-- | src/librustc_metadata/creader.rs | 14 | ||||
| -rw-r--r-- | src/librustc_metadata/locator.rs | 7 | ||||
| -rw-r--r-- | src/librustc_metadata/rmeta/decoder.rs | 26 | ||||
| -rw-r--r-- | src/librustc_metadata/rmeta/mod.rs | 11 |
4 files changed, 36 insertions, 22 deletions
diff --git a/src/librustc_metadata/creader.rs b/src/librustc_metadata/creader.rs index 0511d83e33d..a721e381b4e 100644 --- a/src/librustc_metadata/creader.rs +++ b/src/librustc_metadata/creader.rs @@ -213,7 +213,7 @@ impl<'a> CrateLoader<'a> { let cnum_map = self.resolve_crate_deps(root, &crate_root, &metadata, cnum, span, dep_kind); - let raw_proc_macros = crate_root.proc_macro_data.map(|_| { + let raw_proc_macros = if crate_root.is_proc_macro_crate() { let temp_root; let (dlsym_source, dlsym_root) = match &host_lib { Some(host_lib) => @@ -221,8 +221,10 @@ impl<'a> CrateLoader<'a> { None => (&source, &crate_root), }; let dlsym_dylib = dlsym_source.dylib.as_ref().expect("no dylib for a proc-macro crate"); - self.dlsym_proc_macros(&dlsym_dylib.0, dlsym_root.disambiguator, span) - }); + Some(self.dlsym_proc_macros(&dlsym_dylib.0, dlsym_root.disambiguator, span)) + } else { + None + }; self.cstore.set_crate_data(cnum, CrateMetadata::new( self.sess, @@ -348,7 +350,7 @@ impl<'a> CrateLoader<'a> { match result { (LoadResult::Previous(cnum), None) => { let data = self.cstore.get_crate_data(cnum); - if data.root.proc_macro_data.is_some() { + if data.root.is_proc_macro_crate() { dep_kind = DepKind::UnexportedMacrosOnly; } data.dep_kind.with_lock(|data_dep_kind| { @@ -441,14 +443,14 @@ impl<'a> CrateLoader<'a> { dep_kind: DepKind) -> CrateNumMap { debug!("resolving deps of external crate"); - if crate_root.proc_macro_data.is_some() { + if crate_root.is_proc_macro_crate() { return CrateNumMap::new(); } // The map from crate numbers in the crate we're resolving to local crate numbers. // We map 0 and all other holes in the map to our parent crate. The "additional" // self-dependencies should be harmless. - std::iter::once(krate).chain(crate_root.crate_deps.decode(metadata).map(|dep| { + std::iter::once(krate).chain(crate_root.decode_crate_deps(metadata).map(|dep| { info!("resolving dep crate {} hash: `{}` extra filename: `{}`", dep.name, dep.hash, dep.extra_filename); if dep.kind == DepKind::UnexportedMacrosOnly { diff --git a/src/librustc_metadata/locator.rs b/src/librustc_metadata/locator.rs index d28f00b9168..58661292b27 100644 --- a/src/librustc_metadata/locator.rs +++ b/src/librustc_metadata/locator.rs @@ -768,10 +768,11 @@ impl<'a> CrateLocator<'a> { } let root = metadata.get_root(); - if let Some(is_proc_macro) = self.is_proc_macro { - if root.proc_macro_data.is_some() != is_proc_macro { + if let Some(expected_is_proc_macro) = self.is_proc_macro { + let is_proc_macro = root.is_proc_macro_crate(); + if is_proc_macro != expected_is_proc_macro { info!("Rejecting via proc macro: expected {} got {}", - is_proc_macro, root.proc_macro_data.is_some()); + expected_is_proc_macro, is_proc_macro); return None; } } diff --git a/src/librustc_metadata/rmeta/decoder.rs b/src/librustc_metadata/rmeta/decoder.rs index 30b60b6ed67..5ba587944a3 100644 --- a/src/librustc_metadata/rmeta/decoder.rs +++ b/src/librustc_metadata/rmeta/decoder.rs @@ -126,7 +126,7 @@ struct ImportedSourceFile { translated_source_file: Lrc<syntax_pos::SourceFile>, } -crate struct DecodeContext<'a, 'tcx> { +pub(super) struct DecodeContext<'a, 'tcx> { opaque: opaque::Decoder<'a>, cdata: Option<&'a CrateMetadata>, sess: Option<&'tcx Session>, @@ -142,7 +142,7 @@ crate struct DecodeContext<'a, 'tcx> { } /// Abstract over the various ways one can create metadata decoders. -crate trait Metadata<'a, 'tcx>: Copy { +pub(super) trait Metadata<'a, 'tcx>: Copy { fn raw_bytes(self) -> &'a [u8]; fn cdata(self) -> Option<&'a CrateMetadata> { None } fn sess(self) -> Option<&'tcx Session> { None } @@ -218,7 +218,7 @@ impl<'a, 'tcx> Metadata<'a, 'tcx> for (&'a CrateMetadata, TyCtxt<'tcx>) { } impl<'a, 'tcx, T: Encodable + Decodable> Lazy<T> { - crate fn decode<M: Metadata<'a, 'tcx>>(self, metadata: M) -> T { + fn decode<M: Metadata<'a, 'tcx>>(self, metadata: M) -> T { let mut dcx = metadata.decoder(self.position.get()); dcx.lazy_state = LazyState::NodeStart(self.position); T::decode(&mut dcx).unwrap() @@ -226,7 +226,7 @@ impl<'a, 'tcx, T: Encodable + Decodable> Lazy<T> { } impl<'a: 'x, 'tcx: 'x, 'x, T: Encodable + Decodable> Lazy<[T]> { - crate fn decode<M: Metadata<'a, 'tcx>>( + fn decode<M: Metadata<'a, 'tcx>>( self, metadata: M, ) -> impl ExactSizeIterator<Item = T> + Captures<'a> + Captures<'tcx> + 'x { @@ -553,6 +553,19 @@ impl<'tcx> EntryKind<'tcx> { } } +impl CrateRoot<'_> { + crate fn is_proc_macro_crate(&self) -> bool { + self.proc_macro_data.is_some() + } + + crate fn decode_crate_deps( + &self, + metadata: &'a MetadataBlob, + ) -> impl ExactSizeIterator<Item = CrateDep> + Captures<'a> { + self.crate_deps.decode(metadata) + } +} + impl<'a, 'tcx> CrateMetadata { crate fn new( sess: &Session, @@ -595,12 +608,11 @@ impl<'a, 'tcx> CrateMetadata { } fn is_proc_macro_crate(&self) -> bool { - self.root.proc_macro_decls_static.is_some() + self.root.is_proc_macro_crate() } fn is_proc_macro(&self, id: DefIndex) -> bool { - self.is_proc_macro_crate() && - self.root.proc_macro_data.unwrap().decode(self).find(|x| *x == id).is_some() + self.root.proc_macro_data.and_then(|data| data.decode(self).find(|x| *x == id)).is_some() } fn maybe_kind(&self, item_id: DefIndex) -> Option<EntryKind<'tcx>> { diff --git a/src/librustc_metadata/rmeta/mod.rs b/src/librustc_metadata/rmeta/mod.rs index 1dba07ccc62..cb780414f15 100644 --- a/src/librustc_metadata/rmeta/mod.rs +++ b/src/librustc_metadata/rmeta/mod.rs @@ -51,7 +51,7 @@ crate const METADATA_HEADER: &[u8; 8] = /// Additional metadata for a `Lazy<T>` where `T` may not be `Sized`, /// e.g. for `Lazy<[T]>`, this is the length (count of `T` values). -crate trait LazyMeta { +trait LazyMeta { type Meta: Copy + 'static; /// Returns the minimum encoded size. @@ -105,7 +105,7 @@ impl<T: Encodable> LazyMeta for [T] { #[must_use] // FIXME(#59875) the `Meta` parameter only exists to dodge // invariance wrt `T` (coming from the `meta: T::Meta` field). -crate struct Lazy<T, Meta = <T as LazyMeta>::Meta> +struct Lazy<T, Meta = <T as LazyMeta>::Meta> where T: ?Sized + LazyMeta<Meta = Meta>, Meta: 'static + Copy, { @@ -188,7 +188,7 @@ crate struct CrateRoot<'tcx> { proc_macro_decls_static: Option<DefIndex>, proc_macro_stability: Option<attr::Stability>, - pub crate_deps: Lazy<[CrateDep]>, + crate_deps: Lazy<[CrateDep]>, dylib_dependency_formats: Lazy<[Option<LinkagePreference>]>, lib_features: Lazy<[(Symbol, Option<Symbol>)]>, lang_items: Lazy<[(DefIndex, usize)]>, @@ -204,9 +204,8 @@ crate struct CrateRoot<'tcx> { per_def: LazyPerDefTables<'tcx>, - /// The DefIndex's of any proc macros delcared by - /// this crate - pub proc_macro_data: Option<Lazy<[DefIndex]>>, + /// The DefIndex's of any proc macros delcared by this crate. + proc_macro_data: Option<Lazy<[DefIndex]>>, compiler_builtins: bool, pub needs_allocator: bool, |
