Skip to content

Commit c2d43e1

Browse files
committed
Simplify metadata decoding.
1 parent 47ea2ae commit c2d43e1

File tree

2 files changed

+12
-44
lines changed

2 files changed

+12
-44
lines changed

compiler/rustc_metadata/src/rmeta/decoder.rs

Lines changed: 4 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,6 @@ use rustc_span::symbol::{sym, Ident, Symbol};
3535
use rustc_span::{self, hygiene::MacroKind, BytePos, ExpnId, Pos, Span, SyntaxContext, DUMMY_SP};
3636

3737
use proc_macro::bridge::client::ProcMacro;
38-
use std::cell::Cell;
3938
use std::io;
4039
use std::mem;
4140
use std::num::NonZeroUsize;
@@ -370,21 +369,12 @@ impl<'a, 'tcx> Decodable<DecodeContext<'a, 'tcx>> for ExpnId {
370369
fn decode(decoder: &mut DecodeContext<'a, 'tcx>) -> Result<ExpnId, String> {
371370
let local_cdata = decoder.cdata();
372371
let sess = decoder.sess.unwrap();
373-
let expn_cnum = Cell::new(None);
374-
let get_ctxt = |cnum| {
375-
expn_cnum.set(Some(cnum));
376-
if cnum == LOCAL_CRATE {
377-
&local_cdata.hygiene_context
378-
} else {
379-
&local_cdata.cstore.get_crate_data(cnum).cdata.hygiene_context
380-
}
381-
};
382372

383-
rustc_span::hygiene::decode_expn_id(decoder, get_ctxt, |_this, index| {
384-
let cnum = expn_cnum.get().unwrap();
373+
rustc_span::hygiene::decode_expn_id(decoder, |cnum, index| {
385374
// Lookup local `ExpnData`s in our own crate data. Foreign `ExpnData`s
386375
// are stored in the owning crate, to avoid duplication.
387-
let crate_data = if cnum == LOCAL_CRATE {
376+
debug_assert_ne!(cnum, LOCAL_CRATE);
377+
let crate_data = if cnum == local_cdata.cnum {
388378
local_cdata
389379
} else {
390380
local_cdata.cstore.get_crate_data(cnum)
@@ -401,7 +391,7 @@ impl<'a, 'tcx> Decodable<DecodeContext<'a, 'tcx>> for ExpnId {
401391
.get(&crate_data, index)
402392
.unwrap()
403393
.decode((&crate_data, sess));
404-
Ok((expn_data, expn_hash))
394+
(expn_data, expn_hash)
405395
})
406396
}
407397
}

compiler/rustc_span/src/hygiene.rs

Lines changed: 8 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -1136,14 +1136,12 @@ pub fn decode_expn_id_incrcomp<D: Decoder>(
11361136
Ok(expn_id)
11371137
}
11381138

1139-
pub fn decode_expn_id<'a, D: Decoder>(
1139+
pub fn decode_expn_id<D: Decoder>(
11401140
d: &mut D,
1141-
get_context: impl FnOnce(CrateNum) -> &'a HygieneDecodeContext,
1142-
decode_data: impl FnOnce(&mut D, u32) -> Result<(ExpnData, ExpnHash), D::Error>,
1141+
decode_data: impl FnOnce(CrateNum, u32) -> (ExpnData, ExpnHash),
11431142
) -> Result<ExpnId, D::Error> {
11441143
let index = u32::decode(d)?;
11451144
let krate = CrateNum::decode(d)?;
1146-
let context = get_context(krate);
11471145

11481146
// Do this after decoding, so that we decode a `CrateNum`
11491147
// if necessary
@@ -1152,49 +1150,29 @@ pub fn decode_expn_id<'a, D: Decoder>(
11521150
return Ok(ExpnId::root());
11531151
}
11541152

1155-
let outer_expns = &context.remapped_expns;
1156-
1157-
// Ensure that the lock() temporary is dropped early
1158-
{
1159-
if let Some(expn_id) = outer_expns.lock().get(index as usize).copied().flatten() {
1160-
return Ok(expn_id);
1161-
}
1162-
}
1153+
// This function is used to decode metadata, so it cannot decode information about LOCAL_CRATE.
1154+
debug_assert_ne!(krate, LOCAL_CRATE);
11631155

11641156
// Don't decode the data inside `HygieneData::with`, since we need to recursively decode
11651157
// other ExpnIds
1166-
let (mut expn_data, hash) = decode_data(d, index)?;
1158+
let (expn_data, hash) = decode_data(krate, index);
1159+
debug_assert_eq!(krate, expn_data.krate);
1160+
debug_assert_eq!(expn_data.orig_id, Some(index));
11671161

11681162
let expn_id = HygieneData::with(|hygiene_data| {
11691163
if let Some(&expn_id) = hygiene_data.expn_hash_to_expn_id.get(&hash) {
11701164
return expn_id;
11711165
}
11721166

11731167
let expn_id = ExpnId(hygiene_data.expn_data.len() as u32);
1174-
1175-
// If we just deserialized an `ExpnData` owned by
1176-
// the local crate, its `orig_id` will be stale,
1177-
// so we need to update it to its own value.
1178-
// This only happens when we deserialize the incremental cache,
1179-
// since a crate will never decode its own metadata.
1180-
if expn_data.krate == LOCAL_CRATE {
1181-
expn_data.orig_id = Some(expn_id.0);
1182-
}
1183-
11841168
hygiene_data.expn_data.push(Some(expn_data));
11851169
hygiene_data.expn_hashes.push(hash);
11861170
let _old_id = hygiene_data.expn_hash_to_expn_id.insert(hash, expn_id);
11871171
debug_assert!(_old_id.is_none());
11881172

1189-
let mut expns = outer_expns.lock();
1190-
let new_len = index as usize + 1;
1191-
if expns.len() < new_len {
1192-
expns.resize(new_len, None);
1193-
}
1194-
expns[index as usize] = Some(expn_id);
1195-
drop(expns);
11961173
expn_id
11971174
});
1175+
11981176
Ok(expn_id)
11991177
}
12001178

0 commit comments

Comments
 (0)