3.0.1 PATCH: Avoid link failure of Objective-C testsuite on Solaris2/Intel

Nicola Pero nicola@brainstorm.co.uk
Tue Jul 3 03:27:00 GMT 2001


> > Here is a complete patch fixing libobjc:
> 
> I've tried your patch on all configurations used to verify my patch to allow
> a shared libobjc to work on Solaris
> 
> 	http://gcc.gnu.org/ml/gcc-patches/2001-06/msg01785.html
> 
> and it fixes all the testsuite differences between the static and shared
> cases reported there, so it looks very good.

Thanks for the testing.

 
> A few stylistic comments on the patch, though:

Ok - at the end of this mail there is a new patch taking into account your
comments on style.  Btw, I also generated better testcases, much more
convincing, they are included as well, please would you commit those
instead of the other one as they are much cooler :-)

> Btw, the whole file (objc/objc-api.h) is full of GCS violations.  Would you
> mind providing a patch (probably mainline only) to fix this?

Yes - I wouldn't mind - once the real patch which fixes the bug has been
applied then I promise I'll submit one to reindent the file. :-)

here is the code - should be pretty definitive now - waiting for something
to approve and apply the following stuff - 

Index: ChangeLog
===================================================================
RCS file: /cvs/gcc/gcc/libobjc/ChangeLog,v
retrieving revision 1.63
diff -u -r1.63 ChangeLog
--- ChangeLog	2001/06/09 20:32:56	1.63
+++ ChangeLog	2001/07/03 09:49:54
@@ -1,3 +1,10 @@
+Tue Jul  3 10:49:38 2001  Nicola Pero  <nicola@brainstorm.co.uk>
+
+	* objc/objc-api.h (object_is_class): Fixed - buggy code was trying
+	to cast an id to a Class, which can not be done.  Make the check
+	by using CLS_ISMETA on the class pointer instead.
+	(object_is_meta_class): Similar fix.
+
 2001-06-09  Alexandre Oliva  <aoliva@redhat.com>, Stephen L Moshier  <moshier@mediaone.net>
 
 	* configure.in (AC_EXEEXT): Work around in case it expands to
Index: objc/objc-api.h
===================================================================
RCS file: /cvs/gcc/gcc/libobjc/objc/objc-api.h,v
retrieving revision 1.3
diff -u -r1.3 objc-api.h
--- objc-api.h	2001/01/03 08:49:34	1.3
+++ objc-api.h	2001/07/03 09:49:55
@@ -578,22 +578,25 @@
 }
 
 static inline BOOL
-object_is_class(id object)
+object_is_class (id object)
 {
-  return CLS_ISCLASS((Class)object);
+  return ((object != nil)  &&  CLS_ISMETA (object->class_pointer));
 }
 
 static inline BOOL
-object_is_instance(id object)
+object_is_instance (id object)
 {
-  return (object!=nil)&&CLS_ISCLASS(object->class_pointer);
+  return ((object != nil)  &&  CLS_ISCLASS (object->class_pointer));
 }
 
 static inline BOOL
-object_is_meta_class(id object)
+object_is_meta_class (id object)
 {
-  return CLS_ISMETA((Class)object);
+  return ((object != nil)
+	  &&  !object_is_instance (object)  
+	  &&  !object_is_class (object));
 }
+
 
 struct sarray* 
 objc_get_uninstalled_dtable(void);


And now the testcase:
=====================

object_is_class.m:
==================

/* Contributed by Nicola Pero - Tue Jul  3 10:55:21 BST 2001 */
#include <objc/objc.h>
#include <objc/objc-api.h>
#include <objc/Object.h>

/* This test demonstrate a failure in object_is_class which was fixed */

/* Create a class whose instance variables mirror the struct used for
   Class structures in the runtime ... yes we're feeling evil today */
@interface EvilClass : Object
{
  Class super_class;
  const char* name;
  long version;
  unsigned long info;    
}
@end

@implementation EvilClass
- (id) init
{
  self = [super init];
  /* The following one is used in the runtime to mark classes */
  info = 0x1L;
  return self;
}
@end

int main (void)
{
  /* Create an object of our EvilClass */
  EvilClass *evilObject = [EvilClass new];
  
  /* Now check that the object is not a class object */
  if (object_is_class (evilObject))
    {
      printf ("object_is_class failed\n");
      abort ();
    }

  return 0;
}

object_is_meta_class.m:
=======================

/* Contributed by Nicola Pero - Tue Jul  3 10:55:21 BST 2001 */
#include <objc/objc.h>
#include <objc/objc-api.h>
#include <objc/Object.h>

/* This test demonstrate a failure in object_is_meta_class which was fixed */

@interface EvilClass : Object
{
  Class super_class;
  const char* name;
  long version;
  unsigned long info;    
}
@end

@implementation EvilClass
- (id) init
{
  self = [super init];
  /* The following one is used in the runtime to mark meta classes */
  info = 0x2L;
  return self;
}
@end

int main (void)
{
  /* Create an object of our EvilClass */
  EvilClass *evilObject = [EvilClass new];
  
  /* Now check that the object is not a meta class object */
  if (object_is_meta_class (evilObject))
    {
      printf ("object_is_meta_class failed\n");
      abort ();
    }

  return 0;
}




More information about the Gcc-patches mailing list