summaryrefslogtreecommitdiff
path: root/libobjc
diff options
context:
space:
mode:
Diffstat (limited to 'libobjc')
-rw-r--r--libobjc/ChangeLog11
-rw-r--r--libobjc/sendmsg.c31
2 files changed, 16 insertions, 26 deletions
diff --git a/libobjc/ChangeLog b/libobjc/ChangeLog
index b9f87fabec9..f88f2f45cdf 100644
--- a/libobjc/ChangeLog
+++ b/libobjc/ChangeLog
@@ -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
diff --git a/libobjc/sendmsg.c b/libobjc/sendmsg.c
index 8aa266dd11f..ea8ea970262 100644
--- a/libobjc/sendmsg.c
+++ b/libobjc/sendmsg.c
@@ -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