In libobjc/: 2011-08-06 Nicola Pero <nicola.pero@meta-innovation.com>
authorNicola Pero <nicola.pero@meta-innovation.com>
Sat, 6 Aug 2011 09:49:30 +0000 (09:49 +0000)
committerNicola Pero <nicola@gcc.gnu.org>
Sat, 6 Aug 2011 09:49:30 +0000 (09:49 +0000)
In libobjc/:
2011-08-06  Nicola Pero  <nicola.pero@meta-innovation.com>

PR libobjc/49882
* class.c (class_getSuperclass): Return the superclass if the
class is in construction.
* objc/runtime.h (class_getSuperclass): Updated documentation.

In gcc/testsuite/:
2011-08-06  Nicola Pero  <nicola.pero@meta-innovation.com>

PR libobjc/49882
* objc.dg/gnu-api-2-class.m (main): Test class_getSuperclass()
with classes that are in construction.

From-SVN: r177505

gcc/testsuite/ChangeLog
gcc/testsuite/objc.dg/gnu-api-2-class.m
libobjc/ChangeLog
libobjc/class.c
libobjc/objc/runtime.h

index bdfacbf796ea147b4f6d251b96beadee07f6834c..cb5adfe815f2fe2ad553277140ead848c7a2c5cc 100644 (file)
@@ -1,3 +1,9 @@
+2011-08-06  Nicola Pero  <nicola.pero@meta-innovation.com>
+       
+       PR libobjc/49882
+       * objc.dg/gnu-api-2-class.m (main): Test class_getSuperclass()
+       with classes that are in construction.
+
 2011-08-05  Jason Merrill  <jason@redhat.com>
 
        PR c++/48993
index f396a09fad8b6775fc84c05d87b9f89f78ca3289..d69f8eba20f82538302e79a7a2c1c1c6c0ab1c80 100644 (file)
@@ -394,6 +394,14 @@ int main(int argc, void **args)
     MySubClass *object = [[MySubClass alloc] init];
     if (class_getSuperclass (object_getClass (object)) != objc_getClass ("MyRootClass"))
       abort ();
+
+    /* Test that it works on a newly created, but not registered, class.  */
+    {
+      Class new_class = objc_allocateClassPair (objc_getClass ("MyRootClass"), "MySubClass3", 0);
+
+      if (class_getSuperclass (new_class) != objc_getClass ("MyRootClass"))
+       abort ();
+    }    
   }
 
   printf ("Testing class_getVersion ()...\n");
index 61d4ac335d7f978fd512e98a6c6f426bf3b3bd7e..978878e2701cb1253d81e903ebfb15952e692de1 100644 (file)
@@ -1,3 +1,10 @@
+2011-08-06  Nicola Pero  <nicola.pero@meta-innovation.com>
+
+       PR libobjc/49882
+       * class.c (class_getSuperclass): Return the superclass if the
+       class is in construction.
+       * objc/runtime.h (class_getSuperclass): Updated documentation.
+
 2011-08-05  Rainer Orth  <ro@CeBiTec.Uni-Bielefeld.DE>
 
        * Makefile.in (INCLUDES): Search
index 3fe3561d2acceef10c29f18663d6b2de4d70e9c0..5df7050869192aa68ed9f91a7eb3fe063bc6de5c 100644 (file)
@@ -923,10 +923,13 @@ class_getSuperclass (Class class_)
   if (class_ == Nil)
     return Nil;
 
-  /* Classes that are in construction are not resolved and can not be
-     resolved!  */
+  /* Classes that are in construction are not resolved, and still have
+     the class name (instead of a class pointer) in the
+     class_->superclass field.  In that case we need to lookup the
+     superclass name to return the superclass.  We can not resolve the
+     class until it is registered.  */
   if (CLS_IS_IN_CONSTRUCTION (class_))
-    return Nil;
+    return objc_lookUpClass ((const char *)(class_->super_class));
 
   /* If the class is not resolved yet, super_class would point to a
      string (the name of the super class) as opposed to the actual
index ab9926e9b6d6887b24b25ba2f64a4fbd0e458f6f..c649e239d9e11187aa45082e435ed42d467a6622 100644 (file)
@@ -497,10 +497,10 @@ objc_EXPORT const char * class_getName (Class class_);
 objc_EXPORT BOOL class_isMetaClass (Class class_);
 
 /* Return the superclass of 'class_'.  If 'class_' is Nil, or it is a
-   root class, return Nil.  If 'class_' is a class being constructed,
-   that is, a class returned by objc_allocateClassPair() but before it
-   has been registered with the runtime using
-   objc_registerClassPair(), return Nil.  */
+   root class, return Nil.  This function also works if 'class_' is a
+   class being constructed, that is, a class returned by
+   objc_allocateClassPair() but before it has been registered with the
+   runtime using objc_registerClassPair().  */
 objc_EXPORT Class class_getSuperclass (Class class_);
 
 /* Return the 'version' number of the class, which is an integer that