@@ -581,12 +581,12 @@ object_getClassName(id obj) { return object_getClass(obj)->name; } -static void -free_class(Class rcls) +void +objc_free_class(Class rcls) { struct objc_abi_class *cls = (struct objc_abi_class*)rcls; if (rcls->subclass_list != NULL) { free(rcls->subclass_list); @@ -598,10 +598,12 @@ rcls->dtable = NULL; if (rcls->superclass != Nil) cls->superclass = rcls->superclass->name; + + objc_hashtable_set(classes, cls->name, NULL); } void objc_free_all_classes(void) { @@ -610,13 +612,23 @@ if (classes == NULL) return; for (i = 0; i <= classes->last_idx; i++) { if (classes->data[i] != NULL) { - free_class((Class)classes->data[i]->obj); - free_class(((Class)classes->data[i]->obj)->isa); + Class cls = classes->data[i]->obj; + + if (cls == Nil) + continue; + + objc_free_class(cls); + objc_free_class(cls->isa); } } + + if (empty_dtable != NULL) { + objc_sparsearray_free(empty_dtable); + empty_dtable = NULL; + } objc_hashtable_free(classes); classes = NULL; }