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

Loading…
Cancel
Save