Rollup merge of #144822 - Zalathar:hash-owner-nodes, r=compiler-errors
Return a struct with named fields from `hash_owner_nodes` While looking through this code for other reasons, I noticed a nice opportunity to return a struct with named fields instead of a tuple. The first patch also introduces an early-return to flatten the rest of `hash_owner_nodes`. There are further changes that could potentially be made here (renaming things, `Option<Hashes>` instead of optional fields), but I'm not deeply familiar with this code so I didn't want to disturb the calling code too much.
This commit is contained in:
@@ -675,7 +675,7 @@ impl<'a, 'hir> LoweringContext<'a, 'hir> {
|
|||||||
let bodies = SortedMap::from_presorted_elements(bodies);
|
let bodies = SortedMap::from_presorted_elements(bodies);
|
||||||
|
|
||||||
// Don't hash unless necessary, because it's expensive.
|
// Don't hash unless necessary, because it's expensive.
|
||||||
let (opt_hash_including_bodies, attrs_hash, delayed_lints_hash) =
|
let rustc_middle::hir::Hashes { opt_hash_including_bodies, attrs_hash, delayed_lints_hash } =
|
||||||
self.tcx.hash_owner_nodes(node, &bodies, &attrs, &delayed_lints, define_opaque);
|
self.tcx.hash_owner_nodes(node, &bodies, &attrs, &delayed_lints, define_opaque);
|
||||||
let num_nodes = self.item_local_id_counter.as_usize();
|
let num_nodes = self.item_local_id_counter.as_usize();
|
||||||
let (nodes, parenting) = index::index_hir(self.tcx, node, &bodies, num_nodes);
|
let (nodes, parenting) = index::index_hir(self.tcx, node, &bodies, num_nodes);
|
||||||
|
|||||||
@@ -174,36 +174,52 @@ impl<'tcx> TyCtxt<'tcx> {
|
|||||||
attrs: &SortedMap<ItemLocalId, &[Attribute]>,
|
attrs: &SortedMap<ItemLocalId, &[Attribute]>,
|
||||||
delayed_lints: &[DelayedLint],
|
delayed_lints: &[DelayedLint],
|
||||||
define_opaque: Option<&[(Span, LocalDefId)]>,
|
define_opaque: Option<&[(Span, LocalDefId)]>,
|
||||||
) -> (Option<Fingerprint>, Option<Fingerprint>, Option<Fingerprint>) {
|
) -> Hashes {
|
||||||
if self.needs_crate_hash() {
|
if !self.needs_crate_hash() {
|
||||||
self.with_stable_hashing_context(|mut hcx| {
|
return Hashes {
|
||||||
let mut stable_hasher = StableHasher::new();
|
opt_hash_including_bodies: None,
|
||||||
node.hash_stable(&mut hcx, &mut stable_hasher);
|
attrs_hash: None,
|
||||||
// Bodies are stored out of line, so we need to pull them explicitly in the hash.
|
delayed_lints_hash: None,
|
||||||
bodies.hash_stable(&mut hcx, &mut stable_hasher);
|
};
|
||||||
let h1 = stable_hasher.finish();
|
|
||||||
|
|
||||||
let mut stable_hasher = StableHasher::new();
|
|
||||||
attrs.hash_stable(&mut hcx, &mut stable_hasher);
|
|
||||||
|
|
||||||
// Hash the defined opaque types, which are not present in the attrs.
|
|
||||||
define_opaque.hash_stable(&mut hcx, &mut stable_hasher);
|
|
||||||
|
|
||||||
let h2 = stable_hasher.finish();
|
|
||||||
|
|
||||||
// hash lints emitted during ast lowering
|
|
||||||
let mut stable_hasher = StableHasher::new();
|
|
||||||
delayed_lints.hash_stable(&mut hcx, &mut stable_hasher);
|
|
||||||
let h3 = stable_hasher.finish();
|
|
||||||
|
|
||||||
(Some(h1), Some(h2), Some(h3))
|
|
||||||
})
|
|
||||||
} else {
|
|
||||||
(None, None, None)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
self.with_stable_hashing_context(|mut hcx| {
|
||||||
|
let mut stable_hasher = StableHasher::new();
|
||||||
|
node.hash_stable(&mut hcx, &mut stable_hasher);
|
||||||
|
// Bodies are stored out of line, so we need to pull them explicitly in the hash.
|
||||||
|
bodies.hash_stable(&mut hcx, &mut stable_hasher);
|
||||||
|
let h1 = stable_hasher.finish();
|
||||||
|
|
||||||
|
let mut stable_hasher = StableHasher::new();
|
||||||
|
attrs.hash_stable(&mut hcx, &mut stable_hasher);
|
||||||
|
|
||||||
|
// Hash the defined opaque types, which are not present in the attrs.
|
||||||
|
define_opaque.hash_stable(&mut hcx, &mut stable_hasher);
|
||||||
|
|
||||||
|
let h2 = stable_hasher.finish();
|
||||||
|
|
||||||
|
// hash lints emitted during ast lowering
|
||||||
|
let mut stable_hasher = StableHasher::new();
|
||||||
|
delayed_lints.hash_stable(&mut hcx, &mut stable_hasher);
|
||||||
|
let h3 = stable_hasher.finish();
|
||||||
|
|
||||||
|
Hashes {
|
||||||
|
opt_hash_including_bodies: Some(h1),
|
||||||
|
attrs_hash: Some(h2),
|
||||||
|
delayed_lints_hash: Some(h3),
|
||||||
|
}
|
||||||
|
})
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Hashes computed by [`TyCtxt::hash_owner_nodes`] if necessary.
|
||||||
|
#[derive(Clone, Copy, Debug)]
|
||||||
|
pub struct Hashes {
|
||||||
|
pub opt_hash_including_bodies: Option<Fingerprint>,
|
||||||
|
pub attrs_hash: Option<Fingerprint>,
|
||||||
|
pub delayed_lints_hash: Option<Fingerprint>,
|
||||||
|
}
|
||||||
|
|
||||||
pub fn provide(providers: &mut Providers) {
|
pub fn provide(providers: &mut Providers) {
|
||||||
providers.hir_crate_items = map::hir_crate_items;
|
providers.hir_crate_items = map::hir_crate_items;
|
||||||
providers.crate_hash = map::crate_hash;
|
providers.crate_hash = map::crate_hash;
|
||||||
|
|||||||
@@ -1381,7 +1381,7 @@ impl<'tcx> TyCtxtFeed<'tcx, LocalDefId> {
|
|||||||
let bodies = Default::default();
|
let bodies = Default::default();
|
||||||
let attrs = hir::AttributeMap::EMPTY;
|
let attrs = hir::AttributeMap::EMPTY;
|
||||||
|
|
||||||
let (opt_hash_including_bodies, _, _) =
|
let rustc_middle::hir::Hashes { opt_hash_including_bodies, .. } =
|
||||||
self.tcx.hash_owner_nodes(node, &bodies, &attrs.map, &[], attrs.define_opaque);
|
self.tcx.hash_owner_nodes(node, &bodies, &attrs.map, &[], attrs.define_opaque);
|
||||||
let node = node.into();
|
let node = node.into();
|
||||||
self.opt_hir_owner_nodes(Some(self.tcx.arena.alloc(hir::OwnerNodes {
|
self.opt_hir_owner_nodes(Some(self.tcx.arena.alloc(hir::OwnerNodes {
|
||||||
|
|||||||
Reference in New Issue
Block a user