[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