Hello,
The attached patch fixes an issue reported a couple of years ago in Bug
51891 (https://gcc.gnu.org/bugzilla/show_bug.cgi?id=51891). The problem
is caused because classes without instance variables have no ivar list
at all, so that their ivars pointer is NULL, but the code in
class_copyIvarList () is unaware of this.
That this is in fact so can be easily verified by checking the code of
class_addIvar in the same source file, where the ivars list is allocated
when the first ivar is added. The code there also checks for a NULL
ivars pointer.
The patch also adds a simple test-case for this issue. I think that the
ChangeLog entry should be something along the lines of:
2014-12-24 Dimitris Papavasiliou <dpapa...@gmail.com>
PR libobjc/51891
* libobjc/ivars.c: Add a check for classes without instance
variables, which have a NULL ivar list pointer.
* gcc/testsuite/objc.dg/gnu-api-2-class.m: Add a test case
for the above change.
I hope I got the formatting right. I've run make -k check-objc and all
tests pass without problems.
Let me know if there are any problems, or if I can do anything else to
facilitate the acceptance of the patch.
Regards,
Dimitris
Index: gcc/testsuite/objc.dg/gnu-api-2-class.m
===================================================================
--- gcc/testsuite/objc.dg/gnu-api-2-class.m (revision 219054)
+++ gcc/testsuite/objc.dg/gnu-api-2-class.m (working copy)
@@ -239,6 +239,19 @@
abort ();
}
+ printf ("Testing class_copyIvarList () on class with no instance variables...\n");
+ {
+ unsigned int count;
+ Ivar * list = class_copyIvarList (objc_getClass ("MyOtherSubClass"),
+ &count);
+
+ if (count != 0)
+ abort ();
+
+ if (list != NULL)
+ abort ();
+ }
+
printf ("Testing class_copyMethodList ()...\n");
{
unsigned int count;
Index: libobjc/ivars.c
===================================================================
--- libobjc/ivars.c (revision 219054)
+++ libobjc/ivars.c (working copy)
@@ -179,7 +179,7 @@
struct objc_ivar **returnValue = NULL;
struct objc_ivar_list* ivar_list;
- if (class_ == Nil || CLS_IS_IN_CONSTRUCTION (class_))
+ if (class_ == Nil || CLS_IS_IN_CONSTRUCTION (class_) || !class_->ivars)
{
if (numberOfReturnedIvars)
*numberOfReturnedIvars = 0;