From 0b7ebb3dba0df0a6cbf221e5edbc6a4b8848478c Mon Sep 17 00:00:00 2001 From: Chris Lattner Date: Fri, 20 Feb 2009 06:03:09 +0000 Subject: [PATCH] move more objc destruction out of dtors into Destroy. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@65112 91177308-0d34-0410-b5e6-96231b3b80d8 --- include/clang/AST/DeclObjC.h | 48 ++++++++++---------------------- lib/AST/DeclObjC.cpp | 53 ++++++++++++++++++++++++++++-------- 2 files changed, 56 insertions(+), 45 deletions(-) diff --git a/include/clang/AST/DeclObjC.h b/include/clang/AST/DeclObjC.h index 309b33ff99..2d1a13c8dd 100644 --- a/include/clang/AST/DeclObjC.h +++ b/include/clang/AST/DeclObjC.h @@ -261,7 +261,7 @@ public: IdentifierInfo *Id) : NamedDecl(DK, DC, L, Id), DeclContext(DK) {} - virtual ~ObjCContainerDecl(); + virtual ~ObjCContainerDecl() {} // Iterator access to properties. typedef specific_decl_iterator prop_iterator; @@ -382,16 +382,11 @@ class ObjCInterfaceDecl : public ObjCContainerDecl { SourceLocation EndLoc; // marks the '>', '}', or identifier. ObjCInterfaceDecl(DeclContext *DC, SourceLocation atLoc, IdentifierInfo *Id, - SourceLocation CLoc, bool FD, bool isInternal) - : ObjCContainerDecl(ObjCInterface, DC, atLoc, Id), - TypeForDecl(0), SuperClass(0), - Ivars(0), NumIvars(0), - CategoryList(0), - ForwardDecl(FD), InternalInterface(isInternal), - ClassLoc(CLoc) { - } + SourceLocation CLoc, bool FD, bool isInternal); - virtual ~ObjCInterfaceDecl(); + virtual ~ObjCInterfaceDecl() { + assert(Ivars == 0 && "Destroy not called?"); + } public: @@ -648,19 +643,10 @@ class ObjCClassDecl : public Decl { unsigned NumForwardDecls; ObjCClassDecl(DeclContext *DC, SourceLocation L, - ObjCInterfaceDecl **Elts, unsigned nElts) - : Decl(ObjCClass, DC, L) { - if (nElts) { - ForwardDecls = new ObjCInterfaceDecl*[nElts]; - memcpy(ForwardDecls, Elts, nElts*sizeof(ObjCInterfaceDecl*)); - } else { - ForwardDecls = 0; - } - NumForwardDecls = nElts; + ObjCInterfaceDecl **Elts, unsigned nElts); + virtual ~ObjCClassDecl() { + assert(ForwardDecls == 0 && "Destroy not called?"); } - - virtual ~ObjCClassDecl(); - public: /// Destroy - Call destructors and release memory. @@ -695,25 +681,19 @@ class ObjCForwardProtocolDecl : public Decl { unsigned NumReferencedProtocols; ObjCForwardProtocolDecl(DeclContext *DC, SourceLocation L, - ObjCProtocolDecl **Elts, unsigned nElts) - : Decl(ObjCForwardProtocol, DC, L) { - NumReferencedProtocols = nElts; - if (nElts) { - ReferencedProtocols = new ObjCProtocolDecl*[nElts]; - memcpy(ReferencedProtocols, Elts, nElts*sizeof(ObjCProtocolDecl*)); - } else { - ReferencedProtocols = 0; - } + ObjCProtocolDecl **Elts, unsigned nElts); + virtual ~ObjCForwardProtocolDecl() { + assert(ReferencedProtocols == 0 && "Destroy not called?"); } - virtual ~ObjCForwardProtocolDecl(); - public: static ObjCForwardProtocolDecl *Create(ASTContext &C, DeclContext *DC, SourceLocation L, ObjCProtocolDecl **Elts, unsigned Num); - + /// Destroy - Call destructors and release memory. + virtual void Destroy(ASTContext& C); + void setForwardProtocolDecl(unsigned idx, ObjCProtocolDecl *OID) { assert(idx < NumReferencedProtocols && "index out of range"); ReferencedProtocols[idx] = OID; diff --git a/lib/AST/DeclObjC.cpp b/lib/AST/DeclObjC.cpp index 95ba2e0c58..3417a302dc 100644 --- a/lib/AST/DeclObjC.cpp +++ b/lib/AST/DeclObjC.cpp @@ -48,6 +48,7 @@ void ObjCMethodDecl::Destroy(ASTContext& C) { Decl::Destroy(C); } + ObjCInterfaceDecl *ObjCInterfaceDecl::Create(ASTContext &C, DeclContext *DC, SourceLocation atLoc, @@ -58,18 +59,23 @@ ObjCInterfaceDecl *ObjCInterfaceDecl::Create(ASTContext &C, isInternal); } -ObjCContainerDecl::~ObjCContainerDecl() { -} - -ObjCInterfaceDecl::~ObjCInterfaceDecl() { - delete [] Ivars; - // FIXME: CategoryList? +ObjCInterfaceDecl:: +ObjCInterfaceDecl(DeclContext *DC, SourceLocation atLoc, IdentifierInfo *Id, + SourceLocation CLoc, bool FD, bool isInternal) + : ObjCContainerDecl(ObjCInterface, DC, atLoc, Id), + TypeForDecl(0), SuperClass(0), Ivars(0), NumIvars(0), + CategoryList(0), ForwardDecl(FD), InternalInterface(isInternal), + ClassLoc(CLoc) { } -void ObjCInterfaceDecl::Destroy(ASTContext& C) { +void ObjCInterfaceDecl::Destroy(ASTContext &C) { for (ivar_iterator I=ivar_begin(), E=ivar_end(); I!=E; ++I) if (*I) (*I)->Destroy(C); + delete [] Ivars; + Ivars = 0; + // FIXME: CategoryList? + // FIXME: Because there is no clear ownership // role between ObjCInterfaceDecls and the ObjCPropertyDecls that they // reference, we destroy ObjCPropertyDecls in ~TranslationUnit. @@ -116,11 +122,19 @@ ObjCClassDecl *ObjCClassDecl::Create(ASTContext &C, DeclContext *DC, return new (C) ObjCClassDecl(DC, L, Elts, nElts); } -ObjCClassDecl::~ObjCClassDecl() { - delete [] ForwardDecls; +ObjCClassDecl::ObjCClassDecl(DeclContext *DC, SourceLocation L, + ObjCInterfaceDecl **Elts, unsigned nElts) + : Decl(ObjCClass, DC, L) { + if (nElts) { + ForwardDecls = new ObjCInterfaceDecl*[nElts]; + memcpy(ForwardDecls, Elts, nElts*sizeof(ObjCInterfaceDecl*)); + } else { + ForwardDecls = 0; + } + NumForwardDecls = nElts; } -void ObjCClassDecl::Destroy(ASTContext& C) { +void ObjCClassDecl::Destroy(ASTContext &C) { // FIXME: There is no clear ownership policy now for referenced // ObjCInterfaceDecls. Some of them can be forward declarations that @@ -130,6 +144,9 @@ void ObjCClassDecl::Destroy(ASTContext& C) { // obviating this problem. Because of this situation, referenced // ObjCInterfaceDecls are destroyed in ~TranslationUnit. + delete [] ForwardDecls; + ForwardDecls = 0; + Decl::Destroy(C); } @@ -140,8 +157,22 @@ ObjCForwardProtocolDecl::Create(ASTContext &C, DeclContext *DC, return new (C) ObjCForwardProtocolDecl(DC, L, Elts, NumElts); } -ObjCForwardProtocolDecl::~ObjCForwardProtocolDecl() { +ObjCForwardProtocolDecl:: +ObjCForwardProtocolDecl(DeclContext *DC, SourceLocation L, + ObjCProtocolDecl **Elts, unsigned nElts) + : Decl(ObjCForwardProtocol, DC, L) { + NumReferencedProtocols = nElts; + if (nElts) { + ReferencedProtocols = new ObjCProtocolDecl*[nElts]; + memcpy(ReferencedProtocols, Elts, nElts*sizeof(ObjCProtocolDecl*)); + } else { + ReferencedProtocols = 0; + } +} + +void ObjCForwardProtocolDecl::Destroy(ASTContext &C) { delete [] ReferencedProtocols; + ReferencedProtocols = 0; } ObjCCategoryDecl *ObjCCategoryDecl::Create(ASTContext &C, DeclContext *DC, -- 2.40.0