Skip to content

Commit 8d1a302

Browse files
committed
Auto merge of #46913 - Eh2406:master, r=eddyb
CStore switch FxHashMap to IndexVec This is a first attempt to fix #46876.
2 parents b107f72 + 2c69473 commit 8d1a302

File tree

1 file changed

+17
-8
lines changed

1 file changed

+17
-8
lines changed

src/librustc_metadata/cstore.rs

+17-8
Original file line numberDiff line numberDiff line change
@@ -91,7 +91,7 @@ pub struct CrateMetadata {
9191
}
9292

9393
pub struct CStore {
94-
metas: RefCell<FxHashMap<CrateNum, Rc<CrateMetadata>>>,
94+
metas: RefCell<IndexVec<CrateNum, Option<Rc<CrateMetadata>>>>,
9595
/// Map from NodeId's of local extern crate statements to crate numbers
9696
extern_mod_crate_map: RefCell<NodeMap<CrateNum>>,
9797
pub metadata_loader: Box<MetadataLoader>,
@@ -100,7 +100,7 @@ pub struct CStore {
100100
impl CStore {
101101
pub fn new(metadata_loader: Box<MetadataLoader>) -> CStore {
102102
CStore {
103-
metas: RefCell::new(FxHashMap()),
103+
metas: RefCell::new(IndexVec::new()),
104104
extern_mod_crate_map: RefCell::new(FxHashMap()),
105105
metadata_loader,
106106
}
@@ -111,18 +111,25 @@ impl CStore {
111111
}
112112

113113
pub fn get_crate_data(&self, cnum: CrateNum) -> Rc<CrateMetadata> {
114-
self.metas.borrow().get(&cnum).unwrap().clone()
114+
self.metas.borrow()[cnum].clone().unwrap()
115115
}
116116

117117
pub fn set_crate_data(&self, cnum: CrateNum, data: Rc<CrateMetadata>) {
118-
self.metas.borrow_mut().insert(cnum, data);
118+
use rustc_data_structures::indexed_vec::Idx;
119+
let mut met = self.metas.borrow_mut();
120+
while met.len() <= cnum.index() {
121+
met.push(None);
122+
}
123+
met[cnum] = Some(data);
119124
}
120125

121126
pub fn iter_crate_data<I>(&self, mut i: I)
122127
where I: FnMut(CrateNum, &Rc<CrateMetadata>)
123128
{
124-
for (&k, v) in self.metas.borrow().iter() {
125-
i(k, v);
129+
for (k, v) in self.metas.borrow().iter_enumerated() {
130+
if let &Some(ref v) = v {
131+
i(k, v);
132+
}
126133
}
127134
}
128135

@@ -150,8 +157,10 @@ impl CStore {
150157

151158
pub fn do_postorder_cnums_untracked(&self) -> Vec<CrateNum> {
152159
let mut ordering = Vec::new();
153-
for (&num, _) in self.metas.borrow().iter() {
154-
self.push_dependencies_in_postorder(&mut ordering, num);
160+
for (num, v) in self.metas.borrow().iter_enumerated() {
161+
if let &Some(_) = v {
162+
self.push_dependencies_in_postorder(&mut ordering, num);
163+
}
155164
}
156165
return ordering
157166
}

0 commit comments

Comments
 (0)