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.

llvm-svn: 40384
This commit is contained in:
Chris Lattner 2007-07-22 06:29:05 +00:00
parent 6b4db176ea
commit b9b8597c23
1 changed files with 22 additions and 24 deletions

View File

@ -607,18 +607,6 @@ void Lexer::SkipWhitespace(Token &Result, const char *CurPtr) {
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 @@ bool Lexer::SkipBCPLComment(Token &Result, const char *CurPtr) {
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 @@ LexNextToken:
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 @@ LexNextToken:
// 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)))