diff options
| author | bors <bors@rust-lang.org> | 2018-01-03 12:59:52 +0000 |
|---|---|---|
| committer | bors <bors@rust-lang.org> | 2018-01-03 12:59:52 +0000 |
| commit | 8d1a30289ea13c433a92e31627f8533350835328 (patch) | |
| tree | 5b42008120db934061437bb27bb7991f1d989f1a | |
| parent | b107f720e5422bff4fa0671e54ff5458f682f603 (diff) | |
| parent | 2c69473222d1063e02fb1197086af03c0a41fe4a (diff) | |
| download | rust-8d1a30289ea13c433a92e31627f8533350835328.tar.gz rust-8d1a30289ea13c433a92e31627f8533350835328.zip | |
Auto merge of #46913 - Eh2406:master, r=eddyb
CStore switch FxHashMap to IndexVec This is a first attempt to fix #46876.
| -rw-r--r-- | src/librustc_metadata/cstore.rs | 25 |
1 files changed, 17 insertions, 8 deletions
diff --git a/src/librustc_metadata/cstore.rs b/src/librustc_metadata/cstore.rs index 87e41cae60d..f3d0b38cfc0 100644 --- a/src/librustc_metadata/cstore.rs +++ b/src/librustc_metadata/cstore.rs @@ -91,7 +91,7 @@ pub struct CrateMetadata { } pub struct CStore { - metas: RefCell<FxHashMap<CrateNum, Rc<CrateMetadata>>>, + metas: RefCell<IndexVec<CrateNum, Option<Rc<CrateMetadata>>>>, /// Map from NodeId's of local extern crate statements to crate numbers extern_mod_crate_map: RefCell<NodeMap<CrateNum>>, pub metadata_loader: Box<MetadataLoader>, @@ -100,7 +100,7 @@ pub struct CStore { impl CStore { pub fn new(metadata_loader: Box<MetadataLoader>) -> CStore { CStore { - metas: RefCell::new(FxHashMap()), + metas: RefCell::new(IndexVec::new()), extern_mod_crate_map: RefCell::new(FxHashMap()), metadata_loader, } @@ -111,18 +111,25 @@ impl CStore { } pub fn get_crate_data(&self, cnum: CrateNum) -> Rc<CrateMetadata> { - self.metas.borrow().get(&cnum).unwrap().clone() + self.metas.borrow()[cnum].clone().unwrap() } pub fn set_crate_data(&self, cnum: CrateNum, data: Rc<CrateMetadata>) { - self.metas.borrow_mut().insert(cnum, data); + use rustc_data_structures::indexed_vec::Idx; + let mut met = self.metas.borrow_mut(); + while met.len() <= cnum.index() { + met.push(None); + } + met[cnum] = Some(data); } pub fn iter_crate_data<I>(&self, mut i: I) where I: FnMut(CrateNum, &Rc<CrateMetadata>) { - for (&k, v) in self.metas.borrow().iter() { - i(k, v); + for (k, v) in self.metas.borrow().iter_enumerated() { + if let &Some(ref v) = v { + i(k, v); + } } } @@ -150,8 +157,10 @@ impl CStore { pub fn do_postorder_cnums_untracked(&self) -> Vec<CrateNum> { let mut ordering = Vec::new(); - for (&num, _) in self.metas.borrow().iter() { - self.push_dependencies_in_postorder(&mut ordering, num); + for (num, v) in self.metas.borrow().iter_enumerated() { + if let &Some(_) = v { + self.push_dependencies_in_postorder(&mut ordering, num); + } } return ordering } |
