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 | 56ef550c5eeea0714c635782776389df2a177584 (patch) | |
tree | b9459db3b2078607819429dd7d93a7e1139e52a0 /lib/AST/DeclTemplate.cpp | |
parent | 9cbb4d81b98ee84795e267d51c1fa530ef6723bf (diff) |
Clarify TemplateArgumentList ownership over its "flat" and
"structure" arg lists, the first step to fixing some massive
memory leaks.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@104191 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/AST/DeclTemplate.cpp')
-rw-r--r-- | lib/AST/DeclTemplate.cpp | 32 |
1 files changed, 20 insertions, 12 deletions
diff --git a/lib/AST/DeclTemplate.cpp b/lib/AST/DeclTemplate.cpp index cf4a242df7..fe17399155 100644 --- a/lib/AST/DeclTemplate.cpp +++ b/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(); } //===----------------------------------------------------------------------===// |