Skip to content

Commit

Permalink
Improve Node::{parent,dependents} interplay.
Browse files Browse the repository at this point in the history
This patch:

- Reorders things a bit so that `parent` is always handled before
  `dependents`.

- Uses iterator chaining to avoid some code duplication.
  • Loading branch information
nnethercote committed Jun 18, 2018
1 parent 6151bab commit 70d22fa
Showing 1 changed file with 9 additions and 15 deletions.
24 changes: 9 additions & 15 deletions src/librustc_data_structures/obligation_forest/mod.rs
Expand Up @@ -91,13 +91,14 @@ struct Node<O> {
obligation: O,
state: Cell<NodeState>,

/// Obligations that depend on this obligation for their
/// completion. They must all be in a non-pending state.
dependents: Vec<NodeIndex>,
/// The parent of a node - the original obligation of
/// which it is a subobligation. Except for error reporting,
/// this is just another member of `dependents`.
/// it is just like any member of `dependents`.
parent: Option<NodeIndex>,

/// Obligations that depend on this obligation for their
/// completion. They must all be in a non-pending state.
dependents: Vec<NodeIndex>,
}

/// The state of one node in some tree within the forest. This
Expand Down Expand Up @@ -383,10 +384,7 @@ impl<O: ForestObligation> ObligationForest<O> {
NodeState::Success => {
node.state.set(NodeState::OnDfsStack);
stack.push(index);
if let Some(parent) = node.parent {
self.find_cycles_from_node(stack, processor, parent.get());
}
for dependent in &node.dependents {
for dependent in node.parent.iter().chain(node.dependents.iter()) {
self.find_cycles_from_node(stack, processor, dependent.get());
}
stack.pop();
Expand Down Expand Up @@ -430,7 +428,7 @@ impl<O: ForestObligation> ObligationForest<O> {
}

error_stack.extend(
node.dependents.iter().cloned().chain(node.parent).map(|x| x.get())
node.parent.iter().chain(node.dependents.iter()).map(|x| x.get())
);
}

Expand All @@ -440,11 +438,7 @@ impl<O: ForestObligation> ObligationForest<O> {

#[inline]
fn mark_neighbors_as_waiting_from(&self, node: &Node<O>) {
if let Some(parent) = node.parent {
self.mark_as_waiting_from(&self.nodes[parent.get()]);
}

for dependent in &node.dependents {
for dependent in node.parent.iter().chain(node.dependents.iter()) {
self.mark_as_waiting_from(&self.nodes[dependent.get()]);
}
}
Expand Down Expand Up @@ -591,8 +585,8 @@ impl<O> Node<O> {
fn new(parent: Option<NodeIndex>, obligation: O) -> Node<O> {
Node {
obligation,
parent,
state: Cell::new(NodeState::Pending),
parent,
dependents: vec![],
}
}
Expand Down

0 comments on commit 70d22fa

Please sign in to comment.