diff --git a/clang/include/clang/Lex/MacroInfo.h b/clang/include/clang/Lex/MacroInfo.h index 7e0125f496d0..a09c564fd9c6 100644 --- a/clang/include/clang/Lex/MacroInfo.h +++ b/clang/include/clang/Lex/MacroInfo.h @@ -76,7 +76,12 @@ public: MacroInfo(SourceLocation DefLoc); ~MacroInfo() { + assert(ArgumentList == 0 && "Didn't call destroy before dtor!"); + } + + void Destroy() { delete[] ArgumentList; + ArgumentList = 0; } /// getDefinitionLoc - Return the location that the macro was defined at. diff --git a/clang/include/clang/Lex/Preprocessor.h b/clang/include/clang/Lex/Preprocessor.h index 1608466fe2ef..a0ed1767df34 100644 --- a/clang/include/clang/Lex/Preprocessor.h +++ b/clang/include/clang/Lex/Preprocessor.h @@ -579,9 +579,7 @@ private: /// ReleaseMacroInfo - Release the specified MacroInfo. This memory will /// be reused for allocating new MacroInfo objects. - void ReleaseMacroInfo(MacroInfo* MI) { - MICache.push_back(MI); - } + void ReleaseMacroInfo(MacroInfo* MI); /// isInPrimaryFile - Return true if we're in the top-level file, not in a /// #include. diff --git a/clang/lib/Lex/PPDirectives.cpp b/clang/lib/Lex/PPDirectives.cpp index c38310b925f9..5a100995b8a6 100644 --- a/clang/lib/Lex/PPDirectives.cpp +++ b/clang/lib/Lex/PPDirectives.cpp @@ -24,18 +24,26 @@ using namespace clang; // Utility Methods for Preprocessor Directive Handling. //===----------------------------------------------------------------------===// -MacroInfo* Preprocessor::AllocateMacroInfo(SourceLocation L) { +MacroInfo *Preprocessor::AllocateMacroInfo(SourceLocation L) { MacroInfo *MI; if (!MICache.empty()) { MI = MICache.back(); MICache.pop_back(); - } - else MI = (MacroInfo*) BP.Allocate(); + } else + MI = (MacroInfo*) BP.Allocate(); new (MI) MacroInfo(L); return MI; } +/// ReleaseMacroInfo - Release the specified MacroInfo. This memory will +/// be reused for allocating new MacroInfo objects. +void Preprocessor::ReleaseMacroInfo(MacroInfo* MI) { + MICache.push_back(MI); + MI->Destroy(); +} + + /// DiscardUntilEndOfDirective - Read and discard all tokens remaining on the /// current line until the tok::eom token is found. void Preprocessor::DiscardUntilEndOfDirective() { diff --git a/clang/lib/Lex/Preprocessor.cpp b/clang/lib/Lex/Preprocessor.cpp index 31a040674f7e..7b34cb65e368 100644 --- a/clang/lib/Lex/Preprocessor.cpp +++ b/clang/lib/Lex/Preprocessor.cpp @@ -101,6 +101,7 @@ Preprocessor::~Preprocessor() { // will be released when the BumpPtrAllocator 'BP' object gets // destroyed. We still need to run the dstor, however, to free // memory alocated by MacroInfo. + I->second->Destroy(); I->second->~MacroInfo(); I->first->setHasMacroDefinition(false); }