Skip to content

Commit 6f9bfda

Browse files
committed
update_extern_crate belongs to CrateMetadata
This also allows us to make extern_crate field private
1 parent 69a021f commit 6f9bfda

File tree

3 files changed

+67
-58
lines changed

3 files changed

+67
-58
lines changed

Diff for: src/librustc_metadata/creader.rs

+8-45
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ use rustc::hir::map::Definitions;
1818
use rustc::hir::def_id::LOCAL_CRATE;
1919

2020
use std::path::Path;
21-
use std::{cmp, fs};
21+
use std::fs;
2222

2323
use syntax::ast;
2424
use syntax::attr;
@@ -412,47 +412,6 @@ impl<'a> CrateLoader<'a> {
412412
}
413413
}
414414

415-
fn update_extern_crate(&self,
416-
cnum: CrateNum,
417-
mut extern_crate: ExternCrate,
418-
visited: &mut FxHashSet<(CrateNum, bool)>)
419-
{
420-
if !visited.insert((cnum, extern_crate.is_direct())) { return }
421-
422-
let cmeta = self.cstore.get_crate_data(cnum);
423-
let mut old_extern_crate = cmeta.extern_crate.borrow_mut();
424-
425-
// Prefer:
426-
// - something over nothing (tuple.0);
427-
// - direct extern crate to indirect (tuple.1);
428-
// - shorter paths to longer (tuple.2).
429-
let new_rank = (
430-
true,
431-
extern_crate.is_direct(),
432-
cmp::Reverse(extern_crate.path_len),
433-
);
434-
let old_rank = match *old_extern_crate {
435-
None => (false, false, cmp::Reverse(usize::max_value())),
436-
Some(ref c) => (
437-
true,
438-
c.is_direct(),
439-
cmp::Reverse(c.path_len),
440-
),
441-
};
442-
if old_rank >= new_rank {
443-
return; // no change needed
444-
}
445-
446-
*old_extern_crate = Some(extern_crate);
447-
drop(old_extern_crate);
448-
449-
// Propagate the extern crate info to dependencies.
450-
extern_crate.dependency_of = cnum;
451-
for &dep_cnum in cmeta.dependencies.borrow().iter() {
452-
self.update_extern_crate(dep_cnum, extern_crate, visited);
453-
}
454-
}
455-
456415
// Go through the crate metadata and load any crates that it references
457416
fn resolve_crate_deps(&mut self,
458417
root: &CratePaths,
@@ -889,7 +848,9 @@ impl<'a> CrateLoader<'a> {
889848

890849
let def_id = definitions.opt_local_def_id(item.id).unwrap();
891850
let path_len = definitions.def_path(def_id.index).data.len();
892-
self.update_extern_crate(
851+
852+
let cmeta = self.cstore.get_crate_data(cnum);
853+
cmeta.update_extern_crate(
893854
cnum,
894855
ExternCrate {
895856
src: ExternCrateSource::Extern(def_id),
@@ -908,7 +869,8 @@ impl<'a> CrateLoader<'a> {
908869
pub fn process_path_extern(&mut self, name: Symbol, span: Span) -> CrateNum {
909870
let cnum = self.resolve_crate(name, span, DepKind::Explicit, None);
910871

911-
self.update_extern_crate(
872+
let cmeta = self.cstore.get_crate_data(cnum);
873+
cmeta.update_extern_crate(
912874
cnum,
913875
ExternCrate {
914876
src: ExternCrateSource::Path,
@@ -926,7 +888,8 @@ impl<'a> CrateLoader<'a> {
926888
pub fn maybe_process_path_extern(&mut self, name: Symbol, span: Span) -> Option<CrateNum> {
927889
let cnum = self.maybe_resolve_crate(name, span, DepKind::Explicit, None).ok()?;
928890

929-
self.update_extern_crate(
891+
let cmeta = self.cstore.get_crate_data(cnum);
892+
cmeta.update_extern_crate(
930893
cnum,
931894
ExternCrate {
932895
src: ExternCrateSource::Path,

Diff for: src/librustc_metadata/cstore.rs

+57-2
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ use rustc::middle::cstore::{
1616
use rustc::middle::exported_symbols::{ExportedSymbol, SymbolExportLevel};
1717
use rustc::mir::{Body, Promoted};
1818
use rustc::mir::interpret::AllocDecodingState;
19-
use rustc::util::nodemap::FxHashMap;
19+
use rustc::util::nodemap::{FxHashMap, FxHashSet};
2020
use rustc::session::Session;
2121
use rustc::ty::{self, Ty, TyCtxt};
2222
use rustc_data_structures::sync::{Lrc, Lock, MetadataRef, Once, AtomicCell};
@@ -110,7 +110,7 @@ crate struct CrateMetadata {
110110

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

116116
impl<'a, 'tcx> CrateMetadata {
@@ -464,6 +464,61 @@ impl<'a, 'tcx> CrateMetadata {
464464
});
465465
}
466466

467+
crate fn get_extern_crate_arenas(&self, tcx: TyCtxt<'tcx>) -> Option<&'tcx ExternCrate> {
468+
let r = *self.extern_crate.lock();
469+
r.map(|c| &*tcx.arena.alloc(c))
470+
}
471+
472+
crate fn is_extern_crate_direct(&self) -> bool {
473+
match *self.extern_crate.borrow() {
474+
Some(extern_crate) if !extern_crate.is_direct() => true,
475+
_ => false,
476+
}
477+
}
478+
479+
// let cmeta = self.cstore.get_crate_data(cnum);
480+
crate fn update_extern_crate(
481+
&self,
482+
cnum: CrateNum,
483+
mut extern_crate: ExternCrate,
484+
visited: &mut FxHashSet<(CrateNum, bool)>,
485+
) {
486+
if !visited.insert((cnum, extern_crate.is_direct())) { return }
487+
488+
let mut old_extern_crate = self.extern_crate.borrow_mut();
489+
490+
// Prefer:
491+
// - something over nothing (tuple.0);
492+
// - direct extern crate to indirect (tuple.1);
493+
// - shorter paths to longer (tuple.2).
494+
let new_rank = (
495+
true,
496+
extern_crate.is_direct(),
497+
cmp::Reverse(extern_crate.path_len),
498+
);
499+
let old_rank = match *old_extern_crate {
500+
None => (false, false, cmp::Reverse(usize::max_value())),
501+
Some(ref c) => (
502+
true,
503+
c.is_direct(),
504+
cmp::Reverse(c.path_len),
505+
),
506+
};
507+
if old_rank >= new_rank {
508+
return; // no change needed
509+
}
510+
511+
*old_extern_crate = Some(extern_crate);
512+
drop(old_extern_crate);
513+
514+
// Propagate the extern crate info to dependencies.
515+
extern_crate.dependency_of = cnum;
516+
for &dep_cnum in self.dependencies.borrow().iter() {
517+
self.update_extern_crate(dep_cnum, extern_crate, visited);
518+
}
519+
}
520+
521+
467522
/// Iterates over the diagnostic items in the given crate.
468523
crate fn get_diagnostic_items(
469524
&self,

Diff for: src/librustc_metadata/cstore_impl.rs

+2-11
Original file line numberDiff line numberDiff line change
@@ -160,10 +160,7 @@ provide! { <'tcx> tcx, def_id, other, cdata,
160160
is_sanitizer_runtime => { cdata.root.sanitizer_runtime }
161161
is_profiler_runtime => { cdata.root.profiler_runtime }
162162
panic_strategy => { cdata.root.panic_strategy }
163-
extern_crate => {
164-
let r = *cdata.extern_crate.lock();
165-
r.map(|c| &*tcx.arena.alloc(c))
166-
}
163+
extern_crate => { cdata.get_extern_crate_arenas(tcx) }
167164
is_no_builtins => { cdata.root.no_builtins }
168165
symbol_mangling_version => { cdata.root.symbol_mangling_version }
169166
impl_defaultness => { cdata.get_impl_defaultness(def_id.index) }
@@ -223,13 +220,7 @@ provide! { <'tcx> tcx, def_id, other, cdata,
223220
diagnostic_items => { cdata.get_diagnostic_items(tcx) }
224221
missing_lang_items => { cdata.get_missing_lang_items(tcx) }
225222

226-
missing_extern_crate_item => {
227-
let r = match *cdata.extern_crate.borrow() {
228-
Some(extern_crate) if !extern_crate.is_direct() => true,
229-
_ => false,
230-
};
231-
r
232-
}
223+
missing_extern_crate_item => { cdata.is_extern_crate_direct() }
233224

234225
used_crate_source => { Lrc::new(cdata.source.clone()) }
235226

0 commit comments

Comments
 (0)