fn complete_anon_task(&mut self, kind: DepKind, task_deps: TaskDeps) -> DepNodeIndex {
debug_assert!(!kind.is_eval_always());
- let mut fingerprint = self.anon_id_seed;
let mut hasher = StableHasher::new();
- for &read in task_deps.reads.iter() {
- let read_dep_node = self.data[read].node;
+ // The dep node indices are hashed here instead of hashing the dep nodes of the
+ // dependencies. These indices may refer to different nodes per session, but this isn't
+ // a problem here because we that ensure the final dep node hash is per session only by
+ // combining it with the per session random number `anon_id_seed`. This hash only need
+ // to map the dependencies to a single value on a per session basis.
+ task_deps.reads.hash(&mut hasher);
- ::std::mem::discriminant(&read_dep_node.kind).hash(&mut hasher);
+ let target_dep_node = DepNode {
+ kind,
// Fingerprint::combine() is faster than sending Fingerprint
// through the StableHasher (at least as long as StableHasher
// is so slow).
- fingerprint = fingerprint.combine(read_dep_node.hash);
- }
-
- fingerprint = fingerprint.combine(hasher.finish());
-
- let target_dep_node = DepNode {
- kind,
- hash: fingerprint,
+ hash: self.anon_id_seed.combine(hasher.finish()),
};
self.intern_node(target_dep_node, task_deps.reads, Fingerprint::ZERO).0