init.c (__objc_send_message_in_list): When setting a new entry in __objc_load_methods...
authorRichard Frith-Macdonald <rrfm@gnu.org>
Fri, 8 Jun 2001 22:19:47 +0000 (22:19 +0000)
committerStan Shebs <shebs@gcc.gnu.org>
Fri, 8 Jun 2001 22:19:47 +0000 (22:19 +0000)
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

libobjc/ChangeLog
libobjc/init.c

index 4558566aedb0d9b90545acf1749b3ef52e16252c..ce7f41318b6bdcaf0700b2fd596ea27d3346b714 100644 (file)
@@ -1,3 +1,12 @@
+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>
 
        * init.c (__objc_send_message_in_list): When setting a new entry
index d50dba026d3fd1ab3606966d6af0aba9588b810a..29ce6393eb7ca8c67d2c1940dc62b1b98093bcbd 100644 (file)
@@ -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];
 
       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 */
-         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);
 
+         /* The method was found and wasn't previously executed. */
+         (*mth->method_imp) ((id)class, mth->method_name);
+
          break;
        }
     }