Factor out common code in intern_node
.
There are three very similar blocks in this function.
This commit is contained in:
parent
207cec017f
commit
793b2ffb67
1 changed files with 27 additions and 55 deletions
|
@ -1232,76 +1232,48 @@ impl<K: DepKind> CurrentDepGraph<K> {
|
||||||
self.node_intern_event_id.map(|eid| profiler.generic_activity_with_event_id(eid));
|
self.node_intern_event_id.map(|eid| profiler.generic_activity_with_event_id(eid));
|
||||||
|
|
||||||
if let Some(prev_index) = prev_graph.node_to_index_opt(&key) {
|
if let Some(prev_index) = prev_graph.node_to_index_opt(&key) {
|
||||||
// Determine the color and index of the new `DepNode`.
|
let get_dep_node_index = |color, fingerprint| {
|
||||||
if let Some(fingerprint) = fingerprint {
|
|
||||||
if fingerprint == prev_graph.fingerprint_by_index(prev_index) {
|
|
||||||
if print_status {
|
|
||||||
eprintln!("[task::green] {key:?}");
|
|
||||||
}
|
|
||||||
|
|
||||||
// This is a green node: it existed in the previous compilation,
|
|
||||||
// its query was re-executed, and it has the same result as before.
|
|
||||||
let mut prev_index_to_index = self.prev_index_to_index.lock();
|
|
||||||
|
|
||||||
let dep_node_index = match prev_index_to_index[prev_index] {
|
|
||||||
Some(dep_node_index) => dep_node_index,
|
|
||||||
None => {
|
|
||||||
let dep_node_index =
|
|
||||||
self.encoder.borrow().send(profiler, key, fingerprint, edges);
|
|
||||||
prev_index_to_index[prev_index] = Some(dep_node_index);
|
|
||||||
dep_node_index
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
#[cfg(debug_assertions)]
|
|
||||||
self.record_edge(dep_node_index, key, fingerprint);
|
|
||||||
(dep_node_index, Some((prev_index, DepNodeColor::Green(dep_node_index))))
|
|
||||||
} else {
|
|
||||||
if print_status {
|
|
||||||
eprintln!("[task::red] {key:?}");
|
|
||||||
}
|
|
||||||
|
|
||||||
// This is a red node: it existed in the previous compilation, its query
|
|
||||||
// was re-executed, but it has a different result from before.
|
|
||||||
let mut prev_index_to_index = self.prev_index_to_index.lock();
|
|
||||||
|
|
||||||
let dep_node_index = match prev_index_to_index[prev_index] {
|
|
||||||
Some(dep_node_index) => dep_node_index,
|
|
||||||
None => {
|
|
||||||
let dep_node_index =
|
|
||||||
self.encoder.borrow().send(profiler, key, fingerprint, edges);
|
|
||||||
prev_index_to_index[prev_index] = Some(dep_node_index);
|
|
||||||
dep_node_index
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
#[cfg(debug_assertions)]
|
|
||||||
self.record_edge(dep_node_index, key, fingerprint);
|
|
||||||
(dep_node_index, Some((prev_index, DepNodeColor::Red)))
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
if print_status {
|
if print_status {
|
||||||
eprintln!("[task::unknown] {key:?}");
|
eprintln!("[task::{color:}] {key:?}");
|
||||||
}
|
}
|
||||||
|
|
||||||
// This is a red node, effectively: it existed in the previous compilation
|
|
||||||
// session, its query was re-executed, but it doesn't compute a result hash
|
|
||||||
// (i.e. it represents a `no_hash` query), so we have no way of determining
|
|
||||||
// whether or not the result was the same as before.
|
|
||||||
let mut prev_index_to_index = self.prev_index_to_index.lock();
|
let mut prev_index_to_index = self.prev_index_to_index.lock();
|
||||||
|
|
||||||
let dep_node_index = match prev_index_to_index[prev_index] {
|
let dep_node_index = match prev_index_to_index[prev_index] {
|
||||||
Some(dep_node_index) => dep_node_index,
|
Some(dep_node_index) => dep_node_index,
|
||||||
None => {
|
None => {
|
||||||
let dep_node_index =
|
let dep_node_index =
|
||||||
self.encoder.borrow().send(profiler, key, Fingerprint::ZERO, edges);
|
self.encoder.borrow().send(profiler, key, fingerprint, edges);
|
||||||
prev_index_to_index[prev_index] = Some(dep_node_index);
|
prev_index_to_index[prev_index] = Some(dep_node_index);
|
||||||
dep_node_index
|
dep_node_index
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
#[cfg(debug_assertions)]
|
#[cfg(debug_assertions)]
|
||||||
self.record_edge(dep_node_index, key, Fingerprint::ZERO);
|
self.record_edge(dep_node_index, key, fingerprint);
|
||||||
|
|
||||||
|
dep_node_index
|
||||||
|
};
|
||||||
|
|
||||||
|
// Determine the color and index of the new `DepNode`.
|
||||||
|
if let Some(fingerprint) = fingerprint {
|
||||||
|
if fingerprint == prev_graph.fingerprint_by_index(prev_index) {
|
||||||
|
// This is a green node: it existed in the previous compilation,
|
||||||
|
// its query was re-executed, and it has the same result as before.
|
||||||
|
let dep_node_index = get_dep_node_index("green", fingerprint);
|
||||||
|
(dep_node_index, Some((prev_index, DepNodeColor::Green(dep_node_index))))
|
||||||
|
} else {
|
||||||
|
// This is a red node: it existed in the previous compilation, its query
|
||||||
|
// was re-executed, but it has a different result from before.
|
||||||
|
let dep_node_index = get_dep_node_index("red", fingerprint);
|
||||||
|
(dep_node_index, Some((prev_index, DepNodeColor::Red)))
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
// This is a red node, effectively: it existed in the previous compilation
|
||||||
|
// session, its query was re-executed, but it doesn't compute a result hash
|
||||||
|
// (i.e. it represents a `no_hash` query), so we have no way of determining
|
||||||
|
// whether or not the result was the same as before.
|
||||||
|
let dep_node_index = get_dep_node_index("unknown", Fingerprint::ZERO);
|
||||||
(dep_node_index, Some((prev_index, DepNodeColor::Red)))
|
(dep_node_index, Some((prev_index, DepNodeColor::Red)))
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue