about summary refs log tree commit diff
diff options
context:
space:
mode:
authorbors <bors@rust-lang.org>2018-01-03 12:59:52 +0000
committerbors <bors@rust-lang.org>2018-01-03 12:59:52 +0000
commit8d1a30289ea13c433a92e31627f8533350835328 (patch)
tree5b42008120db934061437bb27bb7991f1d989f1a
parentb107f720e5422bff4fa0671e54ff5458f682f603 (diff)
parent2c69473222d1063e02fb1197086af03c0a41fe4a (diff)
downloadrust-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.rs25
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
     }