From caaa7df2c78bbd40197823034c0275f3dcbd63e7 Mon Sep 17 00:00:00 2001 From: Ted Kremenek Date: Thu, 13 Nov 2008 17:11:24 +0000 Subject: [PATCH] Using llvm::OwningPtr<> for CurLexer and CurTokenLexer. This makes both the ownership semantics of these objects explicit within the Preprocessor and also tightens up the code (explicit deletes not needed). git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@59249 91177308-0d34-0410-b5e6-96231b3b80d8 --- include/clang/Lex/Preprocessor.h | 17 ++++++++--------- lib/Lex/PPLexerChange.cpp | 28 +++++++++++++--------------- lib/Lex/Preprocessor.cpp | 3 --- 3 files changed, 21 insertions(+), 27 deletions(-) diff --git a/include/clang/Lex/Preprocessor.h b/include/clang/Lex/Preprocessor.h index 9f8494eef4..47ada4fe1a 100644 --- a/include/clang/Lex/Preprocessor.h +++ b/include/clang/Lex/Preprocessor.h @@ -20,6 +20,7 @@ #include "clang/Basic/IdentifierTable.h" #include "clang/Basic/SourceLocation.h" #include "llvm/ADT/DenseMap.h" +#include "llvm/ADT/OwningPtr.h" namespace clang { @@ -93,7 +94,7 @@ class Preprocessor { /// CurLexer - This is the current top of the stack that we're lexing from if /// not expanding a macro. One of CurLexer and CurTokenLexer must be null. - Lexer *CurLexer; + llvm::OwningPtr CurLexer; /// CurLookup - The DirectoryLookup structure used to find the current /// FileEntry, if CurLexer is non-null and if applicable. This allows us to @@ -102,7 +103,7 @@ class Preprocessor { /// CurTokenLexer - This is the current macro we are expanding, if we are /// expanding a macro. One of CurLexer and CurTokenLexer must be null. - TokenLexer *CurTokenLexer; + llvm::OwningPtr CurTokenLexer; /// IncludeMacroStack - This keeps track of the stack of files currently /// #included, and macros currently being expanded from, not counting @@ -191,7 +192,7 @@ public: /// isCurrentLexer - Return true if we are lexing directly from the specified /// lexer. bool isCurrentLexer(const Lexer *L) const { - return CurLexer == L; + return CurLexer.get() == L; } /// getCurrentLexer - Return the current file lexer being lexed from. Note @@ -484,16 +485,14 @@ public: private: void PushIncludeMacroStack() { - IncludeMacroStack.push_back(IncludeStackInfo(CurLexer, CurDirLookup, - CurTokenLexer)); - CurLexer = 0; - CurTokenLexer = 0; + IncludeMacroStack.push_back(IncludeStackInfo(CurLexer.take(), CurDirLookup, + CurTokenLexer.take())); } void PopIncludeMacroStack() { - CurLexer = IncludeMacroStack.back().TheLexer; + CurLexer.reset(IncludeMacroStack.back().TheLexer); CurDirLookup = IncludeMacroStack.back().TheDirLookup; - CurTokenLexer = IncludeMacroStack.back().TheTokenLexer; + CurTokenLexer.reset(IncludeMacroStack.back().TheTokenLexer); IncludeMacroStack.pop_back(); } diff --git a/lib/Lex/PPLexerChange.cpp b/lib/Lex/PPLexerChange.cpp index 99d1ca0a91..0b2211b107 100644 --- a/lib/Lex/PPLexerChange.cpp +++ b/lib/Lex/PPLexerChange.cpp @@ -48,7 +48,7 @@ bool Preprocessor::isInPrimaryFile() const { /// that this ignores any potentially active macro expansions and _Pragma /// expansions going on at the time. Lexer *Preprocessor::getCurrentFileLexer() const { - if (CurLexer && !CurLexer->Is_PragmaLexer) return CurLexer; + if (CurLexer && !CurLexer->Is_PragmaLexer) return CurLexer.get(); // Look for a stacked lexer. for (unsigned i = IncludeMacroStack.size(); i != 0; --i) { @@ -88,7 +88,7 @@ void Preprocessor::EnterSourceFileWithLexer(Lexer *TheLexer, if (CurLexer || CurTokenLexer) PushIncludeMacroStack(); - CurLexer = TheLexer; + CurLexer.reset(TheLexer); CurDirLookup = CurDir; // Notify the client, if desired, that we are in a new source file. @@ -110,9 +110,9 @@ void Preprocessor::EnterMacro(Token &Tok, MacroArgs *Args) { CurDirLookup = 0; if (NumCachedTokenLexers == 0) { - CurTokenLexer = new TokenLexer(Tok, Args, *this); + CurTokenLexer.reset(new TokenLexer(Tok, Args, *this)); } else { - CurTokenLexer = TokenLexerCache[--NumCachedTokenLexers]; + CurTokenLexer.reset(TokenLexerCache[--NumCachedTokenLexers]); CurTokenLexer->Init(Tok, Args); } } @@ -138,10 +138,10 @@ void Preprocessor::EnterTokenStream(const Token *Toks, unsigned NumToks, // Create a macro expander to expand from the specified token stream. if (NumCachedTokenLexers == 0) { - CurTokenLexer = new TokenLexer(Toks, NumToks, DisableMacroExpansion, - OwnsTokens, *this); + CurTokenLexer.reset(new TokenLexer(Toks, NumToks, DisableMacroExpansion, + OwnsTokens, *this)); } else { - CurTokenLexer = TokenLexerCache[--NumCachedTokenLexers]; + CurTokenLexer.reset(TokenLexerCache[--NumCachedTokenLexers]); CurTokenLexer->Init(Toks, NumToks, DisableMacroExpansion, OwnsTokens); } } @@ -204,8 +204,7 @@ bool Preprocessor::HandleEndOfFile(Token &Result, bool isEndOfMacro) { CurLexer->FormTokenWithChars(Result, EndPos, tok::eof); // We're done with the #included file. - delete CurLexer; - CurLexer = 0; + CurLexer.reset(); // This is the end of the top-level file. If the diag::pp_macro_not_used // diagnostic is enabled, look for macros that have not been used. @@ -227,12 +226,11 @@ bool Preprocessor::HandleEndOfTokenLexer(Token &Result) { // Delete or cache the now-dead macro expander. if (NumCachedTokenLexers == TokenLexerCacheSize) - delete CurTokenLexer; + CurTokenLexer.reset(); else - TokenLexerCache[NumCachedTokenLexers++] = CurTokenLexer; + TokenLexerCache[NumCachedTokenLexers++] = CurTokenLexer.take(); // Handle this like a #include file being popped off the stack. - CurTokenLexer = 0; return HandleEndOfFile(Result, true); } @@ -245,11 +243,11 @@ void Preprocessor::RemoveTopOfLexerStack() { if (CurTokenLexer) { // Delete or cache the now-dead macro expander. if (NumCachedTokenLexers == TokenLexerCacheSize) - delete CurTokenLexer; + CurTokenLexer.reset(); else - TokenLexerCache[NumCachedTokenLexers++] = CurTokenLexer; + TokenLexerCache[NumCachedTokenLexers++] = CurTokenLexer.take(); } else { - delete CurLexer; + CurLexer.reset(); } PopIncludeMacroStack(); diff --git a/lib/Lex/Preprocessor.cpp b/lib/Lex/Preprocessor.cpp index 901bcd08ce..c65b546209 100644 --- a/lib/Lex/Preprocessor.cpp +++ b/lib/Lex/Preprocessor.cpp @@ -87,9 +87,6 @@ Preprocessor::Preprocessor(Diagnostic &diags, const LangOptions &opts, Preprocessor::~Preprocessor() { assert(BacktrackPositions.empty() && "EnableBacktrack/Backtrack imbalance!"); - // Free any active lexers. - delete CurLexer; - while (!IncludeMacroStack.empty()) { delete IncludeMacroStack.back().TheLexer; delete IncludeMacroStack.back().TheTokenLexer;