[cfe-commits] r65150 - in /cfe/trunk: include/clang/AST/DeclObjC.h lib/AST/DeclObjC.cpp lib/Sema/SemaDecl.cpp

Chris Lattner sabre at nondot.org
Fri Feb 20 12:41:34 PST 2009


Author: lattner
Date: Fri Feb 20 14:41:34 2009
New Revision: 65150

URL: http://llvm.org/viewvc/llvm-project?rev=65150&view=rev
Log:
move the @implementation ivar list to being an ObjCList, which prevents
it from being leaked, among other things.

Modified:
    cfe/trunk/include/clang/AST/DeclObjC.h
    cfe/trunk/lib/AST/DeclObjC.cpp
    cfe/trunk/lib/Sema/SemaDecl.cpp

Modified: cfe/trunk/include/clang/AST/DeclObjC.h
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/AST/DeclObjC.h?rev=65150&r1=65149&r2=65150&view=diff

==============================================================================
--- cfe/trunk/include/clang/AST/DeclObjC.h (original)
+++ cfe/trunk/include/clang/AST/DeclObjC.h Fri Feb 20 14:41:34 2009
@@ -861,9 +861,8 @@
   /// Implementation Class's super class.
   ObjCInterfaceDecl *SuperClass;
     
-  /// Optional Ivars/NumIvars - This is a new[]'d array of pointers to Decls.
-  ObjCIvarDecl **Ivars;   // Null if not specified
-  unsigned NumIvars;      // 0 if none.
+  /// Instance variables declared in the @implementation.
+  ObjCList<ObjCIvarDecl> IVars;
 
   /// implemented instance methods
   llvm::SmallVector<ObjCMethodDecl*, 32> InstanceMethods;
@@ -880,18 +879,20 @@
                          ObjCInterfaceDecl *classInterface,
                          ObjCInterfaceDecl *superDecl)
     : Decl(ObjCImplementation, DC, L), DeclContext(ObjCImplementation),
-      ClassInterface(classInterface), SuperClass(superDecl),
-      Ivars(0), NumIvars(0) {}
+      ClassInterface(classInterface), SuperClass(superDecl){}
 public:  
   static ObjCImplementationDecl *Create(ASTContext &C, DeclContext *DC, 
                                         SourceLocation L, 
                                         ObjCInterfaceDecl *classInterface,
                                         ObjCInterfaceDecl *superDecl);
   
+  /// Destroy - Call destructors and release memory.
+  virtual void Destroy(ASTContext& C);
+
+  void setIVarList(ObjCIvarDecl *const *InArray, unsigned Num) {
+    IVars.set(InArray, Num);
+  }
   
-  void ObjCAddInstanceVariablesToClassImpl(ObjCIvarDecl **ivars, 
-                                           unsigned numIvars);
-    
   void addInstanceMethod(ObjCMethodDecl *method) {
     InstanceMethods.push_back(method);
   }
@@ -963,11 +964,11 @@
     return isInstance ? getInstanceMethod(Sel) : getClassMethod(Sel);
   }
   
-  typedef ObjCIvarDecl * const *ivar_iterator;
-  ivar_iterator ivar_begin() const { return Ivars; }
-  ivar_iterator ivar_end() const { return Ivars+NumIvars; }
-  unsigned ivar_size() const { return NumIvars; }
-  bool ivar_empty() const { return NumIvars == 0; }
+  typedef ObjCList<ObjCIvarDecl>::iterator ivar_iterator;
+  ivar_iterator ivar_begin() const { return IVars.begin(); }
+  ivar_iterator ivar_end() const { return IVars.end(); }
+  unsigned ivar_size() const { return IVars.size(); }
+  bool ivar_empty() const { return IVars.empty(); }
   
   static bool classof(const Decl *D) {
     return D->getKind() == ObjCImplementation;

Modified: cfe/trunk/lib/AST/DeclObjC.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/AST/DeclObjC.cpp?rev=65150&r1=65149&r2=65150&view=diff

==============================================================================
--- cfe/trunk/lib/AST/DeclObjC.cpp (original)
+++ cfe/trunk/lib/AST/DeclObjC.cpp Fri Feb 20 14:41:34 2009
@@ -175,6 +175,12 @@
   return new (C) ObjCImplementationDecl(DC, L, ClassInterface, SuperDecl);
 }
 
+/// Destroy - Call destructors and release memory.
+void ObjCImplementationDecl::Destroy(ASTContext& C) {
+  IVars.clear();
+}
+
+
 ObjCCompatibleAliasDecl *
 ObjCCompatibleAliasDecl::Create(ASTContext &C, DeclContext *DC,
                                 SourceLocation L,
@@ -250,18 +256,6 @@
   return MemberDecl;
 }
 
-/// ObjCAddInstanceVariablesToClassImpl - Checks for correctness of Instance 
-/// Variables (Ivars) relative to what declared in @implementation;s class. 
-/// Ivars into ObjCImplementationDecl's fields.
-///
-void ObjCImplementationDecl::ObjCAddInstanceVariablesToClassImpl(
-                               ObjCIvarDecl **ivars, unsigned numIvars) {
-  NumIvars = numIvars;
-  if (numIvars) {
-    Ivars = new ObjCIvarDecl*[numIvars];
-    memcpy(Ivars, ivars, numIvars*sizeof(ObjCIvarDecl*));
-  }
-}
 
 // Get the local instance method declared in this interface.
 // FIXME: handle overloading, instance & class methods can have the same name.

Modified: cfe/trunk/lib/Sema/SemaDecl.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaDecl.cpp?rev=65150&r1=65149&r2=65150&view=diff

==============================================================================
--- cfe/trunk/lib/Sema/SemaDecl.cpp (original)
+++ cfe/trunk/lib/Sema/SemaDecl.cpp Fri Feb 20 14:41:34 2009
@@ -3458,13 +3458,10 @@
     
   }
   
-  // FIXME: Chain fielddecls together.
-  FieldDecl *NewFD;
-
-  NewFD = FieldDecl::Create(Context, Record,
-                            Loc, II, T, BitWidth,
-                            D.getDeclSpec().getStorageClassSpec() ==
-                              DeclSpec::SCS_mutable);
+  FieldDecl *NewFD = FieldDecl::Create(Context, Record,
+                                       Loc, II, T, BitWidth,
+                                       D.getDeclSpec().getStorageClassSpec() ==
+                                       DeclSpec::SCS_mutable);
 
   if (II) {
     NamedDecl *PrevDecl = LookupName(S, II, LookupMemberName, true);
@@ -3710,7 +3707,7 @@
     else if (ObjCImplementationDecl *IMPDecl = 
                dyn_cast<ObjCImplementationDecl>(EnclosingDecl)) {
       assert(IMPDecl && "ActOnFields - missing ObjCImplementationDecl");
-      IMPDecl->ObjCAddInstanceVariablesToClassImpl(ClsFields, RecFields.size());
+      IMPDecl->setIVarList(ClsFields, RecFields.size());
       CheckImplementationIvars(IMPDecl, ClsFields, RecFields.size(), RBrac);
     }
   }





More information about the cfe-commits mailing list