diff options
| author | Michael Woerister <michaelwoerister@posteo> | 2018-05-29 10:26:26 +0200 |
|---|---|---|
| committer | Michael Woerister <michaelwoerister@posteo> | 2018-06-01 09:32:24 +0200 |
| commit | 22f6163db47dfb1c5c02bcd0543eb0f4f92dd164 (patch) | |
| tree | ba31bf674444d357200a2d1336631268337dc7ca /src/librustc_metadata/decoder.rs | |
| parent | 24dfcbef9c28158385f0cf526fd650f2d8a05064 (diff) | |
| download | rust-22f6163db47dfb1c5c02bcd0543eb0f4f92dd164.tar.gz rust-22f6163db47dfb1c5c02bcd0543eb0f4f92dd164.zip | |
Make metadata decoding use AllocDecodingState/Session.
Diffstat (limited to 'src/librustc_metadata/decoder.rs')
| -rw-r--r-- | src/librustc_metadata/decoder.rs | 44 |
1 files changed, 10 insertions, 34 deletions
diff --git a/src/librustc_metadata/decoder.rs b/src/librustc_metadata/decoder.rs index 11c653895fc..69e873bb95d 100644 --- a/src/librustc_metadata/decoder.rs +++ b/src/librustc_metadata/decoder.rs @@ -25,12 +25,12 @@ use rustc::hir::def_id::{CrateNum, DefId, DefIndex, use rustc::ich::Fingerprint; use rustc::middle::lang_items; use rustc::mir::{self, interpret}; +use rustc::mir::interpret::AllocDecodingSession; use rustc::session::Session; use rustc::ty::{self, Ty, TyCtxt}; use rustc::ty::codec::TyDecoder; use rustc::mir::Mir; use rustc::util::captures::Captures; -use rustc::util::nodemap::FxHashMap; use std::io; use std::mem; @@ -55,11 +55,8 @@ pub struct DecodeContext<'a, 'tcx: 'a> { lazy_state: LazyState, - // interpreter allocation cache - interpret_alloc_cache: FxHashMap<usize, interpret::AllocId>, - - // Read from the LazySeq CrateRoot::inpterpret_alloc_index on demand - interpret_alloc_index: Option<Vec<u32>>, + // Used for decoding interpret::AllocIds in a cached & thread-safe manner. + alloc_decoding_session: Option<AllocDecodingSession<'a>>, } /// Abstract over the various ways one can create metadata decoders. @@ -78,8 +75,9 @@ pub trait Metadata<'a, 'tcx>: Copy { tcx, last_filemap_index: 0, lazy_state: LazyState::NoNode, - interpret_alloc_cache: FxHashMap::default(), - interpret_alloc_index: None, + alloc_decoding_session: self.cdata().map(|cdata| { + cdata.alloc_decoding_state.new_decoding_session() + }), } } } @@ -178,17 +176,6 @@ impl<'a, 'tcx> DecodeContext<'a, 'tcx> { self.lazy_state = LazyState::Previous(position + min_size); Ok(position) } - - fn interpret_alloc(&mut self, idx: usize) -> usize { - if let Some(index) = self.interpret_alloc_index.as_mut() { - return index[idx] as usize; - } - let cdata = self.cdata(); - let index: Vec<u32> = cdata.root.interpret_alloc_index.decode(cdata).collect(); - let pos = index[idx]; - self.interpret_alloc_index = Some(index); - pos as usize - } } impl<'a, 'tcx: 'a> TyDecoder<'a, 'tcx> for DecodeContext<'a, 'tcx> { @@ -299,22 +286,11 @@ impl<'a, 'tcx> SpecializedDecoder<LocalDefId> for DecodeContext<'a, 'tcx> { impl<'a, 'tcx> SpecializedDecoder<interpret::AllocId> for DecodeContext<'a, 'tcx> { fn specialized_decode(&mut self) -> Result<interpret::AllocId, Self::Error> { - let tcx = self.tcx.unwrap(); - let idx = usize::decode(self)?; - - if let Some(cached) = self.interpret_alloc_cache.get(&idx).cloned() { - return Ok(cached); + if let Some(alloc_decoding_session) = self.alloc_decoding_session { + alloc_decoding_session.decode_alloc_id(self) + } else { + bug!("Attempting to decode interpret::AllocId without CrateMetadata") } - let pos = self.interpret_alloc(idx); - self.with_position(pos, |this| { - interpret::specialized_decode_alloc_id( - this, - tcx, - |this, alloc_id| { - assert!(this.interpret_alloc_cache.insert(idx, alloc_id).is_none()); - }, - ) - }) } } |
