From: Ted Kremenek Date: Fri, 6 Jun 2008 21:05:33 +0000 (+0000) Subject: Reclaim memory owned by ObjCForwardProtocolDecls. X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=05ac3ef08f9d06e0a4439073c9edabf7f912f946;p=clang Reclaim memory owned by ObjCForwardProtocolDecls. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@52063 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/include/clang/AST/DeclObjC.h b/include/clang/AST/DeclObjC.h index 1582d73ee8..be1e888242 100644 --- a/include/clang/AST/DeclObjC.h +++ b/include/clang/AST/DeclObjC.h @@ -692,6 +692,9 @@ class ObjCForwardProtocolDecl : public Decl { ReferencedProtocols = 0; } } + + virtual ~ObjCForwardProtocolDecl(); + public: static ObjCForwardProtocolDecl *Create(ASTContext &C, SourceLocation L, ObjCProtocolDecl **Elts, unsigned Num); @@ -713,6 +716,10 @@ public: return ReferencedProtocols[idx]; } + typedef ObjCProtocolDecl * const * iterator; + iterator begin() const { return ReferencedProtocols; } + iterator end() const { return ReferencedProtocols+NumReferencedProtocols; } + static bool classof(const Decl *D) { return D->getKind() == ObjCForwardProtocol; } diff --git a/lib/AST/DeclObjC.cpp b/lib/AST/DeclObjC.cpp index 08df62d5b9..ce9379f19c 100644 --- a/lib/AST/DeclObjC.cpp +++ b/lib/AST/DeclObjC.cpp @@ -159,6 +159,10 @@ ObjCForwardProtocolDecl::Create(ASTContext &C, return new (Mem) ObjCForwardProtocolDecl(L, Elts, NumElts); } +ObjCForwardProtocolDecl::~ObjCForwardProtocolDecl() { + delete [] ReferencedProtocols; +} + ObjCCategoryDecl *ObjCCategoryDecl::Create(ASTContext &C, SourceLocation L, IdentifierInfo *Id) { diff --git a/lib/AST/TranslationUnit.cpp b/lib/AST/TranslationUnit.cpp index 5e644cf983..c3d709f035 100644 --- a/lib/AST/TranslationUnit.cpp +++ b/lib/AST/TranslationUnit.cpp @@ -66,8 +66,9 @@ TranslationUnit::~TranslationUnit() { // FIXME: There is no clear ownership policy now for ObjCInterfaceDecls // referenced by ObjCClassDecls. Some of them can be forward decls that - // are never later defined (in which case the ObjCClassDecl owns them) - // or the ObjCInterfaceDecl later becomes a real definition later. + // are never later defined (and forward decls can be referenced by + // multiple ObjCClassDecls) or the ObjCInterfaceDecl later + // becomes a real definition. // Ideally we should have separate objects for forward declarations and // definitions, obviating this problem. Because of this situation, // referenced ObjCInterfaceDecls are destroyed here. @@ -78,6 +79,23 @@ TranslationUnit::~TranslationUnit() { Killed.insert(*ID); (*ID)->Destroy(*Context); } + + // FIXME: There is no clear ownership policy now for ObjCProtocolDecls + // referenced by ObjCForwardProtocolDecl. Some of them can be forward + // decls that are never later defined (and forward decls can be + // referenced by multiple ObjCClassDecls) or the ObjCProtocolDecl + // later becomes a real definition. + // Ideally we should have separate objects for forward declarations and + // definitions, obviating this problem. Because of this situation, + // referenced ObjCProtocolDecls are destroyed here. + if (ObjCForwardProtocolDecl* FDec = dyn_cast(*I)) + for (ObjCForwardProtocolDecl::iterator ID=FDec->begin(), + ED=FDec->end(); ID!=ED; ++ID) { + if (!*ID || Killed.count(*ID)) continue; + Killed.insert(*ID); + (*ID)->Destroy(*Context); + } + (*I)->Destroy(*Context); }