Skip to content

Commit cb21293

Browse files
committed
Avoid re-processing nodes in find_cycles_from_node.
1 parent 76916d7 commit cb21293

File tree

1 file changed

+8
-4
lines changed
  • src/librustc_data_structures/obligation_forest

1 file changed

+8
-4
lines changed

src/librustc_data_structures/obligation_forest/mod.rs

+8-4
Original file line numberDiff line numberDiff line change
@@ -584,15 +584,16 @@ impl<O: ForestObligation> ObligationForest<O> {
584584
// function call.
585585
if let NodeState::Success(waiting) = node.state.get() {
586586
if !self.is_still_waiting(waiting) {
587-
self.find_cycles_from_node(&mut stack, processor, index);
587+
self.find_cycles_from_node(&mut stack, processor, index, index);
588588
}
589589
}
590590
}
591591

592592
debug_assert!(stack.is_empty());
593593
}
594594

595-
fn find_cycles_from_node<P>(&self, stack: &mut Vec<usize>, processor: &mut P, index: usize)
595+
fn find_cycles_from_node<P>(&self, stack: &mut Vec<usize>, processor: &mut P, min_index: usize,
596+
index: usize)
596597
where P: ObligationProcessor<Obligation=O>
597598
{
598599
let node = &self.nodes[index];
@@ -601,8 +602,11 @@ impl<O: ForestObligation> ObligationForest<O> {
601602
match stack.iter().rposition(|&n| n == index) {
602603
None => {
603604
stack.push(index);
604-
for &index in node.dependents.iter() {
605-
self.find_cycles_from_node(stack, processor, index);
605+
for &dep_index in node.dependents.iter() {
606+
// The index check avoids re-considering a node.
607+
if dep_index >= min_index {
608+
self.find_cycles_from_node(stack, processor, min_index, dep_index);
609+
}
606610
}
607611
stack.pop();
608612
}

0 commit comments

Comments
 (0)