Don't serialize ExpnData for foreign crates
When we encode an ExpnId into the crate metadata, we write out the CrateNum of the crate that 'owns' the corresponding `ExpnData`, which is later used to decode the `ExpnData` from its owning crate. However, we current serialize the `ExpnData` for all `ExpnIds` that we serialize, even if the `ExpnData` was already serialized into a foreign crate. This commit skips encoding this kind of `ExpnData`, which should hopefully speed up metadata encoding and reduce the total metadata size.
This commit is contained in:
parent
40857b9453
commit
955aebf529
1 changed files with 18 additions and 4 deletions
|
@ -1170,13 +1170,27 @@ pub fn raw_encode_expn_id<E: Encoder>(
|
|||
mode: ExpnDataEncodeMode,
|
||||
e: &mut E,
|
||||
) -> Result<(), E::Error> {
|
||||
if !context.serialized_expns.lock().contains(&expn) {
|
||||
context.latest_expns.lock().insert(expn);
|
||||
}
|
||||
// Record the fact that we need to serialize the corresponding
|
||||
// `ExpnData`
|
||||
let needs_data = || {
|
||||
if !context.serialized_expns.lock().contains(&expn) {
|
||||
context.latest_expns.lock().insert(expn);
|
||||
}
|
||||
};
|
||||
|
||||
match mode {
|
||||
ExpnDataEncodeMode::IncrComp => expn.0.encode(e),
|
||||
ExpnDataEncodeMode::IncrComp => {
|
||||
// Always serialize the `ExpnData` in incr comp mode
|
||||
needs_data();
|
||||
expn.0.encode(e)
|
||||
}
|
||||
ExpnDataEncodeMode::Metadata => {
|
||||
let data = expn.expn_data();
|
||||
// We only need to serialize the ExpnData
|
||||
// if it comes from this crate.
|
||||
if data.krate == LOCAL_CRATE {
|
||||
needs_data();
|
||||
}
|
||||
data.orig_id.expect("Missing orig_id").encode(e)?;
|
||||
data.krate.encode(e)
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue