From 76bb7762ffb55acaa559bc7d0fd4a85492c15c36 Mon Sep 17 00:00:00 2001 From: theraven Date: Mon, 4 Oct 2010 22:33:30 +0000 Subject: [PATCH] Properly resolve the metaclass's isa pointer. --- class_table.c | 1 + runtime.c | 3 ++- sync.m | 8 +++----- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/class_table.c b/class_table.c index 0e80494..7526b35 100644 --- a/class_table.c +++ b/class_table.c @@ -222,6 +222,7 @@ BOOL objc_resolve_class(Class cls) // Mark this class (and its metaclass) as resolved objc_set_class_flag(cls, objc_class_flag_resolved); objc_set_class_flag(cls->isa, objc_class_flag_resolved); + cls->isa->isa = (Nil == cls->isa->isa) ? root_class : (Class)objc_getClass((char*)cls->isa->isa); // Fix up the ivar offsets objc_compute_ivar_offsets(cls); // Send the +load message, if required diff --git a/runtime.c b/runtime.c index 7c717ff..f1a64fa 100644 --- a/runtime.c +++ b/runtime.c @@ -595,10 +595,12 @@ Class objc_allocateClassPair(Class superclass, const char *name, size_t extraByt void *object_getIndexedIvars(id obj) { if (nil == obj) { return NULL; } + /* if (class_isMetaClass(obj->isa)) { return ((char*)obj) + sizeof(struct objc_class); } + */ return ((char*)obj) + obj->isa->instance_size; } @@ -609,7 +611,6 @@ Class object_getClass(id obj) Class isa = obj->isa; while ((Nil != isa) && objc_test_class_flag(isa, objc_class_flag_hidden_class)) { - fprintf(stderr, "Skipping hidden class: %s\n", isa->name); isa = isa->super_class; } return isa; diff --git a/sync.m b/sync.m index 68bcd74..63f78e1 100644 --- a/sync.m +++ b/sync.m @@ -51,7 +51,7 @@ static Class allocateLockClass(Class superclass) // Set the superclass pointer to the name. The runtime will fix this when // the class links are resolved. newClass->name = superclass->name; - newClass->info = objc_class_flag_resolved | + newClass->info = objc_class_flag_resolved | objc_class_flag_initialized | objc_class_flag_class | objc_class_flag_user_created | objc_class_flag_new_abi | objc_class_flag_hidden_class | objc_class_flag_lock_class; @@ -62,6 +62,8 @@ static Class allocateLockClass(Class superclass) { newClass->info |= objc_class_flag_meta; } + mutex_t *lock = object_getIndexedIvars(newClass); + INIT_LOCK(*lock); return newClass; } @@ -72,7 +74,6 @@ static inline Class initLockObject(id obj) if (class_isMetaClass(obj->isa)) { obj->isa = lockClass; - objc_send_initialize(obj); } else { @@ -83,10 +84,7 @@ static inline Class initLockObject(id obj) types); obj->isa = lockClass; } - mutex_t *lock = object_getIndexedIvars(lockClass); - INIT_LOCK(*lock); - fprintf(stderr, "Making %p hidden class for %p\n", lockClass, obj); return lockClass; }