Ensure that Fingerprint
caching respects hashing configuration
Fixes #92266 In some `HashStable` impls, we use a cache to avoid re-computing the same `Fingerprint` from the same structure (e.g. an `AdtDef`). However, the `StableHashingContext` used can be configured to perform hashing in different ways (e.g. skipping `Span`s). This configuration information is not included in the cache key, which will cause an incorrect `Fingerprint` to be used if we hash the same structure with different `StableHashingContext` settings. To fix this, the configuration settings of `StableHashingContext` are split out into a separate `HashingControls` struct. This struct is used as part of the cache key, ensuring that our caches always produce the correct result for the given settings. With this in place, we now turn off `Span` hashing during the entire process of computing the hash included in legacy symbols. This current has no effect, but will matter when a future PR starts hashing more `Span`s that we currently skip.
This commit is contained in:
parent
936ce3dab7
commit
5580e5e1dd
9 changed files with 101 additions and 48 deletions
|
@ -583,3 +583,22 @@ fn stable_hash_reduce<HCX, I, C, F>(
|
|||
}
|
||||
}
|
||||
}
|
||||
|
||||
#[derive(PartialEq, Eq, Clone, Copy, Hash, Debug)]
|
||||
pub enum NodeIdHashingMode {
|
||||
Ignore,
|
||||
HashDefPath,
|
||||
}
|
||||
|
||||
/// Controls what data we do or not not hash.
|
||||
/// Whenever a `HashStable` implementation caches its
|
||||
/// result, it needs to include `HashingControls` as part
|
||||
/// of the key, to ensure that is does not produce an incorrect
|
||||
/// result (for example, using a `Fingerprint` produced while
|
||||
/// hashing `Span`s when a `Fingeprint` without `Span`s is
|
||||
/// being requested)
|
||||
#[derive(Clone, Hash, Eq, PartialEq, Debug)]
|
||||
pub struct HashingControls {
|
||||
pub hash_spans: bool,
|
||||
pub node_id_hashing_mode: NodeIdHashingMode,
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue