Index: src/OFBlock.m ================================================================== --- src/OFBlock.m +++ src/OFBlock.m @@ -70,34 +70,34 @@ @end #ifdef OF_OBJFW_RUNTIME /* Begin of ObjC module */ static struct objc_class _NSConcreteStackBlock_metaclass = { - (Class)(void *)"OFObject", (Class)(void *)"OFBlock", "OFStackBlock", 8, - OBJC_CLASS_INFO_METACLASS, sizeof(struct objc_class), NULL, NULL + Nil, Nil, "OFStackBlock", 8, OBJC_CLASS_INFO_METACLASS, + sizeof(_NSConcreteStackBlock_metaclass), NULL, NULL }; struct objc_class _NSConcreteStackBlock = { &_NSConcreteStackBlock_metaclass, (Class)(void *)"OFBlock", "OFStackBlock", 8, OBJC_CLASS_INFO_CLASS, sizeof(of_block_literal_t), NULL, NULL }; static struct objc_class _NSConcreteGlobalBlock_metaclass = { - (Class)(void *)"OFObject", (Class)(void *)"OFBlock", "OFGlobalBlock", 8, - OBJC_CLASS_INFO_METACLASS, sizeof(struct objc_class), NULL, NULL + Nil, Nil, "OFGlobalBlock", 8, OBJC_CLASS_INFO_METACLASS, + sizeof(_NSConcreteGlobalBlock_metaclass), NULL, NULL }; struct objc_class _NSConcreteGlobalBlock = { &_NSConcreteGlobalBlock_metaclass, (Class)(void *)"OFBlock", "OFGlobalBlock", 8, OBJC_CLASS_INFO_CLASS, sizeof(of_block_literal_t), NULL, NULL }; static struct objc_class _NSConcreteMallocBlock_metaclass = { - (Class)(void *)"OFObject", (Class)(void *)"OFBlock", "OFMallocBlock", 8, - OBJC_CLASS_INFO_METACLASS, sizeof(struct objc_class), NULL, NULL + Nil, Nil, "OFMallocBlock", 8, OBJC_CLASS_INFO_METACLASS, + sizeof(_NSConcreteMallocBlock_metaclass), NULL, NULL }; struct objc_class _NSConcreteMallocBlock = { &_NSConcreteMallocBlock_metaclass, (Class)(void *)"OFBlock", "OFMallocBlock", 8, OBJC_CLASS_INFO_CLASS, sizeof(of_block_literal_t), Index: src/runtime/class.m ================================================================== --- src/runtime/class.m +++ src/runtime/class.m @@ -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;