Skip to content

Commit bff28ec

Browse files
committed
refactor rustc_metadata to use CamelCase names and IndexVec
1 parent ea0dc92 commit bff28ec

File tree

9 files changed

+106
-97
lines changed

9 files changed

+106
-97
lines changed

src/librustc_data_structures/indexed_vec.rs

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ use std::marker::PhantomData;
1515
use std::ops::{Index, IndexMut, Range};
1616
use std::fmt;
1717
use std::vec;
18+
use std::u32;
1819

1920
use rustc_serialize as serialize;
2021

@@ -31,6 +32,11 @@ impl Idx for usize {
3132
fn index(self) -> usize { self }
3233
}
3334

35+
impl Idx for u32 {
36+
fn new(idx: usize) -> Self { assert!(idx <= u32::MAX as usize); idx as u32 }
37+
fn index(self) -> usize { self as usize }
38+
}
39+
3440
#[derive(Clone)]
3541
pub struct IndexVec<I: Idx, T> {
3642
pub raw: Vec<T>,

src/librustc_metadata/Cargo.toml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ rustc = { path = "../librustc" }
1616
rustc_back = { path = "../librustc_back" }
1717
rustc_bitflags = { path = "../librustc_bitflags" }
1818
rustc_const_math = { path = "../librustc_const_math" }
19+
rustc_data_structures = { path = "../librustc_data_structures" }
1920
rustc_errors = { path = "../librustc_errors" }
2021
rustc_llvm = { path = "../librustc_llvm" }
2122
serialize = { path = "../libserialize" }

src/librustc_metadata/astencode.rs

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -62,7 +62,7 @@ use rustc_serialize::{Encodable, EncoderHelpers};
6262

6363
struct DecodeContext<'a, 'b, 'tcx: 'a> {
6464
tcx: TyCtxt<'a, 'tcx, 'tcx>,
65-
cdata: &'b cstore::crate_metadata,
65+
cdata: &'b cstore::CrateMetadata,
6666
from_id_range: IdRange,
6767
to_id_range: IdRange,
6868
// Cache the last used filemap for translating spans as an optimization.
@@ -123,7 +123,7 @@ impl<'a, 'b, 'c, 'tcx> ast_map::FoldOps for &'a DecodeContext<'b, 'c, 'tcx> {
123123

124124
/// Decodes an item from its AST in the cdata's metadata and adds it to the
125125
/// ast-map.
126-
pub fn decode_inlined_item<'a, 'tcx>(cdata: &cstore::crate_metadata,
126+
pub fn decode_inlined_item<'a, 'tcx>(cdata: &cstore::CrateMetadata,
127127
tcx: TyCtxt<'a, 'tcx, 'tcx>,
128128
parent_def_path: ast_map::DefPath,
129129
parent_did: DefId,
@@ -248,7 +248,7 @@ impl<S:serialize::Encoder> def_id_encoder_helpers for S
248248
trait def_id_decoder_helpers {
249249
fn read_def_id(&mut self, dcx: &DecodeContext) -> DefId;
250250
fn read_def_id_nodcx(&mut self,
251-
cdata: &cstore::crate_metadata) -> DefId;
251+
cdata: &cstore::CrateMetadata) -> DefId;
252252
}
253253

254254
impl<D:serialize::Decoder> def_id_decoder_helpers for D
@@ -260,7 +260,7 @@ impl<D:serialize::Decoder> def_id_decoder_helpers for D
260260
}
261261

262262
fn read_def_id_nodcx(&mut self,
263-
cdata: &cstore::crate_metadata)
263+
cdata: &cstore::CrateMetadata)
264264
-> DefId {
265265
let did: DefId = Decodable::decode(self).unwrap();
266266
decoder::translate_def_id(cdata, did)
@@ -860,17 +860,17 @@ trait rbml_decoder_decoder_helpers<'tcx> {
860860
// Versions of the type reading functions that don't need the full
861861
// DecodeContext.
862862
fn read_ty_nodcx<'a>(&mut self, tcx: TyCtxt<'a, 'tcx, 'tcx>,
863-
cdata: &cstore::crate_metadata) -> Ty<'tcx>;
863+
cdata: &cstore::CrateMetadata) -> Ty<'tcx>;
864864
fn read_tys_nodcx<'a>(&mut self, tcx: TyCtxt<'a, 'tcx, 'tcx>,
865-
cdata: &cstore::crate_metadata) -> Vec<Ty<'tcx>>;
865+
cdata: &cstore::CrateMetadata) -> Vec<Ty<'tcx>>;
866866
fn read_substs_nodcx<'a>(&mut self, tcx: TyCtxt<'a, 'tcx, 'tcx>,
867-
cdata: &cstore::crate_metadata)
867+
cdata: &cstore::CrateMetadata)
868868
-> subst::Substs<'tcx>;
869869
}
870870

