Simplify MacroInfo lifetime management. We don't need three different functions
authorRichard Smith <richard-llvm@metafoo.co.uk>
Thu, 24 Jul 2014 03:25:00 +0000 (03:25 +0000)
committerRichard Smith <richard-llvm@metafoo.co.uk>
Thu, 24 Jul 2014 03:25:00 +0000 (03:25 +0000)
to destroy one of these.

llvm-svn: 213837

clang/include/clang/Lex/MacroInfo.h
clang/lib/Lex/PPDirectives.cpp
clang/lib/Lex/Preprocessor.cpp

index e9a66e8..5dc4095 100644 (file)
@@ -45,7 +45,7 @@ class MacroInfo {
 
   /// \see ArgumentList
   unsigned NumArguments;
-  
+
   /// \brief This is the list of tokens that the macro is defined to.
   SmallVector<Token, 8> ReplacementTokens;
 
@@ -78,8 +78,7 @@ class MacroInfo {
 
   /// \brief Whether this macro contains the sequence ", ## __VA_ARGS__"
   bool HasCommaPasting : 1;
-  
-private:
+
   //===--------------------------------------------------------------------===//
   // State that changes as the macro is used.
 
@@ -107,28 +106,11 @@ private:
   /// \brief Whether this macro was used as header guard.
   bool UsedForHeaderGuard : 1;
 
-  ~MacroInfo() {
-    assert(!ArgumentList && "Didn't call destroy before dtor!");
-  }
-
-public:
+  // Only the Preprocessor gets to create and destroy these.
   MacroInfo(SourceLocation DefLoc);
-  
-  /// \brief Free the argument list of the macro.
-  ///
-  /// This restores this MacroInfo to a state where it can be reused for other
-  /// devious purposes.
-  void FreeArgumentList() {
-    ArgumentList = nullptr;
-    NumArguments = 0;
-  }
-
-  /// \brief Destroy this MacroInfo object.
-  void Destroy() {
-    FreeArgumentList();
-    this->~MacroInfo();
-  }
+  ~MacroInfo() {}
 
+public:
   /// \brief Return the location that the macro was defined at.
   SourceLocation getDefinitionLoc() const { return Location; }
 
index c38080f..d7ed0b4 100644 (file)
@@ -85,10 +85,11 @@ Preprocessor::AllocateVisibilityMacroDirective(SourceLocation Loc,
   return MD;
 }
 
-/// \brief Release the specified MacroInfo to be reused for allocating
-/// new MacroInfo objects.
+/// \brief Clean up a MacroInfo that was allocated but not used due to an
+/// error in the macro definition.
 void Preprocessor::ReleaseMacroInfo(MacroInfo *MI) {
-  MI->Destroy();
+  // Don't try to reuse the storage; this only happens on error paths.
+  MI->~MacroInfo();
 }
 
 /// \brief Read and discard all tokens remaining on the current line until
index 963b715..ab11fab 100644 (file)
@@ -141,9 +141,11 @@ Preprocessor::~Preprocessor() {
 
   IncludeMacroStack.clear();
 
-  // Free any macro definitions.
-  for (MacroInfoChain *I = MIChainHead; I; I = I->Next)
-    I->MI.Destroy();
+  // Destroy any macro definitions.
+  while (MacroInfoChain *I = MIChainHead) {
+    MIChainHead = I->Next;
+    I->~MacroInfoChain();
+  }
 
   // Free any cached macro expanders.
   // This populates MacroArgCache, so all TokenLexers need to be destroyed
@@ -152,8 +154,10 @@ Preprocessor::~Preprocessor() {
     delete TokenLexerCache[i];
   CurTokenLexer.reset();
 
-  for (DeserializedMacroInfoChain *I = DeserialMIChainHead ; I ; I = I->Next)
-    I->MI.Destroy();
+  while (DeserializedMacroInfoChain *I = DeserialMIChainHead) {
+    DeserialMIChainHead = I->Next;
+    I->~DeserializedMacroInfoChain();
+  }
 
   // Free any cached MacroArgs.
   for (MacroArgs *ArgList = MacroArgCache; ArgList;)