Commit 0ea39696 by Nicola Pero

In libobjc/: 2011-10-08 Richard Frith-Macdonald <rfm@gnu.org> Nicola Pero…

In libobjc/: 2011-10-08 Richard Frith-Macdonald <rfm@gnu.org> Nicola Pero <nicola.pero@meta-innovation.com>

In libobjc/:
2011-10-08  Richard Frith-Macdonald <rfm@gnu.org>
            Nicola Pero  <nicola.pero@meta-innovation.com>

	PR libobjc/50428
	* sendmsg.c (__objc_send_initialize): If a class does not have an
	+initialize method, search for an +initialize method in the
	superclass and in the ancestor classes and execute the first one
	that is found.  This makes the GNU runtime behave in the same way
	as the Apple/NeXT runtime with respect to +initialize methods and
	subclassing.

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

	PR libobjc/50428
	* doc/objc.texi (Garbage Collection): Updated example to protect
	+initialize against execution in subclasses.

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

	PR libobjc/50428	
	* objc/execute/initialize-1.m: New test.

From-SVN: r179711
parent 30a390c8
2011-10-08 Nicola Pero <nicola.pero@meta-innovation.com>
PR libobjc/50428
* doc/objc.texi (Garbage Collection): Updated example to protect
+initialize against execution in subclasses.
2011-10-07 Richard Henderson <rth@redhat.com> 2011-10-07 Richard Henderson <rth@redhat.com>
* doc/extend.texi (__builtin_shuffle): Improve the description to * doc/extend.texi (__builtin_shuffle): Improve the description to
...@@ -635,7 +635,8 @@ following class does this: ...@@ -635,7 +635,8 @@ following class does this:
+ (void)initialize + (void)initialize
@{ @{
class_ivar_set_gcinvisible (self, "weakPointer", YES); if (self == objc_lookUpClass ("WeakPointer"))
class_ivar_set_gcinvisible (self, "weakPointer", YES);
@} @}
- initWithPointer:(const void*)p - initWithPointer:(const void*)p
......
2011-10-08 Nicola Pero <nicola.pero@meta-innovation.com>
PR libobjc/50428
* objc/execute/initialize-1.m: New test.
2011-10-08 Paul Thomas <pault@gcc.gnu.org> 2011-10-08 Paul Thomas <pault@gcc.gnu.org>
PR fortran/47844 PR fortran/47844
......
/* Contributed by Nicola Pero - Sat 8 Oct 2011 16:47:48 BST */
#include <objc/objc.h>
/* Test that if a class has no +initialize method, the superclass
implementation is called. */
static int class_variable = 0;
@interface TestClass
{
Class isa;
}
+ (void) initialize;
+ (int) classVariable;
@end
@implementation TestClass
+ (void) initialize
{
class_variable++;
}
+ (int) classVariable
{
return class_variable;
}
@end
@interface TestSubClass : TestClass
@end
@implementation TestSubClass
@end
int main (void)
{
if ([TestClass classVariable] != 1)
{
abort ();
}
if ([TestSubClass classVariable] != 2)
{
abort ();
}
return 0;
}
2011-10-08 Richard Frith-Macdonald <rfm@gnu.org>
Nicola Pero <nicola.pero@meta-innovation.com>
PR libobjc/50428
* sendmsg.c (__objc_send_initialize): If a class does not have an
+initialize method, search for an +initialize method in the
superclass and in the ancestor classes and execute the first one
that is found. This makes the GNU runtime behave in the same way
as the Apple/NeXT runtime with respect to +initialize methods and
subclassing.
2011-08-06 Nicola Pero <nicola.pero@meta-innovation.com> 2011-08-06 Nicola Pero <nicola.pero@meta-innovation.com>
PR libobjc/50002 PR libobjc/50002
......
...@@ -516,34 +516,13 @@ __objc_send_initialize (Class class) ...@@ -516,34 +516,13 @@ __objc_send_initialize (Class class)
{ {
SEL op = sel_registerName ("initialize"); SEL op = sel_registerName ("initialize");
IMP imp = 0; struct objc_method *method = search_for_method_in_hierarchy (class->class_pointer,
struct objc_method_list * method_list = class->class_pointer->methods; op);
while (method_list) if (method)
{
int i;
struct objc_method * method;
for (i = 0; i < method_list->method_count; i++)
{
method = &(method_list->method_list[i]);
if (method->method_name
&& method->method_name->sel_id == op->sel_id)
{
imp = method->method_imp;
break;
}
}
if (imp)
break;
method_list = method_list->method_next;
}
if (imp)
{ {
DEBUG_PRINTF (" begin of [%s +initialize]\n", class->name); DEBUG_PRINTF (" begin of [%s +initialize]\n", class->name);
(*imp) ((id) class, op); (*method->method_imp) ((id)class, op);
DEBUG_PRINTF (" end of [%s +initialize]\n", class->name); DEBUG_PRINTF (" end of [%s +initialize]\n", class->name);
} }
#ifdef DEBUG #ifdef DEBUG
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment