diff --git a/objc/objc-api.h b/objc/objc-api.h index f68ae2d..cd6ee49 100644 --- a/objc/objc-api.h +++ b/objc/objc-api.h @@ -551,15 +551,11 @@ static inline Class class_get_super_class(Class _class) { void __objc_resolve_class_links(void); - if CLS_ISCLASS(_class) + if (!CLS_ISRESOLV(_class)) { - if (!CLS_ISRESOLV(_class)) - { - __objc_resolve_class_links(); - } - return _class->super_class; + __objc_resolve_class_links(); } - return Nil; + return _class->super_class; } static inline int diff --git a/runtime.c b/runtime.c index 3ca148c..f2da7ed 100644 --- a/runtime.c +++ b/runtime.c @@ -394,7 +394,6 @@ const char * class_getName(Class cls) return class_get_class_name(cls); } -void __objc_resolve_class_links(void); Class class_getSuperclass(Class cls) { return class_get_super_class(cls); @@ -742,10 +741,11 @@ Class objc_allocateClassPair(Class superclass, const char *name, size_t extraByt Class metaClass = calloc(1, sizeof(struct objc_class)); // Initialize the metaclass - metaClass->class_pointer = superclass->class_pointer; - metaClass->super_class = superclass->class_pointer->super_class; + metaClass->class_pointer = superclass->class_pointer->class_pointer; + metaClass->super_class = superclass->class_pointer; metaClass->info = _CLS_META | _CLS_RUNTIME | _CLS_NEW_ABI; metaClass->dtable = __objc_uninstalled_dtable; + metaClass->instance_size = sizeof(struct objc_class); // Set up the new class newClass->class_pointer = metaClass; @@ -753,6 +753,7 @@ Class objc_allocateClassPair(Class superclass, const char *name, size_t extraByt newClass->name = strdup(name); newClass->info = _CLS_CLASS | _CLS_RUNTIME | _CLS_NEW_ABI; newClass->dtable = __objc_uninstalled_dtable; + newClass->instance_size = superclass->instance_size; return newClass; } @@ -792,6 +793,7 @@ const char *object_getClassName(id obj) } void __objc_add_class_to_hash(Class cls); +void __objc_resolve_class_links(void); void objc_registerClassPair(Class cls) { @@ -799,16 +801,9 @@ void objc_registerClassPair(Class cls) // Initialize the dispatch table for the class and metaclass. __objc_update_dispatch_table_for_class(metaClass); __objc_update_dispatch_table_for_class(cls); - CLS_SETINITIALIZED(metaClass); - CLS_SETINITIALIZED(cls); - // Add pointer from super class - objc_mutex_lock(__objc_runtime_mutex); - cls->sibling_class = cls->super_class->subclass_list; - cls->super_class->subclass_list = cls; - metaClass->sibling_class = metaClass->super_class->subclass_list; - metaClass->super_class->subclass_list = metaClass; - objc_mutex_unlock(__objc_runtime_mutex); __objc_add_class_to_hash(cls); + // Add pointer from super class + __objc_resolve_class_links(); } static id objectNew(id cls)