]> granicus.if.org Git - clang/commitdiff
move some objc decl destruction out of dtors into Destroy method.
authorChris Lattner <sabre@nondot.org>
Fri, 20 Feb 2009 05:54:35 +0000 (05:54 +0000)
committerChris Lattner <sabre@nondot.org>
Fri, 20 Feb 2009 05:54:35 +0000 (05:54 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@65111 91177308-0d34-0410-b5e6-96231b3b80d8

include/clang/AST/DeclObjC.h
lib/AST/DeclObjC.cpp

index 88cf2276c71b9398801074a5e0201ad94600d1ed..309b33ff99bcb1e090bdbf23a420d6cd3faae892 100644 (file)
@@ -151,7 +151,9 @@ private:
     ParamInfo(0), NumMethodParams(0), 
     EndLoc(endLoc), Body(0), SelfDecl(0), CmdDecl(0) {}
 
-  virtual ~ObjCMethodDecl();
+  virtual ~ObjCMethodDecl() {
+    assert(ParamInfo == 0 && "Destroy not called?");
+  }
   
 public:
   
@@ -595,12 +597,17 @@ class ObjCProtocolDecl : public ObjCContainerDecl {
       isForwardProtoDecl(true) {
   }
   
-  virtual ~ObjCProtocolDecl();
+  virtual ~ObjCProtocolDecl() {
+    assert(PropertyDecl == 0 && "Destroy not called?");
+  }
   
 public:
   static ObjCProtocolDecl *Create(ASTContext &C, DeclContext *DC, 
                                   SourceLocation L, IdentifierInfo *Id);
 
+  /// Destroy - Call destructors and release memory.
+  virtual void Destroy(ASTContext& C);
+  
   const ObjCList<ObjCProtocolDecl> &getReferencedProtocols() const { 
     return ReferencedProtocols;
   }
index 506d3e4c3877e7b63399ab098230c531d13f6122..95ba2e0c5831b9cbef54888e60b4b1a857bba926 100644 (file)
@@ -35,17 +35,16 @@ ObjCMethodDecl *ObjCMethodDecl::Create(ASTContext &C,
                                   isVariadic, isSynthesized, impControl);
 }
 
-ObjCMethodDecl::~ObjCMethodDecl() {  
-  delete [] ParamInfo;
-}
-
 void ObjCMethodDecl::Destroy(ASTContext& C) {
   if (Body) Body->Destroy(C);
   if (SelfDecl) SelfDecl->Destroy(C);
   
   for (param_iterator I=param_begin(), E=param_end(); I!=E; ++I)
     if (*I) (*I)->Destroy(C);
-  
+
+  delete [] ParamInfo;
+  ParamInfo = 0;
+
   Decl::Destroy(C);
 }
 
@@ -102,11 +101,15 @@ ObjCProtocolDecl *ObjCProtocolDecl::Create(ASTContext &C, DeclContext *DC,
   return new (C) ObjCProtocolDecl(DC, L, Id);
 }
 
-ObjCProtocolDecl::~ObjCProtocolDecl() {
+void ObjCProtocolDecl::Destroy(ASTContext &C) {
   delete [] PropertyDecl;
+  PropertyDecl = 0;
+  ObjCContainerDecl::Destroy(C);
 }
 
 
+
+
 ObjCClassDecl *ObjCClassDecl::Create(ASTContext &C, DeclContext *DC,
                                      SourceLocation L,
                                      ObjCInterfaceDecl **Elts, unsigned nElts) {