Auto merge of #121851 - michaelwoerister:mcp-533-effective-vis, r=cjgillot
Use FxIndexMap instead FxHashMap to stabilize iteration order in EffectiveVisibilities Part of [MCP 533](https://github.com/rust-lang/compiler-team/issues/533).
This commit is contained in:
commit
bf71daedc2
2 changed files with 6 additions and 51 deletions
|
@ -684,26 +684,11 @@ where
|
||||||
impl_stable_traits_for_trivial_type!(::std::path::Path);
|
impl_stable_traits_for_trivial_type!(::std::path::Path);
|
||||||
impl_stable_traits_for_trivial_type!(::std::path::PathBuf);
|
impl_stable_traits_for_trivial_type!(::std::path::PathBuf);
|
||||||
|
|
||||||
impl<K, V, R, HCX> HashStable<HCX> for ::std::collections::HashMap<K, V, R>
|
// It is not safe to implement HashStable for HashSet, HashMap or any other collection type
|
||||||
where
|
|
||||||
K: ToStableHashKey<HCX> + Eq,
|
|
||||||
V: HashStable<HCX>,
|
|
||||||
R: BuildHasher,
|
|
||||||
{
|
|
||||||
#[inline]
|
|
||||||
fn hash_stable(&self, hcx: &mut HCX, hasher: &mut StableHasher) {
|
|
||||||
stable_hash_reduce(hcx, hasher, self.iter(), self.len(), |hasher, hcx, (key, value)| {
|
|
||||||
let key = key.to_stable_hash_key(hcx);
|
|
||||||
key.hash_stable(hcx, hasher);
|
|
||||||
value.hash_stable(hcx, hasher);
|
|
||||||
});
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// It is not safe to implement HashStable for HashSet or any other collection type
|
|
||||||
// with unstable but observable iteration order.
|
// with unstable but observable iteration order.
|
||||||
// See https://github.com/rust-lang/compiler-team/issues/533 for further information.
|
// See https://github.com/rust-lang/compiler-team/issues/533 for further information.
|
||||||
impl<V, HCX> !HashStable<HCX> for std::collections::HashSet<V> {}
|
impl<V, HCX> !HashStable<HCX> for std::collections::HashSet<V> {}
|
||||||
|
impl<K, V, HCX> !HashStable<HCX> for std::collections::HashMap<K, V> {}
|
||||||
|
|
||||||
impl<K, V, HCX> HashStable<HCX> for ::std::collections::BTreeMap<K, V>
|
impl<K, V, HCX> HashStable<HCX> for ::std::collections::BTreeMap<K, V>
|
||||||
where
|
where
|
||||||
|
@ -730,35 +715,6 @@ where
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fn stable_hash_reduce<HCX, I, C, F>(
|
|
||||||
hcx: &mut HCX,
|
|
||||||
hasher: &mut StableHasher,
|
|
||||||
mut collection: C,
|
|
||||||
length: usize,
|
|
||||||
hash_function: F,
|
|
||||||
) where
|
|
||||||
C: Iterator<Item = I>,
|
|
||||||
F: Fn(&mut StableHasher, &mut HCX, I),
|
|
||||||
{
|
|
||||||
length.hash_stable(hcx, hasher);
|
|
||||||
|
|
||||||
match length {
|
|
||||||
1 => {
|
|
||||||
hash_function(hasher, hcx, collection.next().unwrap());
|
|
||||||
}
|
|
||||||
_ => {
|
|
||||||
let hash = collection
|
|
||||||
.map(|value| {
|
|
||||||
let mut hasher = StableHasher::new();
|
|
||||||
hash_function(&mut hasher, hcx, value);
|
|
||||||
hasher.finish::<Hash128>()
|
|
||||||
})
|
|
||||||
.reduce(|accum, value| accum.wrapping_add(value));
|
|
||||||
hash.hash_stable(hcx, hasher);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/// Controls what data we do or do not hash.
|
/// Controls what data we do or do not hash.
|
||||||
/// Whenever a `HashStable` implementation caches its
|
/// Whenever a `HashStable` implementation caches its
|
||||||
/// result, it needs to include `HashingControls` as part
|
/// result, it needs to include `HashingControls` as part
|
||||||
|
|
|
@ -2,7 +2,7 @@
|
||||||
//! outside their scopes. This pass will also generate a set of exported items
|
//! outside their scopes. This pass will also generate a set of exported items
|
||||||
//! which are available for use externally when compiled as a library.
|
//! which are available for use externally when compiled as a library.
|
||||||
use crate::ty::{TyCtxt, Visibility};
|
use crate::ty::{TyCtxt, Visibility};
|
||||||
use rustc_data_structures::fx::FxHashMap;
|
use rustc_data_structures::fx::{FxIndexMap, IndexEntry};
|
||||||
use rustc_data_structures::stable_hasher::{HashStable, StableHasher};
|
use rustc_data_structures::stable_hasher::{HashStable, StableHasher};
|
||||||
use rustc_hir::def::DefKind;
|
use rustc_hir::def::DefKind;
|
||||||
use rustc_macros::HashStable;
|
use rustc_macros::HashStable;
|
||||||
|
@ -90,7 +90,7 @@ impl EffectiveVisibility {
|
||||||
/// Holds a map of effective visibilities for reachable HIR nodes.
|
/// Holds a map of effective visibilities for reachable HIR nodes.
|
||||||
#[derive(Clone, Debug)]
|
#[derive(Clone, Debug)]
|
||||||
pub struct EffectiveVisibilities<Id = LocalDefId> {
|
pub struct EffectiveVisibilities<Id = LocalDefId> {
|
||||||
map: FxHashMap<Id, EffectiveVisibility>,
|
map: FxIndexMap<Id, EffectiveVisibility>,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl EffectiveVisibilities {
|
impl EffectiveVisibilities {
|
||||||
|
@ -130,9 +130,8 @@ impl EffectiveVisibilities {
|
||||||
eff_vis: &EffectiveVisibility,
|
eff_vis: &EffectiveVisibility,
|
||||||
tcx: TyCtxt<'_>,
|
tcx: TyCtxt<'_>,
|
||||||
) {
|
) {
|
||||||
use std::collections::hash_map::Entry;
|
|
||||||
match self.map.entry(def_id) {
|
match self.map.entry(def_id) {
|
||||||
Entry::Occupied(mut occupied) => {
|
IndexEntry::Occupied(mut occupied) => {
|
||||||
let old_eff_vis = occupied.get_mut();
|
let old_eff_vis = occupied.get_mut();
|
||||||
for l in Level::all_levels() {
|
for l in Level::all_levels() {
|
||||||
let vis_at_level = eff_vis.at_level(l);
|
let vis_at_level = eff_vis.at_level(l);
|
||||||
|
@ -145,7 +144,7 @@ impl EffectiveVisibilities {
|
||||||
}
|
}
|
||||||
old_eff_vis
|
old_eff_vis
|
||||||
}
|
}
|
||||||
Entry::Vacant(vacant) => vacant.insert(*eff_vis),
|
IndexEntry::Vacant(vacant) => vacant.insert(*eff_vis),
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue