Index: src/runtime/class.m ================================================================== --- src/runtime/class.m +++ src/runtime/class.m @@ -114,17 +114,15 @@ { struct objc_method_list *ml; struct objc_category **cats; unsigned int i; - if (cls->dtable == NULL) { - if (cls->superclass != Nil) - cls->dtable = - objc_sparsearray_copy(cls->superclass->dtable); - else - cls->dtable = objc_sparsearray_new(); - } + if (cls->dtable == NULL) + cls->dtable = objc_sparsearray_new(); + + if (cls->superclass != Nil) + objc_sparsearray_copy(cls->dtable, cls->superclass->dtable); for (ml = cls->methodlist; ml != NULL; ml = ml->next) for (i = 0; i < ml->count; i++) objc_sparsearray_set(cls->dtable, (uint32_t)ml->methods[i].sel.uid, Index: src/runtime/runtime-private.h ================================================================== --- src/runtime/runtime-private.h +++ src/runtime/runtime-private.h @@ -146,11 +146,12 @@ extern BOOL objc_hashtable_warn_on_collision; extern void objc_register_selector(struct objc_abi_selector*); extern void objc_register_all_selectors(struct objc_abi_symtab*); extern void objc_free_all_selectors(void); extern struct objc_sparsearray* objc_sparsearray_new(void); -extern struct objc_sparsearray* objc_sparsearray_copy(struct objc_sparsearray*); +extern void objc_sparsearray_copy(struct objc_sparsearray*, + struct objc_sparsearray*); extern void objc_sparsearray_set(struct objc_sparsearray*, uint32_t, const void*); extern void objc_sparsearray_free(struct objc_sparsearray*); extern void objc_sparsearray_free_when_singlethreaded(struct objc_sparsearray*); extern void objc_sparsearray_cleanup(void); Index: src/runtime/sparsearray.m ================================================================== --- src/runtime/sparsearray.m +++ src/runtime/sparsearray.m @@ -61,19 +61,17 @@ s->buckets[i] = empty_level2; return s; } -struct objc_sparsearray* -objc_sparsearray_copy(struct objc_sparsearray *src) +void +objc_sparsearray_copy(struct objc_sparsearray *dst, + struct objc_sparsearray *src) { - struct objc_sparsearray *dst; size_t i, j, k; uint32_t idx; - dst = objc_sparsearray_new(); - for (i = 0; i < 256; i++) { if (src->buckets[i]->empty) continue; for (j = 0; j < 256; j++) { @@ -91,12 +89,10 @@ idx = (i << 16) | (j << 8) | k; objc_sparsearray_set(dst, idx, obj); } } } - - return dst; } void objc_sparsearray_set(struct objc_sparsearray *s, uint32_t idx, const void *obj) {