r253958 - Reduce the stack usage per recursive step when RecursiveASTVisitor cannot perform data recursion.

Richard Smith via cfe-commits cfe-commits at lists.llvm.org
Mon Nov 23 23:13:06 PST 2015


Author: rsmith
Date: Tue Nov 24 01:13:06 2015
New Revision: 253958

URL: http://llvm.org/viewvc/llvm-project?rev=253958&view=rev
Log:
Reduce the stack usage per recursive step when RecursiveASTVisitor cannot perform data recursion.

Modified:
    cfe/trunk/include/clang/AST/RecursiveASTVisitor.h

Modified: cfe/trunk/include/clang/AST/RecursiveASTVisitor.h
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/AST/RecursiveASTVisitor.h?rev=253958&r1=253957&r2=253958&view=diff
==============================================================================
--- cfe/trunk/include/clang/AST/RecursiveASTVisitor.h (original)
+++ cfe/trunk/include/clang/AST/RecursiveASTVisitor.h Tue Nov 24 01:13:06 2015
@@ -471,28 +471,10 @@ 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) {
 #define DISPATCH_STMT(NAME, CLASS, VAR)                                        \
@@ -561,10 +543,23 @@ bool RecursiveASTVisitor<Derived>::Trave
                               &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;
 }
 




More information about the cfe-commits mailing list