[cfe-commits] r51299 - in /cfe/trunk: include/clang/AST/Decl.h lib/AST/Decl.cpp
Ted Kremenek
kremenek at apple.com
Mon May 19 21:49:55 PDT 2008
Author: kremenek
Date: Mon May 19 23:49:55 2008
New Revision: 51299
URL: http://llvm.org/viewvc/llvm-project?rev=51299&view=rev
Log:
Reclaim memory from chains of ScopedDecls, and reclaim memory for the initializers of EnumConstantDecls.
Modified:
cfe/trunk/include/clang/AST/Decl.h
cfe/trunk/lib/AST/Decl.cpp
Modified: cfe/trunk/include/clang/AST/Decl.h
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/AST/Decl.h?rev=51299&r1=51298&r2=51299&view=diff
==============================================================================
--- cfe/trunk/include/clang/AST/Decl.h (original)
+++ cfe/trunk/include/clang/AST/Decl.h Mon May 19 23:49:55 2008
@@ -125,6 +125,8 @@
void EmitOutRec(llvm::Serializer& S) const;
void ReadOutRec(llvm::Deserializer& D, ASTContext& C);
+
+ friend void Decl::Destroy(ASTContext& C);
};
/// NamespaceDecl - Represent a C++ namespace.
@@ -150,6 +152,8 @@
public:
static NamespaceDecl *Create(ASTContext &C, DeclContext *DC,
SourceLocation L, IdentifierInfo *Id);
+
+ virtual void Destroy(ASTContext& C);
NamespaceDecl *getNextNamespace() {
return cast_or_null<NamespaceDecl>(getNextDeclarator());
@@ -565,6 +569,8 @@
QualType T, Expr *E,
const llvm::APSInt &V, ScopedDecl *PrevDecl);
+ virtual void Destroy(ASTContext& C);
+
const Expr *getInitExpr() const { return Init; }
Expr *getInitExpr() { return Init; }
const llvm::APSInt &getInitVal() const { return Val; }
@@ -703,6 +709,8 @@
SourceLocation L, IdentifierInfo *Id,
ScopedDecl *PrevDecl);
+ virtual void Destroy(ASTContext& C);
+
/// defineElements - When created, EnumDecl correspond to a forward declared
/// enum. This method is used to mark the decl as being defined, with the
/// specified list of enums.
Modified: cfe/trunk/lib/AST/Decl.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/AST/Decl.cpp?rev=51299&r1=51298&r2=51299&view=diff
==============================================================================
--- cfe/trunk/lib/AST/Decl.cpp (original)
+++ cfe/trunk/lib/AST/Decl.cpp Mon May 19 23:49:55 2008
@@ -226,6 +226,15 @@
return new (Mem) NamespaceDecl(DC, L, Id);
}
+void NamespaceDecl::Destroy(ASTContext& C) {
+ // NamespaceDecl uses "NextDeclarator" to chain namespace declarations
+ // together. They are all top-level Decls.
+
+ this->~Decl();
+ C.getAllocator().Deallocate((void *)this);
+}
+
+
VarDecl *VarDecl::Create(ASTContext &C, DeclContext *DC,
SourceLocation L,
IdentifierInfo *Id, QualType T,
@@ -267,6 +276,11 @@
return new (Mem) EnumConstantDecl(CD, L, Id, T, E, V, PrevDecl);
}
+void EnumConstantDecl::Destroy(ASTContext& C) {
+ if (Init) Init->Destroy(C);
+ Decl::Destroy(C);
+}
+
TypedefDecl *TypedefDecl::Create(ASTContext &C, DeclContext *DC,
SourceLocation L,
IdentifierInfo *Id, QualType T,
@@ -289,6 +303,12 @@
return new (Mem) RecordDecl(DK, DC, L, Id, PrevDecl);
}
+void EnumDecl::Destroy(ASTContext& C) {
+ if (ElementList) ElementList->Destroy(C);
+ Decl::Destroy(C);
+}
+
+
FileScopeAsmDecl *FileScopeAsmDecl::Create(ASTContext &C,
SourceLocation L,
StringLiteral *Str) {
@@ -370,6 +390,23 @@
void Decl::Destroy(ASTContext& C) {
+
+ if (ScopedDecl* SD = dyn_cast<ScopedDecl>(this)) {
+
+ // Observe the unrolled recursion. By setting N->NextDeclarator = 0x0
+ // within the loop, only the Destroy method for the first ScopedDecl
+ // will deallocate all of the ScopedDecls in a chain.
+
+ ScopedDecl* N = SD->getNextDeclarator();
+
+ while (N) {
+ ScopedDecl* Tmp = N->getNextDeclarator();
+ N->NextDeclarator = 0x0;
+ N->Destroy(C);
+ N = Tmp;
+ }
+ }
+
this->~Decl();
C.getAllocator().Deallocate((void *)this);
}
More information about the cfe-commits
mailing list