From: Ted Kremenek Date: Wed, 17 Dec 2008 23:52:11 +0000 (+0000) Subject: Rewrite PTHLexer::DiscardToEndOfLine() to not use GetToken and instead only read... X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=74c3e6e5e95af08096aab415d1ce15f15ffff02a;p=clang Rewrite PTHLexer::DiscardToEndOfLine() to not use GetToken and instead only read the bytes needed to determine if a token is not at the start of the line. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@61172 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/Lex/PTHLexer.cpp b/lib/Lex/PTHLexer.cpp index 9a883b0172..c05b4b0010 100644 --- a/lib/Lex/PTHLexer.cpp +++ b/lib/Lex/PTHLexer.cpp @@ -131,15 +131,24 @@ void PTHLexer::DiscardToEndOfLine() { assert(ParsingPreprocessorDirective && ParsingFilename == false && "Must be in a preprocessing directive!"); - // Already at end-of-file? - if (AtLastToken()) - return; - - // Find the first token that is not the start of the *current* line. - Token T; - for (Lex(T); !AtLastToken(); Lex(T)) - if (GetToken().isAtStartOfLine()) - return; + // Skip tokens by only peeking at their token kind and the flags. + // We don't need to actually reconstruct full tokens from the token buffer. + // This saves some copies and it also reduces IdentifierInfo* lookup. + const char* p = CurPtr; + while (1) { + // Read the token kind. Are we at the end of the file? + tok::TokenKind x = (tok::TokenKind) (uint8_t) *p; + if (x == tok::eof) break; + + // Read the token flags. Are we at the start of the next line? + Token::TokenFlags y = (Token::TokenFlags) (uint8_t) p[1]; + if (y == Token::StartOfLine) break; + + // Skip to the next token. + p += DISK_TOKEN_SIZE; + } + + CurPtr = p; } //===----------------------------------------------------------------------===//