From 70d22fa0519c8970cecbae400e7f6ebf69704d92 Mon Sep 17 00:00:00 2001 From: Nicholas Nethercote Date: Thu, 7 Jun 2018 16:19:52 +1000 Subject: [PATCH] Improve `Node::{parent,dependents}` interplay. This patch: - Reorders things a bit so that `parent` is always handled before `dependents`. - Uses iterator chaining to avoid some code duplication. --- .../obligation_forest/mod.rs | 24 +++++++------------ 1 file changed, 9 insertions(+), 15 deletions(-) diff --git a/src/librustc_data_structures/obligation_forest/mod.rs b/src/librustc_data_structures/obligation_forest/mod.rs index c66011d41187..df34891ff033 100644 --- a/src/librustc_data_structures/obligation_forest/mod.rs +++ b/src/librustc_data_structures/obligation_forest/mod.rs @@ -91,13 +91,14 @@ struct Node { obligation: O, state: Cell, + /// The parent of a node - the original obligation of + /// which it is a subobligation. Except for error reporting, + /// it is just like any member of `dependents`. + parent: Option, + /// Obligations that depend on this obligation for their /// completion. They must all be in a non-pending state. dependents: Vec, - /// 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`. - parent: Option, } /// The state of one node in some tree within the forest. This @@ -383,10 +384,7 @@ impl ObligationForest { 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(); @@ -430,7 +428,7 @@ impl ObligationForest { } 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()) ); } @@ -440,11 +438,7 @@ impl ObligationForest { #[inline] fn mark_neighbors_as_waiting_from(&self, node: &Node) { - 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()]); } } @@ -591,8 +585,8 @@ impl Node { fn new(parent: Option, obligation: O) -> Node { Node { obligation, - parent, state: Cell::new(NodeState::Pending), + parent, dependents: vec![], } }