Simplify MacroInfo lifetime management. We don't need three different functions
to destroy one of these. llvm-svn: 213837
This commit is contained in:
parent
c2c410d7ec
commit
73a29662b9
|
@ -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; }
|
||||
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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;)
|
||||
|
|
Loading…
Reference in New Issue