From 03569eaabceb14a20e23d043135fdccbc7309a96 Mon Sep 17 00:00:00 2001 From: Argyrios Kyrtzidis Date: Mon, 12 Jul 2010 18:49:30 +0000 Subject: [PATCH] If we are past tok::eof and in caching lex mode, avoid caching repeated tok::eofs. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@108175 91177308-0d34-0410-b5e6-96231b3b80d8 --- include/clang/Lex/Preprocessor.h | 6 +++++- lib/Lex/PPCaching.cpp | 16 ++++++++++++---- 2 files changed, 17 insertions(+), 5 deletions(-) diff --git a/include/clang/Lex/Preprocessor.h b/include/clang/Lex/Preprocessor.h index f90cb0a687..6c9b9fb96e 100644 --- a/include/clang/Lex/Preprocessor.h +++ b/include/clang/Lex/Preprocessor.h @@ -871,7 +871,11 @@ private: //===--------------------------------------------------------------------===// // Caching stuff. void CachingLex(Token &Result); - bool InCachingLexMode() const { return CurPPLexer == 0 && CurTokenLexer == 0;} + bool InCachingLexMode() const { + // If the Lexer pointers are 0 and IncludeMacroStack is empty, it means + // that we are past EOF, not that we are in CachingLex mode. + return CurPPLexer == 0 && CurTokenLexer == 0 && !IncludeMacroStack.empty(); + } void EnterCachingLexMode(); void ExitCachingLexMode() { if (InCachingLexMode()) diff --git a/lib/Lex/PPCaching.cpp b/lib/Lex/PPCaching.cpp index 20e3b3dd9d..16fcaa365c 100644 --- a/lib/Lex/PPCaching.cpp +++ b/lib/Lex/PPCaching.cpp @@ -45,13 +45,19 @@ void Preprocessor::Backtrack() { } void Preprocessor::CachingLex(Token &Result) { + if (!InCachingLexMode()) + return; + if (CachedLexPos < CachedTokens.size()) { Result = CachedTokens[CachedLexPos++]; return; } ExitCachingLexMode(); - Lex(Result); + // True if we consumed everything already. + bool PastEOF = CurPPLexer == 0 && CurTokenLexer == 0; + if (!PastEOF) + Lex(Result); if (!isBacktrackEnabled()) { // All cached tokens were consumed. @@ -60,10 +66,12 @@ void Preprocessor::CachingLex(Token &Result) { return; } - // Cache the lexed token. + // Cache the lexed token if it's not a repeated tok::eof. EnterCachingLexMode(); - CachedTokens.push_back(Result); - ++CachedLexPos; + if (!PastEOF) { + CachedTokens.push_back(Result); + ++CachedLexPos; + } } void Preprocessor::EnterCachingLexMode() { -- 2.40.0