aboutsummaryrefslogtreecommitdiff
path: root/lib/AST/DeclTemplate.cpp
diff options
context:
space:
mode:
authorChris Lattner <sabre@nondot.org>2010-05-20 00:11:47 +0000
committerChris Lattner <sabre@nondot.org>2010-05-20 00:11:47 +0000
commit56ef550c5eeea0714c635782776389df2a177584 (patch)
treeb9459db3b2078607819429dd7d93a7e1139e52a0 /lib/AST/DeclTemplate.cpp
parent9cbb4d81b98ee84795e267d51c1fa530ef6723bf (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.cpp32
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();
}
//===----------------------------------------------------------------------===//