Skip to content

Commit e241485

Browse files
committed
rustc_metadata: Privatize CrateMetadata::extern_crate
1 parent 37304cd commit e241485

File tree

3 files changed

+23
-31
lines changed

3 files changed

+23
-31
lines changed

src/librustc/middle/cstore.rs

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -146,6 +146,13 @@ impl ExternCrate {
146146
pub fn is_direct(&self) -> bool {
147147
self.dependency_of == LOCAL_CRATE
148148
}
149+
150+
pub fn rank(&self) -> impl PartialOrd {
151+
// Prefer:
152+
// - direct extern crate to indirect
153+
// - shorter paths to longer
154+
(self.is_direct(), !self.path_len)
155+
}
149156
}
150157

151158
#[derive(Copy, Clone, Debug, HashStable)]

src/librustc_metadata/creader.rs

Lines changed: 6 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -400,36 +400,12 @@ impl<'a> CrateLoader<'a> {
400400
if !visited.insert((cnum, extern_crate.is_direct())) { return }
401401

402402
let cmeta = self.cstore.get_crate_data(cnum);
403-
let mut old_extern_crate = cmeta.extern_crate.borrow_mut();
404-
405-
// Prefer:
406-
// - something over nothing (tuple.0);
407-
// - direct extern crate to indirect (tuple.1);
408-
// - shorter paths to longer (tuple.2).
409-
let new_rank = (
410-
true,
411-
extern_crate.is_direct(),
412-
cmp::Reverse(extern_crate.path_len),
413-
);
414-
let old_rank = match *old_extern_crate {
415-
None => (false, false, cmp::Reverse(usize::max_value())),
416-
Some(ref c) => (
417-
true,
418-
c.is_direct(),
419-
cmp::Reverse(c.path_len),
420-
),
421-
};
422-
if old_rank >= new_rank {
423-
return; // no change needed
424-
}
425-
426-
*old_extern_crate = Some(extern_crate);
427-
drop(old_extern_crate);
428-
429-
// Propagate the extern crate info to dependencies.
430-
extern_crate.dependency_of = cnum;
431-
for &dep_cnum in cmeta.dependencies().iter() {
432-
self.update_extern_crate(dep_cnum, extern_crate, visited);
403+
if cmeta.update_extern_crate(extern_crate) {
404+
// Propagate the extern crate info to dependencies.
405+
extern_crate.dependency_of = cnum;
406+
for &dep_cnum in cmeta.dependencies().iter() {
407+
self.update_extern_crate(dep_cnum, extern_crate, visited);
408+
}
433409
}
434410
}
435411

src/librustc_metadata/rmeta/decoder.rs

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -112,7 +112,7 @@ crate struct CrateMetadata {
112112

113113
/// Information about the `extern crate` item or path that caused this crate to be loaded.
114114
/// If this is `None`, then the crate was injected (e.g., by the allocator).
115-
crate extern_crate: Lock<Option<ExternCrate>>,
115+
extern_crate: Lock<Option<ExternCrate>>,
116116
}
117117

118118
/// Holds information about a syntax_pos::SourceFile imported from another crate.
@@ -1525,6 +1525,15 @@ impl<'a, 'tcx> CrateMetadata {
15251525
crate fn add_dependency(&self, cnum: CrateNum) {
15261526
self.dependencies.borrow_mut().push(cnum);
15271527
}
1528+
1529+
crate fn update_extern_crate(&self, new_extern_crate: ExternCrate) -> bool {
1530+
let mut extern_crate = self.extern_crate.borrow_mut();
1531+
let update = Some(new_extern_crate.rank()) > extern_crate.as_ref().map(ExternCrate::rank);
1532+
if update {
1533+
*extern_crate = Some(new_extern_crate);
1534+
}
1535+
update
1536+
}
15281537
}
15291538

15301539
// Cannot be implemented on 'ProcMacro', as libproc_macro

0 commit comments

Comments
 (0)