871871
impl<'a, 'tcx> rbml_decoder_decoder_helpers<'tcx> for reader::Decoder<'a> {
872872
fn read_ty_nodcx<'b>(&mut self, tcx: TyCtxt<'b, 'tcx, 'tcx>,
873-
cdata: &cstore::crate_metadata)
873+
cdata: &cstore::CrateMetadata)
874874
-> Ty<'tcx> {
875875
self.read_opaque(|_, doc| {
876876
Ok(
@@ -881,15 +881,15 @@ impl<'a, 'tcx> rbml_decoder_decoder_helpers<'tcx> for reader::Decoder<'a> {
881881
}
882882

883883
fn read_tys_nodcx<'b>(&mut self, tcx: TyCtxt<'b, 'tcx, 'tcx>,
884-
cdata: &cstore::crate_metadata) -> Vec<Ty<'tcx>> {
884+
cdata: &cstore::CrateMetadata) -> Vec<Ty<'tcx>> {
885885
self.read_to_vec(|this| Ok(this.read_ty_nodcx(tcx, cdata)) )
886886
.unwrap()
887887
.into_iter()
888888
.collect()
889889
}
890890

891891
fn read_substs_nodcx<'b>(&mut self, tcx: TyCtxt<'b, 'tcx, 'tcx>,
892-
cdata: &cstore::crate_metadata)
892+
cdata: &cstore::CrateMetadata)
893893
-> subst::Substs<'tcx>
894894
{
895895
self.read_opaque(|_, doc| {

src/librustc_metadata/creader.rs

Lines changed: 38 additions & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ use rustc::session::{config, Session};
2424
use rustc::session::config::PanicStrategy;
2525
use rustc::session::search_paths::PathKind;
2626
use rustc::middle::cstore::{CrateStore, validate_crate_name, ExternCrate};
27-
use rustc::util::nodemap::FnvHashMap;
27+
use rustc::util::nodemap::{FnvHashMap, FnvHashSet};
2828
use rustc::hir::map as hir_map;
2929

3030
use std::cell::{RefCell, Cell};
@@ -132,7 +132,7 @@ struct ExtensionCrate {
132132
}
133133

134134
enum PMDSource {
135-
Registered(Rc<cstore::crate_metadata>),
135+
Registered(Rc<cstore::CrateMetadata>),
136136
Owned(MetadataBlob),
137137
}
138138

@@ -294,7 +294,7 @@ impl<'a> CrateReader<'a> {
294294
span: Span,
295295
lib: loader::Library,
296296
explicitly_linked: bool)
297-
-> (ast::CrateNum, Rc<cstore::crate_metadata>,
297+
-> (ast::CrateNum, Rc<cstore::CrateMetadata>,
298298
cstore::CrateSource) {
299299
self.verify_rustc_version(name, span, &lib.metadata);
300300
self.verify_no_symbol_conflicts(span, &lib.metadata);
@@ -318,10 +318,10 @@ impl<'a> CrateReader<'a> {
318318

319319
let loader::Library { dylib, rlib, metadata } = lib;
320320

321-
let cnum_map = self.resolve_crate_deps(root, metadata.as_slice(), span);
321+
let cnum_map = self.resolve_crate_deps(root, metadata.as_slice(), cnum, span);
322322
let staged_api = self.is_staged_api(metadata.as_slice());
323323

324-
let cmeta = Rc::new(cstore::crate_metadata {
324+
let cmeta = Rc::new(cstore::CrateMetadata {
325325
name: name.to_string(),
326326
extern_crate: Cell::new(None),
327327
index: decoder::load_index(metadata.as_slice()),
@@ -364,7 +364,7 @@ impl<'a> CrateReader<'a> {
364364
span: Span,
365365
kind: PathKind,
366366
explicitly_linked: bool)
367-
-> (ast::CrateNum, Rc<cstore::crate_metadata>, cstore::CrateSource) {
367+
-> (ast::CrateNum, Rc<cstore::CrateMetadata>, cstore::CrateSource) {
368368
let result = match self.existing_match(name, hash, kind) {
369369
Some(cnum) => LoadResult::Previous(cnum),
370370
None => {
@@ -438,8 +438,11 @@ impl<'a> CrateReader<'a> {
438438

439439
fn update_extern_crate(&mut self,
440440
cnum: ast::CrateNum,
441-
mut extern_crate: ExternCrate)
441+
mut extern_crate: ExternCrate,
442+
visited: &mut FnvHashSet<(ast::CrateNum, bool)>)
442443
{
444+
if !visited.insert((cnum, extern_crate.direct)) { return }
445+
443446
let cmeta = self.cstore.get_crate_data(cnum);
444447
let old_extern_crate = cmeta.extern_crate.get();
445448

@@ -458,24 +461,24 @@ impl<'a> CrateReader<'a> {
458461
}
459462

460463
cmeta.extern_crate.set(Some(extern_crate));
461-
462464
// Propagate the extern crate info to dependencies.
463465
extern_crate.direct = false;
464-
for &dep_cnum in cmeta.cnum_map.borrow().values() {
465-
self.update_extern_crate(dep_cnum, extern_crate);
466+
for &dep_cnum in cmeta.cnum_map.borrow().iter() {
467+
self.update_extern_crate(dep_cnum, extern_crate, visited);
466468
}
467469
}
468470

469471
// Go through the crate metadata and load any crates that it references
470472
fn resolve_crate_deps(&mut self,
471473
root: &Option<CratePaths>,
472474
cdata: &[u8],
473-
span : Span)
474-
-> cstore::cnum_map {
475+
krate: ast::CrateNum,
476+
span: Span)
477+
-> cstore::CrateNumMap {
475478
debug!("resolving deps of external crate");
476479
// The map from crate numbers in the crate we're resolving to local crate
477480
// numbers
478-
decoder::get_crate_deps(cdata).iter().map(|dep| {
481+
let map: FnvHashMap<_, _> = decoder::get_crate_deps(cdata).iter().map(|dep| {
479482
debug!("resolving dep crate {} hash: `{}`", dep.name, dep.hash);
480483
let (local_cnum, _, _) = self.resolve_crate(root,
481484
&dep.name,
@@ -485,7 +488,13 @@ impl<'a> CrateReader<'a> {
485488
PathKind::Dependency,
486489
dep.explicitly_linked);
487490
(dep.cnum, local_cnum)
488-
}).collect()
491+
}).collect();
492+
493+
let max_cnum = map.values().cloned().max().unwrap_or(0);
494+
495+
// we map 0 and all other holes in the map to our parent crate. The "additional"
496+
// self-dependencies should be harmless.
497+
(0..max_cnum+1).map(|cnum| map.get(&cnum).cloned().unwrap_or(krate)).collect()
489498
}
490499

491500
fn read_extension_crate(&mut self, span: Span, info: &CrateInfo) -> ExtensionCrate {
@@ -826,7 +835,7 @@ impl<'a> CrateReader<'a> {
826835
fn inject_dependency_if(&self,
827836
krate: ast::CrateNum,
828837
what: &str,
829-
needs_dep: &Fn(&cstore::crate_metadata) -> bool) {
838+
needs_dep: &Fn(&cstore::CrateMetadata) -> bool) {
830839
// don't perform this validation if the session has errors, as one of
831840
// those errors may indicate a circular dependency which could cause
832841
// this to stack overflow.
@@ -837,7 +846,17 @@ impl<'a> CrateReader<'a> {
837846
// Before we inject any dependencies, make sure we don't inject a
838847
// circular dependency by validating that this crate doesn't
839848
// transitively depend on any crates satisfying `needs_dep`.
840-
validate(self, krate, krate, what, needs_dep);
849+
for dep in self.cstore.crate_dependencies_in_rpo(krate) {
850+
let data = self.cstore.get_crate_data(dep);
851+
if needs_dep(&data) {
852+
self.sess.err(&format!("the crate `{}` cannot depend \
853+
on a crate that needs {}, but \
854+
it depends on `{}`",
855+
self.cstore.get_crate_data(krate).name(),
856+
what,
857+
data.name()));
858+
}
859+
}
841860

842861
// All crates satisfying `needs_dep` do not explicitly depend on the
843862
// crate provided for this compile, but in order for this compilation to
@@ -849,32 +868,8 @@ impl<'a> CrateReader<'a> {
849868
}
850869

851870
info!("injecting a dep from {} to {}", cnum, krate);
852-
let mut cnum_map = data.cnum_map.borrow_mut();
853-
let remote_cnum = cnum_map.len() + 1;
854-
let prev = cnum_map.insert(remote_cnum as ast::CrateNum, krate);
855-
assert!(prev.is_none());
871+
data.cnum_map.borrow_mut().push(krate);
856872
});
857-
858-
fn validate(me: &CrateReader,
859-
krate: ast::CrateNum,
860-
root: ast::CrateNum,
861-
what: &str,
862-
needs_dep: &Fn(&cstore::crate_metadata) -> bool) {
863-
let data = me.cstore.get_crate_data(krate);
864-
if needs_dep(&data) {
865-
let krate_name = data.name();
866-
let data = me.cstore.get_crate_data(root);
867-
let root_name = data.name();
868-
me.sess.err(&format!("the crate `{}` cannot depend \
869-
on a crate that needs {}, but \
870-
it depends on `{}`", root_name, what,
871-
krate_name));
872-
}
873-
874-
for (_, &dep) in data.cnum_map.borrow().iter() {
875-
validate(me, dep, root, what, needs_dep);
876-
}
877-
}
878873
}
879874
}
880875

@@ -948,7 +943,8 @@ impl<'a> LocalCrateReader<'a> {
948943
span: i.span,
949944
direct: true,
950945
path_len: len,
951-
});
946+
},
947+
&mut FnvHashSet());
952948
self.cstore.add_extern_mod_stmt_cnum(info.id, cnum);
953949
}
954950
}

0 commit comments

Comments
 (0)