Index: src/runtime/class.m ================================================================== --- src/runtime/class.m +++ src/runtime/class.m @@ -175,14 +175,22 @@ if (cls->info & OBJC_CLASS_INFO_SETUP) return; if ((superclass = ((struct objc_abi_class*)cls)->superclass) != NULL) { - if ((cls->superclass = objc_lookup_class(superclass)) == Nil) + Class super = objc_classname_to_class(superclass); + + if (super == nil) + return; + + setup_class(super); + + if (!(super->info & OBJC_CLASS_INFO_SETUP)) return; - cls->isa->superclass = cls->superclass->isa; + cls->superclass = super; + cls->isa->superclass = super->isa; add_subclass(cls); add_subclass(cls->isa); } else cls->isa->superclass = cls; @@ -191,10 +199,29 @@ objc_update_dtable(cls->isa); cls->info |= OBJC_CLASS_INFO_SETUP; cls->isa->info |= OBJC_CLASS_INFO_SETUP; } + +static void +initialize_class(Class cls) +{ + if (cls->info & OBJC_CLASS_INFO_INITIALIZED) + return; + + if (cls->superclass) + initialize_class(cls->superclass); + + /* + * 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; + + call_method(cls, "initialize"); +} void objc_register_all_classes(struct objc_abi_symtab *symtab) { size_t i; @@ -305,15 +332,11 @@ if (!(cls->info & OBJC_CLASS_INFO_SETUP)) { objc_global_mutex_unlock(); return Nil; } - /* Set it first to prevent calling it recursively */ - cls->info |= OBJC_CLASS_INFO_INITIALIZED; - cls->isa->info |= OBJC_CLASS_INFO_INITIALIZED; - - call_method(cls, "initialize"); + initialize_class(cls); objc_global_mutex_unlock(); return cls; }