]> granicus.if.org Git - clang/commitdiff
Reduce the stack usage per recursive step when RecursiveASTVisitor cannot perform...
authorRichard Smith <richard-llvm@metafoo.co.uk>
Tue, 24 Nov 2015 07:13:06 +0000 (07:13 +0000)
committerRichard Smith <richard-llvm@metafoo.co.uk>
Tue, 24 Nov 2015 07:13:06 +0000 (07:13 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@253958 91177308-0d34-0410-b5e6-96231b3b80d8

include/clang/AST/RecursiveASTVisitor.h

index f029c78bea970958933e5fcb2f65304e85538c1a..4da2f67493f580adf336adaee50d5f1a528a405d 100644 (file)
@@ -471,27 +471,9 @@ private:
   /// \brief Process clauses with list of variables.
   template <typename T> bool VisitOMPClauseList(T *Node);
 
-  bool dataTraverse(Stmt *S);
   bool dataTraverseNode(Stmt *S, DataRecursionQueue *Queue);
 };
 
-template <typename Derived>
-bool RecursiveASTVisitor<Derived>::dataTraverse(Stmt *S) {
-  SmallVector<Stmt*, 16> Queue;
-  Queue.push_back(S);
-
-  while (!Queue.empty()) {
-    Stmt *CurrS = Queue.pop_back_val();
-
-    size_t N = Queue.size();
-    TRY_TO(dataTraverseNode(CurrS, &Queue));
-    // Process new children in the order they were added.
-    std::reverse(Queue.begin() + N, Queue.end());
-  }
-
-  return true;
-}
-
 template <typename Derived>
 bool RecursiveASTVisitor<Derived>::dataTraverseNode(Stmt *S,
                                                     DataRecursionQueue *Queue) {
@@ -561,10 +543,23 @@ bool RecursiveASTVisitor<Derived>::TraverseStmt(Stmt *S,
                               &RecursiveASTVisitor::TraverseStmt>::value)
     return dataTraverseNode(S, nullptr);
 
-  if (!Queue)
-    return dataTraverse(S);
+  if (Queue) {
+    Queue->push_back(S);
+    return true;
+  }
+
+  SmallVector<Stmt *, 8> LocalQueue;
+  LocalQueue.push_back(S);
+
+  while (!LocalQueue.empty()) {
+    Stmt *CurrS = LocalQueue.pop_back_val();
+
+    size_t N = LocalQueue.size();
+    TRY_TO(dataTraverseNode(CurrS, &LocalQueue));
+    // Process new children in the order they were added.
+    std::reverse(LocalQueue.begin() + N, LocalQueue.end());
+  }
 
-  Queue->push_back(S);
   return true;
 }