@@ -292,26 +292,38 @@ return; superclassName = (const char *)class->superclass; if (superclassName != NULL) { Class super = objc_classname_to_class(superclassName, false); + Class rootClass; if (super == Nil) return; setupClass(super); if (!(super->info & OBJC_CLASS_INFO_SETUP)) return; + /* + * GCC sets class->isa->isa to the name of the root class, + * while Clang just sets it to Nil. Therefore always calculate + * it. + */ + for (Class iter = super; iter != NULL; iter = iter->superclass) + rootClass = iter; + class->superclass = super; + class->isa->isa = rootClass->isa; class->isa->superclass = super->isa; addSubclass(class); addSubclass(class->isa); - } else + } else { + class->isa->isa = class->isa; class->isa->superclass = class; + } updateIvarOffsets(class); class->info |= OBJC_CLASS_INFO_SETUP; class->isa->info |= OBJC_CLASS_INFO_SETUP;