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:
parent
4b4446be7c
commit
c9b03bcc5d
|
@ -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);
|
||||
|
|
|
@ -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();
|
||||
}
|
||||
|
||||
//===----------------------------------------------------------------------===//
|
||||
|
|
Loading…
Reference in New Issue