diff options
author | Chris Lattner <sabre@nondot.org> | 2010-05-20 00:11:47 +0000 |
---|---|---|
committer | Chris Lattner <sabre@nondot.org> | 2010-05-20 00:11:47 +0000 |
commit | c9b03bcc5d907103f0eafdae5d2a6938a47f8d11 (patch) | |
tree | f812b89046ab4c1d7091afa4fbc676e791585643 /clang/lib/AST/DeclTemplate.cpp | |
parent | 4b4446be7cb26f3279dd391db7b8bc2c9fcafca5 (diff) | |
download | bcm5719-llvm-c9b03bcc5d907103f0eafdae5d2a6938a47f8d11.tar.gz bcm5719-llvm-c9b03bcc5d907103f0eafdae5d2a6938a47f8d11.zip |
Clarify TemplateArgumentList ownership over its "flat" and
"structure" arg lists, the first step to fixing some massive
memory leaks.
llvm-svn: 104191
Diffstat (limited to 'clang/lib/AST/DeclTemplate.cpp')
-rw-r--r-- | clang/lib/AST/DeclTemplate.cpp | 32 |
1 files changed, 20 insertions, 12 deletions
diff --git a/clang/lib/AST/DeclTemplate.cpp b/clang/lib/AST/DeclTemplate.cpp index cf4a242df79..fe173991559 100644 --- a/clang/lib/AST/DeclTemplate.cpp +++ b/clang/lib/AST/DeclTemplate.cpp @@ -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(); } //===----------------------------------------------------------------------===// |