Clarify TemplateArgumentList ownership over its "flat" and

"structure" arg lists, the first step to fixing some massive
memory leaks.

llvm-svn: 104191
This commit is contained in:
Chris Lattner 2010-05-20 00:11:47 +00:00
parent 4b4446be7c
commit c9b03bcc5d
2 changed files with 25 additions and 15 deletions

View File

@ -131,8 +131,6 @@ public:
void BeginPack();
void EndPack();
void ReleaseArgs();
unsigned flatSize() const {
return NumFlatArgs;
}
@ -165,7 +163,7 @@ class TemplateArgumentList {
/// \brief The template argument list.
///
/// The integer value will be non-zero to indicate that this
/// template argument list does not own the pointer.
/// template argument list does own the pointer.
llvm::PointerIntPair<const TemplateArgument *, 1> FlatArguments;
/// \brief The number of template arguments in this template
@ -176,6 +174,10 @@ class TemplateArgumentList {
unsigned NumStructuredArguments;
public:
/// TemplateArgumentList - If this constructor is passed "true" for 'TakeArgs'
/// it copies them into a locally new[]'d array. If passed "false", then it
/// just references the array passed in. This is only safe if the builder
/// outlives it, but saves a copy.
TemplateArgumentList(ASTContext &Context,
TemplateArgumentListBuilder &Builder,
bool TakeArgs);

View File

@ -353,15 +353,6 @@ void TemplateArgumentListBuilder::EndPack() {
/*CopyArgs=*/false);
}
void TemplateArgumentListBuilder::ReleaseArgs() {
FlatArgs = 0;
NumFlatArgs = 0;
MaxFlatArgs = 0;
StructuredArgs = 0;
NumStructuredArgs = 0;
MaxStructuredArgs = 0;
}
//===----------------------------------------------------------------------===//
// TemplateArgumentList Implementation
//===----------------------------------------------------------------------===//
@ -376,9 +367,23 @@ TemplateArgumentList::TemplateArgumentList(ASTContext &Context,
if (!TakeArgs)
return;
if (Builder.getStructuredArguments() == Builder.getFlatArguments())
// If this does take ownership of the arguments, then we have to new them
// and copy over.
TemplateArgument *NewArgs = new TemplateArgument[Builder.flatSize()];
std::copy(Builder.getFlatArguments(),
Builder.getFlatArguments()+Builder.flatSize(), NewArgs);
FlatArguments.setPointer(NewArgs);
// Just reuse the structured and flat arguments array if possible.
if (Builder.getStructuredArguments() == Builder.getFlatArguments()) {
StructuredArguments.setPointer(NewArgs);
StructuredArguments.setInt(0);
Builder.ReleaseArgs();
} else {
TemplateArgument *NewSArgs = new TemplateArgument[Builder.flatSize()];
std::copy(Builder.getFlatArguments(),
Builder.getFlatArguments()+Builder.flatSize(), NewSArgs);
StructuredArguments.setPointer(NewSArgs);
}
}
TemplateArgumentList::TemplateArgumentList(const TemplateArgumentList &Other)
@ -388,7 +393,10 @@ TemplateArgumentList::TemplateArgumentList(const TemplateArgumentList &Other)
NumStructuredArguments(Other.NumStructuredArguments) { }
TemplateArgumentList::~TemplateArgumentList() {
// FIXME: Deallocate template arguments
if (FlatArguments.getInt())
delete [] FlatArguments.getPointer();
if (StructuredArguments.getInt())
delete [] StructuredArguments.getPointer();
}
//===----------------------------------------------------------------------===//