diff --git a/sendmsg.c b/sendmsg.c index 6d8d2d7..9c91539 100644 --- a/sendmsg.c +++ b/sendmsg.c @@ -498,6 +498,7 @@ __objc_install_methods_in_dtable (Class class, MethodList_t method_list, if (method_list->method_next) __objc_install_methods_in_dtable (class, method_list->method_next, dtable); + for (i = 0; i < method_list->method_count; i++) { Method_t method = &(method_list->method_list[i]); @@ -572,7 +573,10 @@ __objc_install_dispatch_table_for_class(Class class) static void merge_methods_from_superclass (Class class) { + struct sarray *dtable = dtable_for_class(class); Class super = class->super_class; + // Don't merge things into the uninitialised dtable. That would be very bad. + if (dtable == __objc_uninstalled_dtable) { return; } do { MethodList_t method_list = class->methods; @@ -585,8 +589,7 @@ static void merge_methods_from_superclass (Class class) { Method_t method = &method_list->method_list[i]; size_t sel_id = (size_t)method->method_name->sel_id; - struct objc_slot *slot = - sarray_get_safe(dtable_for_class(class), sel_id); + struct objc_slot *slot = sarray_get_safe(dtable, sel_id); // If the slot already exists in this dtable, we have either // overridden it in the subclass, or it is already pointing to // the same slot as the superclass. If not, then we just install @@ -596,7 +599,7 @@ static void merge_methods_from_superclass (Class class) slot = sarray_get_safe(dtable_for_class(super), sel_id); // If slot is NULL here, something has gone badly wrong with // the superclass already. - sarray_at_put_safe (dtable_for_class(class), sel_id, slot); + sarray_at_put_safe (dtable, sel_id, slot); } } method_list = method_list->method_next;