From: Richard Smith Date: Thu, 24 Jul 2014 03:25:00 +0000 (+0000) Subject: Simplify MacroInfo lifetime management. We don't need three different functions X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=a7f8a19e47d58465274947c87e2ced657bfd9bd3;p=clang Simplify MacroInfo lifetime management. We don't need three different functions to destroy one of these. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@213837 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/include/clang/Lex/MacroInfo.h b/include/clang/Lex/MacroInfo.h index e9a66e857d..5dc4095943 100644 --- a/include/clang/Lex/MacroInfo.h +++ b/include/clang/Lex/MacroInfo.h @@ -45,7 +45,7 @@ class MacroInfo { /// \see ArgumentList unsigned NumArguments; - + /// \brief This is the list of tokens that the macro is defined to. SmallVector 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; } diff --git a/lib/Lex/PPDirectives.cpp b/lib/Lex/PPDirectives.cpp index c38080f715..d7ed0b4859 100644 --- a/lib/Lex/PPDirectives.cpp +++ b/lib/Lex/PPDirectives.cpp @@ -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 diff --git a/lib/Lex/Preprocessor.cpp b/lib/Lex/Preprocessor.cpp index 963b715716..ab11fabbbc 100644 --- a/lib/Lex/Preprocessor.cpp +++ b/lib/Lex/Preprocessor.cpp @@ -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;)