]> git.lizzy.rs Git - rust.git/commitdiff
add in a depth-first number for stack entries
authorNiko Matsakis <niko@alum.mit.edu>
Mon, 10 Jun 2019 20:22:10 +0000 (16:22 -0400)
committerNiko Matsakis <niko@alum.mit.edu>
Wed, 12 Jun 2019 17:56:28 +0000 (13:56 -0400)
src/librustc/traits/select.rs

index 1de248378bdf52d3350b58076d2dc3211ac7b044..31ef31808c473b47afb1fef75933e3087fd2db97 100644 (file)
@@ -188,6 +188,11 @@ struct TraitObligationStack<'prev, 'tcx: 'prev> {
 
     /// Number of parent frames plus one -- so the topmost frame has depth 1.
     depth: usize,
+
+    /// Depth-first number of this node in the search graph -- a
+    /// pre-order index.  Basically a freshly incremented counter.
+    #[allow(dead_code)] // TODO
+    dfn: usize,
 }
 
 #[derive(Clone, Default)]
@@ -3770,12 +3775,14 @@ fn push_stack<'o, 's: 'o>(
             .to_poly_trait_ref()
             .fold_with(&mut self.freshener);
 
+        let dfn = previous_stack.cache.next_dfn();
         let depth = previous_stack.depth() + 1;
         TraitObligationStack {
             obligation,
             fresh_trait_ref,
             reached_depth: Cell::new(depth),
             previous: previous_stack,
+            dfn,
             depth,
         }
     }
@@ -3999,9 +4006,18 @@ fn update_reached_depth(&self, reached_depth: usize) {
 
 #[derive(Default)]
 struct ProvisionalEvaluationCache<'tcx> {
+    dfn: Cell<usize>,
     _dummy: Vec<&'tcx ()>,
 }
 
+impl<'tcx> ProvisionalEvaluationCache<'tcx> {
+    fn next_dfn(&self) -> usize {
+        let result = self.dfn.get();
+        self.dfn.set(result + 1);
+        result
+    }
+}
+
 #[derive(Copy, Clone)]
 struct TraitObligationStackList<'o, 'tcx: 'o> {
     cache: &'o ProvisionalEvaluationCache<'tcx>,