]> granicus.if.org Git - clang/commitdiff
Using llvm::OwningPtr<> for CurLexer and CurTokenLexer. This makes both the ownershi...
authorTed Kremenek <kremenek@apple.com>
Thu, 13 Nov 2008 17:11:24 +0000 (17:11 +0000)
committerTed Kremenek <kremenek@apple.com>
Thu, 13 Nov 2008 17:11:24 +0000 (17:11 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@59249 91177308-0d34-0410-b5e6-96231b3b80d8

include/clang/Lex/Preprocessor.h
lib/Lex/PPLexerChange.cpp
lib/Lex/Preprocessor.cpp

index 9f8494eef48c93261d950588e846546cf6886acc..47ada4fe1a2a05049e93960cebb63c46a1d89ac8 100644 (file)
@@ -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<Lexer> 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<TokenLexer> 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();
   }
   
index 99d1ca0a91fbc24c721871d56c7f628bb54b9336..0b2211b107f47ab7e5c1a04d0cfbb225f9cbb907 100644 (file)
@@ -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();
index 901bcd08ce3a50988250c04c9b32f8591a1ed746..c65b5462098987f71926ff1522b61df485e3cb3c 100644 (file)
@@ -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;