1
Fork 0

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:
Aaron Hill 2020-08-04 04:53:28 -04:00
parent 40857b9453
commit 955aebf529
No known key found for this signature in database
GPG key ID: B4087E510E98B164

View file

@ -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)
}