Skip to content

Commit 92386a7

Browse files
committed
metadata: Simplify interface of resolve_crate
1 parent 33c9ada commit 92386a7

File tree

3 files changed

+46
-60
lines changed

3 files changed

+46
-60
lines changed

src/librustc/middle/cstore.rs

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -148,9 +148,7 @@ pub enum ExternCrateSource {
148148
/// such ids
149149
DefId,
150150
),
151-
// Crate is loaded by `use`.
152-
Use,
153-
/// Crate is implicitly loaded by an absolute path.
151+
/// Crate is implicitly loaded by a path resolving through extern prelude.
154152
Path,
155153
}
156154

src/librustc_metadata/creader.rs

Lines changed: 40 additions & 52 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
33
use crate::cstore::{self, CStore, CrateSource, MetadataBlob};
44
use crate::locator::{self, CratePaths};
5-
use crate::schema::{CrateRoot};
5+
use crate::schema::{CrateRoot, CrateDep};
66
use rustc_data_structures::sync::{Lrc, RwLock, Lock};
77

88
use rustc::hir::def_id::CrateNum;
@@ -190,7 +190,7 @@ impl<'a> CrateLoader<'a> {
190190
fn register_crate(
191191
&mut self,
192192
host_lib: Option<Library>,
193-
root: &Option<CratePaths>,
193+
root: Option<&CratePaths>,
194194
span: Span,
195195
lib: Library,
196196
dep_kind: DepKind,
@@ -208,19 +208,20 @@ impl<'a> CrateLoader<'a> {
208208
// Claim this crate number and cache it
209209
let cnum = self.cstore.alloc_new_crate_num();
210210

211+
// Maintain a reference to the top most crate.
211212
// Stash paths for top-most crate locally if necessary.
212-
let crate_paths = if root.is_none() {
213-
Some(CratePaths {
213+
let crate_paths;
214+
let root = if let Some(root) = root {
215+
root
216+
} else {
217+
crate_paths = CratePaths {
214218
ident: crate_root.name.to_string(),
215219
dylib: lib.dylib.clone().map(|p| p.0),
216220
rlib: lib.rlib.clone().map(|p| p.0),
217221
rmeta: lib.rmeta.clone().map(|p| p.0),
218-
})
219-
} else {
220-
None
222+
};
223+
&crate_paths
221224
};
222-
// Maintain a reference to the top most crate.
223-
let root = if root.is_some() { root } else { &crate_paths };
224225

225226
let Library { dylib, rlib, rmeta, metadata } = lib;
226227
let cnum_map = self.resolve_crate_deps(root, &crate_root, &metadata, cnum, span, dep_kind);
@@ -336,15 +337,27 @@ impl<'a> CrateLoader<'a> {
336337

337338
fn resolve_crate<'b>(
338339
&'b mut self,
339-
root: &'b Option<CratePaths>,
340340
name: Symbol,
341-
hash: Option<&'b Svh>,
342-
extra_filename: Option<&'b str>,
343341
span: Span,
344-
path_kind: PathKind,
342+
dep_kind: DepKind,
343+
dep: Option<(&'b CratePaths, &'b CrateDep)>,
344+
) -> (CrateNum, Lrc<cstore::CrateMetadata>) {
345+
self.maybe_resolve_crate(name, span, dep_kind, dep).unwrap_or_else(|err| err.report())
346+
}
347+
348+
fn maybe_resolve_crate<'b>(
349+
&'b mut self,
350+
name: Symbol,
351+
span: Span,
345352
mut dep_kind: DepKind,
353+
dep: Option<(&'b CratePaths, &'b CrateDep)>,
346354
) -> Result<(CrateNum, Lrc<cstore::CrateMetadata>), LoadError<'b>> {
347355
info!("resolving crate `{}`", name);
356+
let (root, hash, extra_filename, path_kind) = match dep {
357+
Some((root, dep)) =>
358+
(Some(root), Some(&dep.hash), Some(&dep.extra_filename[..]), PathKind::Dependency),
359+
None => (None, None, None, PathKind::Crate),
360+
};
348361
let result = if let Some(cnum) = self.existing_match(name, hash, path_kind) {
349362
(LoadResult::Previous(cnum), None)
350363
} else {
@@ -463,7 +476,7 @@ impl<'a> CrateLoader<'a> {
463476

464477
// Go through the crate metadata and load any crates that it references
465478
fn resolve_crate_deps(&mut self,
466-
root: &Option<CratePaths>,
479+
root: &CratePaths,
467480
crate_root: &CrateRoot<'_>,
468481
metadata: &MetadataBlob,
469482
krate: CrateNum,
@@ -478,9 +491,7 @@ impl<'a> CrateLoader<'a> {
478491
// The map from crate numbers in the crate we're resolving to local crate numbers.
479492
// We map 0 and all other holes in the map to our parent crate. The "additional"
480493
// self-dependencies should be harmless.
481-
std::iter::once(krate).chain(crate_root.crate_deps
482-
.decode(metadata)
483-
.map(|dep| {
494+
std::iter::once(krate).chain(crate_root.crate_deps.decode(metadata).map(|dep| {
484495
info!("resolving dep crate {} hash: `{}` extra filename: `{}`", dep.name, dep.hash,
485496
dep.extra_filename);
486497
if dep.kind == DepKind::UnexportedMacrosOnly {
@@ -490,11 +501,7 @@ impl<'a> CrateLoader<'a> {
490501
DepKind::MacrosOnly => DepKind::MacrosOnly,
491502
_ => dep.kind,
492503
};
493-
let (local_cnum, ..) = self.resolve_crate(
494-
root, dep.name, Some(&dep.hash), Some(&dep.extra_filename), span,
495-
PathKind::Dependency, dep_kind,
496-
).unwrap_or_else(|err| err.report());
497-
local_cnum
504+
self.resolve_crate(dep.name, span, dep_kind, Some((root, &dep))).0
498505
})).collect()
499506
}
500507

@@ -513,7 +520,7 @@ impl<'a> CrateLoader<'a> {
513520
filesearch: self.sess.host_filesearch(PathKind::Crate),
514521
target: &self.sess.host,
515522
triple: host_triple,
516-
root: &None,
523+
root: None,
517524
rejected_via_hash: vec![],
518525
rejected_via_triple: vec![],
519526
rejected_via_kind: vec![],
@@ -693,10 +700,7 @@ impl<'a> CrateLoader<'a> {
693700
};
694701
info!("panic runtime not found -- loading {}", name);
695702

696-
let dep_kind = DepKind::Implicit;
697-
let (cnum, data) =
698-
self.resolve_crate(&None, name, None, None, DUMMY_SP, PathKind::Crate, dep_kind)
699-
.unwrap_or_else(|err| err.report());
703+
let (cnum, data) = self.resolve_crate(name, DUMMY_SP, DepKind::Implicit, None);
700704

701705
// Sanity check the loaded crate to ensure it is indeed a panic runtime
702706
// and the panic strategy is indeed what we thought it was.
@@ -792,20 +796,15 @@ impl<'a> CrateLoader<'a> {
792796
});
793797

794798
if uses_std {
795-
let name = match *sanitizer {
799+
let name = Symbol::intern(match sanitizer {
796800
Sanitizer::Address => "rustc_asan",
797801
Sanitizer::Leak => "rustc_lsan",
798802
Sanitizer::Memory => "rustc_msan",
799803
Sanitizer::Thread => "rustc_tsan",
800-
};
804+
});
801805
info!("loading sanitizer: {}", name);
802806

803-
let symbol = Symbol::intern(name);
804-
let dep_kind = DepKind::Explicit;
805-
let (_, data) =
806-
self.resolve_crate(&None, symbol, None, None, DUMMY_SP,
807-
PathKind::Crate, dep_kind)
808-
.unwrap_or_else(|err| err.report());
807+
let data = self.resolve_crate(name, DUMMY_SP, DepKind::Explicit, None).1;
809808

810809
// Sanity check the loaded crate to ensure it is indeed a sanitizer runtime
811810
if !data.root.sanitizer_runtime {
@@ -824,12 +823,8 @@ impl<'a> CrateLoader<'a> {
824823
{
825824
info!("loading profiler");
826825

827-
let symbol = Symbol::intern("profiler_builtins");
828-
let dep_kind = DepKind::Implicit;
829-
let (_, data) =
830-
self.resolve_crate(&None, symbol, None, None, DUMMY_SP,
831-
PathKind::Crate, dep_kind)
832-
.unwrap_or_else(|err| err.report());
826+
let name = Symbol::intern("profiler_builtins");
827+
let data = self.resolve_crate(name, DUMMY_SP, DepKind::Implicit, None).1;
833828

834829
// Sanity check the loaded crate to ensure it is indeed a profiler runtime
835830
if !data.root.profiler_runtime {
@@ -996,7 +991,7 @@ impl<'a> CrateLoader<'a> {
996991
ast::ItemKind::ExternCrate(orig_name) => {
997992
debug!("resolving extern crate stmt. ident: {} orig_name: {:?}",
998993
item.ident, orig_name);
999-
let orig_name = match orig_name {
994+
let name = match orig_name {
1000995
Some(orig_name) => {
1001996
crate::validate_crate_name(Some(self.sess), &orig_name.as_str(),
1002997
Some(item.span));
@@ -1010,10 +1005,7 @@ impl<'a> CrateLoader<'a> {
10101005
DepKind::Explicit
10111006
};
10121007

1013-
let (cnum, ..) = self.resolve_crate(
1014-
&None, orig_name, None, None,
1015-
item.span, PathKind::Crate, dep_kind,
1016-
).unwrap_or_else(|err| err.report());
1008+
let cnum = self.resolve_crate(name, item.span, dep_kind, None).0;
10171009

10181010
let def_id = definitions.opt_local_def_id(item.id).unwrap();
10191011
let path_len = definitions.def_path(def_id.index).data.len();
@@ -1039,9 +1031,7 @@ impl<'a> CrateLoader<'a> {
10391031
name: Symbol,
10401032
span: Span,
10411033
) -> CrateNum {
1042-
let cnum = self.resolve_crate(
1043-
&None, name, None, None, span, PathKind::Crate, DepKind::Explicit
1044-
).unwrap_or_else(|err| err.report()).0;
1034+
let cnum = self.resolve_crate(name, span, DepKind::Explicit, None).0;
10451035

10461036
self.update_extern_crate(
10471037
cnum,
@@ -1063,9 +1053,7 @@ impl<'a> CrateLoader<'a> {
10631053
name: Symbol,
10641054
span: Span,
10651055
) -> Option<CrateNum> {
1066-
let cnum = self.resolve_crate(
1067-
&None, name, None, None, span, PathKind::Crate, DepKind::Explicit
1068-
).ok()?.0;
1056+
let cnum = self.maybe_resolve_crate(name, span, DepKind::Explicit, None).ok()?.0;
10691057

10701058
self.update_extern_crate(
10711059
cnum,

src/librustc_metadata/locator.rs

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -261,7 +261,7 @@ pub struct Context<'a> {
261261
pub target: &'a Target,
262262
pub triple: TargetTriple,
263263
pub filesearch: FileSearch<'a>,
264-
pub root: &'a Option<CratePaths>,
264+
pub root: Option<&'a CratePaths>,
265265
pub rejected_via_hash: Vec<CrateMismatch>,
266266
pub rejected_via_triple: Vec<CrateMismatch>,
267267
pub rejected_via_kind: Vec<CrateMismatch>,
@@ -322,8 +322,8 @@ impl<'a> Context<'a> {
322322

323323
pub fn report_errs(self) -> ! {
324324
let add = match self.root {
325-
&None => String::new(),
326-
&Some(ref r) => format!(" which `{}` depends on", r.ident),
325+
None => String::new(),
326+
Some(r) => format!(" which `{}` depends on", r.ident),
327327
};
328328
let mut msg = "the following crate versions were found:".to_string();
329329
let mut err = if !self.rejected_via_hash.is_empty() {
@@ -339,8 +339,8 @@ impl<'a> Context<'a> {
339339
msg.push_str(&format!("\ncrate `{}`: {}", self.crate_name, path.display()));
340340
}
341341
match self.root {
342-
&None => {}
343-
&Some(ref r) => {
342+
None => {}
343+
Some(r) => {
344344
for path in r.paths().iter() {
345345
msg.push_str(&format!("\ncrate `{}`: {}", r.ident, path.display()));
346346
}

0 commit comments

Comments
 (0)