Skip to content

Commit 335e25f

Browse files
incr.comp.: Don't keep RefCells in on-disk-cache borrowed in order to allow for recursive invocations.
1 parent 4d2d3fc commit 335e25f

File tree

1 file changed

+19
-15
lines changed

1 file changed

+19
-15
lines changed

src/librustc/ty/maps/on_disk_cache.rs

+19-15
Original file line numberDiff line numberDiff line change
@@ -347,22 +347,21 @@ impl<'sess> OnDiskCache<'sess> {
347347
return None
348348
};
349349

350-
let mut cnum_map = self.cnum_map.borrow_mut();
351-
if cnum_map.is_none() {
350+
// Initialize the cnum_map if it is not initialized yet.
351+
if self.cnum_map.borrow().is_none() {
352+
let mut cnum_map = self.cnum_map.borrow_mut();
352353
*cnum_map = Some(Self::compute_cnum_map(tcx, &self.prev_cnums[..]));
353354
}
354-
355-
let mut synthetic_expansion_infos = self.synthetic_expansion_infos.borrow_mut();
356-
let mut file_index_to_file = self.file_index_to_file.borrow_mut();
355+
let cnum_map = self.cnum_map.borrow();
357356

358357
let mut decoder = CacheDecoder {
359358
tcx,
360359
opaque: opaque::Decoder::new(&self.serialized_data[..], pos.to_usize()),
361360
codemap: self.codemap,
362361
cnum_map: cnum_map.as_ref().unwrap(),
363-
file_index_to_file: &mut file_index_to_file,
362+
file_index_to_file: &self.file_index_to_file,
364363
file_index_to_stable_id: &self.file_index_to_stable_id,
365-
synthetic_expansion_infos: &mut synthetic_expansion_infos,
364+
synthetic_expansion_infos: &self.synthetic_expansion_infos,
366365
};
367366

368367
match decode_tagged(&mut decoder, dep_node_index) {
@@ -421,21 +420,21 @@ struct CacheDecoder<'a, 'tcx: 'a, 'x> {
421420
opaque: opaque::Decoder<'x>,
422421
codemap: &'x CodeMap,
423422
cnum_map: &'x IndexVec<CrateNum, Option<CrateNum>>,
424-
synthetic_expansion_infos: &'x mut FxHashMap<AbsoluteBytePos, SyntaxContext>,
425-
file_index_to_file: &'x mut FxHashMap<FileMapIndex, Rc<FileMap>>,
423+
synthetic_expansion_infos: &'x RefCell<FxHashMap<AbsoluteBytePos, SyntaxContext>>,
424+
file_index_to_file: &'x RefCell<FxHashMap<FileMapIndex, Rc<FileMap>>>,
426425
file_index_to_stable_id: &'x FxHashMap<FileMapIndex, StableFilemapId>,
427426
}
428427

429428
impl<'a, 'tcx, 'x> CacheDecoder<'a, 'tcx, 'x> {
430-
fn file_index_to_file(&mut self, index: FileMapIndex) -> Rc<FileMap> {
429+
fn file_index_to_file(&self, index: FileMapIndex) -> Rc<FileMap> {
431430
let CacheDecoder {
432-
ref mut file_index_to_file,
431+
ref file_index_to_file,
433432
ref file_index_to_stable_id,
434433
ref codemap,
435434
..
436435
} = *self;
437436

438-
file_index_to_file.entry(index).or_insert_with(|| {
437+
file_index_to_file.borrow_mut().entry(index).or_insert_with(|| {
439438
let stable_id = file_index_to_stable_id[&index];
440439
codemap.filemap_by_stable_id(stable_id)
441440
.expect("Failed to lookup FileMap in new context.")
@@ -572,19 +571,24 @@ impl<'a, 'tcx, 'x> SpecializedDecoder<Span> for CacheDecoder<'a, 'tcx, 'x> {
572571
let pos = AbsoluteBytePos::new(self.opaque.position());
573572
let expn_info: ExpnInfo = Decodable::decode(self)?;
574573
let ctxt = SyntaxContext::allocate_directly(expn_info);
575-
self.synthetic_expansion_infos.insert(pos, ctxt);
574+
self.synthetic_expansion_infos.borrow_mut().insert(pos, ctxt);
576575
ctxt
577576
}
578577
TAG_EXPANSION_INFO_SHORTHAND => {
579578
let pos = AbsoluteBytePos::decode(self)?;
580-
if let Some(ctxt) = self.synthetic_expansion_infos.get(&pos).cloned() {
579+
let cached_ctxt = self.synthetic_expansion_infos
580+
.borrow()
581+
.get(&pos)
582+
.cloned();
583+
584+
if let Some(ctxt) = cached_ctxt {
581585
ctxt
582586
} else {
583587
let expn_info = self.with_position(pos.to_usize(), |this| {
584588
ExpnInfo::decode(this)
585589
})?;
586590
let ctxt = SyntaxContext::allocate_directly(expn_info);
587-
self.synthetic_expansion_infos.insert(pos, ctxt);
591+
self.synthetic_expansion_infos.borrow_mut().insert(pos, ctxt);
588592
ctxt
589593
}
590594
}

0 commit comments

Comments
 (0)