From: Richard Stallman Date: Thu, 6 May 1993 02:42:55 +0000 (+0000) Subject: (__objc_send_initialize, class_add_method_list): X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=4be7cc989c0a8c63660791479b6875cd0362fb3d;p=gcc.git (__objc_send_initialize, class_add_method_list): Allow multiple +initialize methods per class. From-SVN: r4349 --- diff --git a/gcc/objc/sendmsg.c b/gcc/objc/sendmsg.c index 3638c79acc1..c7947ecbf8c 100644 --- a/gcc/objc/sendmsg.c +++ b/gcc/objc/sendmsg.c @@ -186,14 +186,31 @@ static void __objc_send_initialize(Class* class) if(class->super_class) __objc_send_initialize(class->super_class); - - m = search_for_method_in_list(class->class_pointer->methods, - sel_get_uid("initialize")); - if(m != NULL) - { - CLS_SETINITIALIZED(class); - (*m->method_imp) ((id) class, sel_get_uid("initialize")); - } + + { + MethodList_t method_list = class->class_pointer->methods; + SEL op = sel_register_name ("initialize"); + + /* If not found then we'll search the list. */ + while (method_list) + { + int i; + + /* Search the method list. */ + for (i = 0; i < method_list->method_count; ++i) + { + Method_t method = &method_list->method_list[i]; + + + if (method->method_name == op) + (*method->method_imp)((id) class, op); + } + + /* The method wasn't found. Follow the link to the next list of + methods. */ + method_list = method_list->method_next; + } + } } } @@ -268,6 +285,9 @@ void class_add_method_list (Class* class, MethodList_t list) { int i; + static SEL initialize_sel = 0; + if (!initialize_sel) + initialize_sel = sel_register_name ("initialize"); /* Passing of a linked list is not allowed. Do multiple calls. */ assert (!list->method_next); @@ -282,7 +302,8 @@ class_add_method_list (Class* class, MethodList_t list) /* This is where selector names are transmogriffed to SEL's */ method->method_name = sel_register_name ((char*)method->method_name); - if (search_for_method_in_list (class->methods, method->method_name)) + if (search_for_method_in_list (class->methods, method->method_name) + && method->method_name != initialize_sel) { /* Duplication. Print a error message an change the method name to NULL. */