|
|
|
|
@ -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;
|
|
|
|
|
}
|
|
|
|
|
|