Index: src/runtime/class.m ================================================================== --- src/runtime/class.m +++ src/runtime/class.m @@ -135,11 +135,11 @@ { struct objc_method_list *ml; struct objc_category **cats; unsigned int i; - if (!(cls->info & OBJC_CLASS_INFO_INITIALIZED)) + if (!(cls->info & OBJC_CLASS_INFO_DTABLE)) return; if (cls->dtable == empty_dtable) cls->dtable = objc_sparsearray_new(); @@ -240,20 +240,23 @@ return; if (cls->superclass) initialize_class(cls->superclass); + cls->info |= OBJC_CLASS_INFO_DTABLE; + cls->isa->info |= OBJC_CLASS_INFO_DTABLE; + + objc_update_dtable(cls); + objc_update_dtable(cls->isa); + /* * Set it first to prevent calling it recursively due to message sends * in the initialize method */ cls->info |= OBJC_CLASS_INFO_INITIALIZED; cls->isa->info |= OBJC_CLASS_INFO_INITIALIZED; - objc_update_dtable(cls); - objc_update_dtable(cls->isa); - call_method(cls, "initialize"); } void objc_initialize_class(Class cls) @@ -534,19 +537,16 @@ static void free_class(Class rcls) { struct objc_abi_class *cls = (struct objc_abi_class*)rcls; - if (!(rcls->info & OBJC_CLASS_INFO_INITIALIZED)) - return; - if (rcls->subclass_list != NULL) { free(rcls->subclass_list); rcls->subclass_list = NULL; } - if (rcls->dtable != NULL) + if (rcls->dtable != NULL && rcls->dtable != empty_dtable) objc_sparsearray_free(rcls->dtable); rcls->dtable = NULL; if (rcls->superclass != Nil) Index: src/runtime/runtime.h ================================================================== --- src/runtime/runtime.h +++ src/runtime/runtime.h @@ -57,11 +57,12 @@ OBJC_CLASS_INFO_CLASS = 0x001, OBJC_CLASS_INFO_METACLASS = 0x002, OBJC_CLASS_INFO_NEW_ABI = 0x010, OBJC_CLASS_INFO_SETUP = 0x100, OBJC_CLASS_INFO_LOADED = 0x200, - OBJC_CLASS_INFO_INITIALIZED = 0x400 + OBJC_CLASS_INFO_DTABLE = 0x400, + OBJC_CLASS_INFO_INITIALIZED = 0x800 }; struct objc_object { Class isa; };