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
This commit is contained in:
parent
30a390c810
commit
0ea39696e4
@ -1,3 +1,9 @@
|
||||
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>
|
||||
|
||||
* doc/extend.texi (__builtin_shuffle): Improve the description to
|
||||
|
@ -635,7 +635,8 @@ following class does this:
|
||||
|
||||
+ (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
|
||||
|
@ -1,3 +1,8 @@
|
||||
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>
|
||||
|
||||
PR fortran/47844
|
||||
|
47
gcc/testsuite/objc/execute/initialize-1.m
Normal file
47
gcc/testsuite/objc/execute/initialize-1.m
Normal file
@ -0,0 +1,47 @@
|
||||
/* 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;
|
||||
}
|
@ -1,3 +1,14 @@
|
||||
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>
|
||||
|
||||
PR libobjc/50002
|
||||
|
@ -516,34 +516,13 @@ __objc_send_initialize (Class class)
|
||||
|
||||
{
|
||||
SEL op = sel_registerName ("initialize");
|
||||
IMP imp = 0;
|
||||
struct objc_method_list * method_list = class->class_pointer->methods;
|
||||
|
||||
while (method_list)
|
||||
{
|
||||
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)
|
||||
struct objc_method *method = search_for_method_in_hierarchy (class->class_pointer,
|
||||
op);
|
||||
|
||||
if (method)
|
||||
{
|
||||
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);
|
||||
}
|
||||
#ifdef DEBUG
|
||||
|
Loading…
Reference in New Issue
Block a user