]> granicus.if.org Git - clang/commitdiff
Rewrite PTHLexer::DiscardToEndOfLine() to not use GetToken and instead only read...
authorTed Kremenek <kremenek@apple.com>
Wed, 17 Dec 2008 23:52:11 +0000 (23:52 +0000)
committerTed Kremenek <kremenek@apple.com>
Wed, 17 Dec 2008 23:52:11 +0000 (23:52 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@61172 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Lex/PTHLexer.cpp

index 9a883b01722a09ee56caad2555acff4ce4cabc80..c05b4b001042f3a76d0aa8e286dc24db0194a4f7 100644 (file)
@@ -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;
 }
 
 //===----------------------------------------------------------------------===//