From 7b497559649f3f123b2e73fb5b076bac16476654 Mon Sep 17 00:00:00 2001 From: theraven Date: Tue, 19 Apr 2011 10:55:10 +0000 Subject: [PATCH] Dtable cleanup cleanups. --- associate.m | 3 +-- dtable.c | 15 +++++++++++++++ dtable.h | 4 ++-- runtime.c | 4 +++- 4 files changed, 21 insertions(+), 5 deletions(-) diff --git a/associate.m b/associate.m index 5e0c6c5..dc2fded 100644 --- a/associate.m +++ b/associate.m @@ -234,8 +234,7 @@ static void deallocHiddenClass(id obj, SEL _cmd) struct reference_list *list = object_getIndexedIvars(hiddenClass); cleanupReferenceList(list); - // FIXME: Low memory profile. - SparseArrayDestroy(hiddenClass->dtable); + free_dtable(hiddenClass->dtable); // Free the class free(hiddenClass); diff --git a/dtable.c b/dtable.c index 844fbbe..dd6790e 100644 --- a/dtable.c +++ b/dtable.c @@ -268,6 +268,16 @@ PRIVATE dtable_t objc_copy_dtable_for_class(dtable_t old, Class cls) return dtable; } +PRIVATE void free_dtable(dtable_t dtable) +{ + if (NULL != dtable->slots) + { + free(dtable->slots); + } + DESTROY_LOCK(dtable->lock); + free(dtable); +} + #else @@ -495,6 +505,11 @@ PRIVATE dtable_t objc_copy_dtable_for_class(dtable_t old, Class cls) return SparseArrayCopy(old); } +PRIVATE void free_dtable(dtable_t dtable) +{ + SparseArrayDestroy(dtable); +} + #endif // __OBJC_LOW_MEMORY__ LEGACY void update_dispatch_table_for_class(Class cls) diff --git a/dtable.h b/dtable.h index 5376ef0..95eae20 100644 --- a/dtable.h +++ b/dtable.h @@ -123,6 +123,6 @@ void add_method_list_to_class(Class cls, struct objc_method_list *list); /** - * Creates a copy of the class's dispatch table. + * Destroys a dtable. */ -dtable_t objc_copy_dtable_for_class(dtable_t old, Class cls); +void free_dtable(dtable_t dtable); diff --git a/runtime.c b/runtime.c index 350f202..8c982d1 100644 --- a/runtime.c +++ b/runtime.c @@ -138,7 +138,7 @@ BOOL class_addMethod(Class cls, SEL name, IMP imp, const char *types) if (objc_test_class_flag(cls, objc_class_flag_resolved)) { - objc_update_dtable_for_class(cls); + add_method_list_to_class(cls, methods); } return YES; @@ -569,6 +569,8 @@ void objc_disposeClassPair(Class cls) freeMethodLists(cls); freeMethodLists(meta); freeIvarLists(cls); + free_dtable(cls->dtable); + free_dtable(meta->dtable); // Free the class and metaclass free(meta);