Simplify MacroInfo lifetime management. We don't need three different functions

to destroy one of these.

llvm-svn: 213837
This commit is contained in:
Richard Smith 2014-07-24 03:25:00 +00:00
parent c2c410d7ec
commit 73a29662b9
3 changed files with 18 additions and 31 deletions

View 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!");
}
// Only the Preprocessor gets to create and destroy these.
MacroInfo(SourceLocation DefLoc);
~MacroInfo() {}
public:
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();
}
/// \brief Return the location that the macro was defined at.
SourceLocation getDefinitionLoc() const { return Location; }

View 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

View 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;)