Commit e6be21fe by Richard Frith-Macdonald Committed by Stan Shebs

init.c (__objc_send_message_in_list): When setting a new entry in…

init.c (__objc_send_message_in_list): When setting a new entry in __objc_load_methods use the method IMP as key...

2001-06-06  Richard Frith-Macdonald  <rrfm@gnu.org>

        * init.c (__objc_send_message_in_list): When setting a new entry
        in __objc_load_methods use the method IMP as key, but check to see
        if the method is in the hashtable by looking at the IMP also.
        Also ... call the method after adding it to the hashtable rather
        than before ... thus preventing an obscure possibility of infinite
        recursion if a +load method itself loads a subclass.

From-SVN: r43052
parent 43fd108f
2001-06-06 Richard Frith-Macdonald <rrfm@gnu.org>
* init.c (__objc_send_message_in_list): When setting a new entry
in __objc_load_methods use the method IMP as key, but check to see
if the method is in the hashtable by looking at the IMP also.
Also ... call the method after adding it to the hashtable rather
than before ... thus preventing an obscure possibility of infinite
recursion if a +load method itself loads a subclass.
2001-05-25 Ovidiu Predescu <ovidiu@cup.hp.com> 2001-05-25 Ovidiu Predescu <ovidiu@cup.hp.com>
* init.c (__objc_send_message_in_list): When setting a new entry * init.c (__objc_send_message_in_list): When setting a new entry
......
...@@ -313,16 +313,16 @@ __objc_send_message_in_list (MethodList_t method_list, Class class, SEL op) ...@@ -313,16 +313,16 @@ __objc_send_message_in_list (MethodList_t method_list, Class class, SEL op)
Method_t mth = &method_list->method_list[i]; Method_t mth = &method_list->method_list[i];
if (mth->method_name && sel_eq (mth->method_name, op) if (mth->method_name && sel_eq (mth->method_name, op)
&& !hash_is_key_in_hash (__objc_load_methods, mth->method_name)) && !hash_is_key_in_hash (__objc_load_methods, mth->method_imp))
{ {
/* The method was found and wasn't previously executed. */
(*mth->method_imp) ((id)class, mth->method_name);
/* Add this method into the +load hash table */ /* Add this method into the +load hash table */
hash_add (&__objc_load_methods, mth->method_name, mth->method_imp); hash_add (&__objc_load_methods, mth->method_imp, mth->method_imp);
DEBUG_PRINTF ("sending +load in class: %s\n", class->name); DEBUG_PRINTF ("sending +load in class: %s\n", class->name);
/* The method was found and wasn't previously executed. */
(*mth->method_imp) ((id)class, mth->method_name);
break; break;
} }
} }
......
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