r182861 - Use a non-recursive implementation to reconstruct line breaks.

Manuel Klimek klimek at google.com
Wed May 29 08:10:12 PDT 2013


Author: klimek
Date: Wed May 29 10:10:11 2013
New Revision: 182861

URL: http://llvm.org/viewvc/llvm-project?rev=182861&view=rev
Log:
Use a non-recursive implementation to reconstruct line breaks.

Now that the TokenAnnotator does not require stack space anymore,
reconstructing the lines has become the limiting factor. This patch
fixes that problem, allowing large files with multiple megabytes of
single unwrapped lines to be formatted.

Modified:
    cfe/trunk/lib/Format/Format.cpp

Modified: cfe/trunk/lib/Format/Format.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Format/Format.cpp?rev=182861&r1=182860&r2=182861&view=diff
==============================================================================
--- cfe/trunk/lib/Format/Format.cpp (original)
+++ cfe/trunk/lib/Format/Format.cpp Wed May 29 10:10:11 2013
@@ -949,22 +949,23 @@ private:
   }
 
   void reconstructPath(LineState &State, StateNode *Current) {
-    // FIXME: This recursive implementation limits the possible number
-    // of tokens per line if compiled into a binary with small stack space.
-    // To become more independent of stack frame limitations we would need
-    // to also change the TokenAnnotator.
-    if (Current->Previous == NULL)
-      return;
-    reconstructPath(State, Current->Previous);
-    DEBUG({
-      if (Current->NewLine) {
-        llvm::dbgs() << "Penalty for splitting before "
-                     << Current->Previous->State.NextToken->Tok.getName()
-                     << ": " << Current->Previous->State.NextToken->SplitPenalty
-                     << "\n";
-      }
-    });
-    addTokenToState(Current->NewLine, false, State);
+    std::deque<StateNode *> Path;
+    // We do not need a break before the initial token.
+    while (Current->Previous) {
+      Path.push_front(Current);
+      Current = Current->Previous;
+    }
+    for (std::deque<StateNode *>::iterator I = Path.begin(), E = Path.end();
+         I != E; ++I) {
+      DEBUG({
+        if ((*I)->NewLine) {
+          llvm::dbgs() << "Penalty for splitting before "
+                       << (*I)->Previous->State.NextToken->Tok.getName() << ": "
+                       << (*I)->Previous->State.NextToken->SplitPenalty << "\n";
+        }
+      });
+      addTokenToState((*I)->NewLine, false, State);
+    }
   }
 
   /// \brief Add the following state to the analysis queue \c Queue.





More information about the cfe-commits mailing list