Attempt to fix objcAllocateClassPair() for root classes.

@David: Could you check whether I got this right?
main
thebeing 14 years ago
parent e8645c8ceb
commit 8cf9b6058b

@ -684,11 +684,23 @@ Class objc_allocateClassPair(Class superclass, const char *name, size_t extraByt
// Create the metaclass
Class metaClass = gc->malloc(sizeof(struct objc_class));
if (Nil == superclass)
{
/*
* Metaclasses of root classes are precious little flowers and work a
* little differently:
*/
metaClass->isa = metaClass;
metaClass->super_class = newClass;
}
else
{
// Initialize the metaclass
// Set the meta-metaclass pointer to the name. The runtime will fix this
// in objc_resolve_class().
metaClass->isa = (Class)superclass->isa->isa->name;
metaClass->super_class = superclass->isa;
}
metaClass->name = strdup(name);
metaClass->info = objc_class_flag_meta | objc_class_flag_user_created |
objc_class_flag_new_abi;
@ -699,12 +711,21 @@ Class objc_allocateClassPair(Class superclass, const char *name, size_t extraByt
newClass->isa = metaClass;
// Set the superclass pointer to the name. The runtime will fix this when
// the class links are resolved.
newClass->super_class = (Class)(superclass->name);
newClass->super_class = (Nil == superclass) ? Nil : (Class)(superclass->name);
newClass->name = strdup(name);
newClass->info = objc_class_flag_class | objc_class_flag_user_created |
objc_class_flag_new_abi;
newClass->dtable = uninstalled_dtable;
if (Nil == superclass)
{
newClass->instance_size = sizeof(struct objc_class);
}
else
{
newClass->instance_size = superclass->instance_size;
}
return newClass;
}

Loading…
Cancel
Save