[cfe-commits] r40384 - /cfe/trunk/Lex/Lexer.cpp

Chris Lattner sabre at nondot.org
Sat Jul 21 23:29:05 PDT 2007


Author: lattner
Date: Sun Jul 22 01:29:05 2007
New Revision: 40384

URL: http://llvm.org/viewvc/llvm-project?rev=40384&view=rev
Log:
avoid recursion between SkipBCPLComment and SkipWhitespace.  In cases like this:

   // foo
   // bar
   // baz

we'd get two levels of call (bcpl & whitespace) for each line, leading to some
seriously deep stacks in some cases.

Modified:
    cfe/trunk/Lex/Lexer.cpp

Modified: cfe/trunk/Lex/Lexer.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/Lex/Lexer.cpp?rev=40384&r1=40383&r2=40384&view=diff

==============================================================================
--- cfe/trunk/Lex/Lexer.cpp (original)
+++ cfe/trunk/Lex/Lexer.cpp Sun Jul 22 01:29:05 2007
@@ -607,18 +607,6 @@
   if (PrevChar != '\n' && PrevChar != '\r')
     Result.setFlag(Token::LeadingSpace);
 
-  // If the next token is obviously a // or /* */ comment, skip it efficiently
-  // too (without going through the big switch stmt).
-  if (Char == '/' && CurPtr[1] == '/' && !KeepCommentMode) {
-    BufferPtr = CurPtr;
-    SkipBCPLComment(Result, CurPtr+1);
-    return;
-  }
-  if (Char == '/' && CurPtr[1] == '*' && !KeepCommentMode) {
-    BufferPtr = CurPtr;
-    SkipBlockComment(Result, CurPtr+2);
-    return;
-  }
   BufferPtr = CurPtr;
 }
 
@@ -707,16 +695,6 @@
   Result.setFlag(Token::StartOfLine);
   // No leading whitespace seen so far.
   Result.clearFlag(Token::LeadingSpace);
-    
-  // It is common for the tokens immediately after a // comment to be
-  // whitespace (indentation for the next line).  Instead of going through the
-  // big switch, handle it efficiently now.
-  if (isWhitespace(*CurPtr)) {
-    Result.setFlag(Token::LeadingSpace);
-    SkipWhitespace(Result, CurPtr+1);
-    return true;
-  }
-
   BufferPtr = CurPtr;
   return true;
 }
@@ -1145,8 +1123,24 @@
   case '\t':
   case '\f':
   case '\v':
+  SkipHorizontalWhitespace:
     Result.setFlag(Token::LeadingSpace);
     SkipWhitespace(Result, CurPtr);
+
+  SkipIgnoredUnits:
+    CurPtr = BufferPtr;
+    
+    // If the next token is obviously a // or /* */ comment, skip it efficiently
+    // too (without going through the big switch stmt).
+    if (CurPtr[0] == '/' && CurPtr[1] == '/' && !KeepCommentMode) {
+      SkipBCPLComment(Result, CurPtr+2);
+      goto SkipIgnoredUnits;
+    } else if (CurPtr[0] == '/' && CurPtr[1] == '*' && !KeepCommentMode) {
+      SkipBlockComment(Result, CurPtr+2);
+      goto SkipIgnoredUnits;
+    } else if (isHorizontalWhitespace(*CurPtr)) {
+      goto SkipHorizontalWhitespace;
+    }
     goto LexNextToken;   // GCC isn't tail call eliminating.
 
   case 'L':
@@ -1306,8 +1300,12 @@
     // 6.4.9: Comments
     Char = getCharAndSize(CurPtr, SizeTmp);
     if (Char == '/') {         // BCPL comment.
-      if (SkipBCPLComment(Result, ConsumeChar(CurPtr, SizeTmp, Result)))
-        goto LexNextToken;   // GCC isn't tail call eliminating.
+      if (SkipBCPLComment(Result, ConsumeChar(CurPtr, SizeTmp, Result))) {
+        // It is common for the tokens immediately after a // comment to be
+        // whitespace (indentation for the next line).  Instead of going through the
+        // big switch, handle it efficiently now.
+        goto SkipIgnoredUnits;
+      }        
       return; // KeepCommentMode
     } else if (Char == '*') {  // /**/ comment.
       if (SkipBlockComment(Result, ConsumeChar(CurPtr, SizeTmp, Result)))





More information about the cfe-commits mailing list