Remove separate flags for class and metaclass.

Every class is either a class or a metaclass, it doesn't make sense to
use two flags to store one bit of data.

Also remove the newabi flag from classes in the v2 ABI, where it's
redundant.
main
David Chisnall 8 years ago
parent c4ff744620
commit 4036a88936

@ -30,7 +30,6 @@ static void createNSBlockSubclass(Class superclass, Class newClass,
newClass->isa = metaClass; newClass->isa = metaClass;
newClass->super_class = superclass; newClass->super_class = superclass;
newClass->name = name; newClass->name = name;
newClass->info = objc_class_flag_class;
newClass->dtable = uninstalled_dtable; newClass->dtable = uninstalled_dtable;
LOCK_RUNTIME_FOR_SCOPE(); LOCK_RUNTIME_FOR_SCOPE();

@ -206,10 +206,8 @@ static Class allocateHiddenClass(Class superclass)
// class is which // class is which
// static int count; // static int count;
//asprintf(&newClass->name, "%s%d", superclass->name, count++); //asprintf(&newClass->name, "%s%d", superclass->name, count++);
newClass->info = objc_class_flag_resolved | newClass->info = objc_class_flag_resolved | objc_class_flag_user_created |
objc_class_flag_class | objc_class_flag_user_created | objc_class_flag_hidden_class | objc_class_flag_assoc_class;
objc_class_flag_new_abi | objc_class_flag_hidden_class |
objc_class_flag_assoc_class;
newClass->super_class = superclass; newClass->super_class = superclass;
newClass->dtable = uninstalled_dtable; newClass->dtable = uninstalled_dtable;
newClass->instance_size = superclass->instance_size; newClass->instance_size = superclass->instance_size;

@ -307,10 +307,8 @@ struct objc_class_gcc
*/ */
enum objc_class_flags enum objc_class_flags
{ {
/** This class structure represents a class. */
objc_class_flag_class = (1<<0),
/** This class structure represents a metaclass. */ /** This class structure represents a metaclass. */
objc_class_flag_meta = (1<<1), objc_class_flag_meta = (1<<0),
/** /**
* This class has been sent a +initalize message. This message is sent * This class has been sent a +initalize message. This message is sent
* exactly once to every class that is sent a message by the runtime, just * exactly once to every class that is sent a message by the runtime, just
@ -324,12 +322,6 @@ enum objc_class_flags
* if applicable. * if applicable.
*/ */
objc_class_flag_resolved = (1<<3), objc_class_flag_resolved = (1<<3),
/**
* The class uses the new, Objective-C 2, runtime ABI. This ABI defines an
* ABI version field inside the class, and so will be used for all
* subsequent versions that retain some degree of compatibility.
*/
objc_class_flag_new_abi = (1<<4),
/** /**
* This class was created at run time and may be freed. * This class was created at run time and may be freed.
*/ */
@ -375,36 +367,6 @@ static inline BOOL objc_test_class_flag(struct objc_class *aClass,
return (aClass->info & (unsigned long)flag) == (unsigned long)flag; return (aClass->info & (unsigned long)flag) == (unsigned long)flag;
} }
static inline BOOL objc_test_class_flag_legacy(struct objc_class_gsv1 *aClass,
enum objc_class_flags flag)
{
return (aClass->info & (unsigned long)flag) == (unsigned long)flag;
}
/**
* Checks the version of a class. Return values are:
* 0. Legacy GCC ABI compatible class.
* 1. First release of GNUstep ABI.
* 2. Second release of the GNUstep ABI, adds strong / weak ivar bitmaps.
* 3. Third release of the GNUstep ABI. Many cleanups.
*/
static inline int objc_get_class_version(struct objc_class *aClass)
{
if (!objc_test_class_flag(aClass, objc_class_flag_new_abi))
{
return 0;
}
return aClass->abi_version + 1;
}
static inline int objc_get_class_version_legacy(struct objc_class_gsv1 *aClass)
{
if (!objc_test_class_flag_legacy(aClass, objc_class_flag_new_abi))
{
return 0;
}
return aClass->abi_version + 1;
}
/** /**
* Adds a class to the class table. * Adds a class to the class table.
*/ */

@ -12,9 +12,44 @@
PRIVATE size_t lengthOfTypeEncoding(const char *types); PRIVATE size_t lengthOfTypeEncoding(const char *types);
enum objc_class_flags_gsv1
{
/** This class structure represents a class. */
objc_class_flag_class_gsv1 = (1<<0),
/** This class structure represents a metaclass. */
objc_class_flag_meta_gsv1 = (1<<1),
/**
* The class uses the new, Objective-C 2, runtime ABI. This ABI defines an
* ABI version field inside the class, and so will be used for all
* subsequent versions that retain some degree of compatibility.
*/
objc_class_flag_new_abi_gsv1 = (1<<4)
};
static inline BOOL objc_test_class_flag_gsv1(struct objc_class_gsv1 *aClass,
enum objc_class_flags_gsv1 flag)
{
return (aClass->info & (unsigned long)flag) == (unsigned long)flag;
}
/**
* Checks the version of a class. Return values are:
* 0. Legacy GCC ABI compatible class.
* 1. First release of GNUstep ABI.
* 2. Second release of the GNUstep ABI, adds strong / weak ivar bitmaps.
* 3. Third release of the GNUstep ABI. Many cleanups.
*/
static inline int objc_get_class_version_gsv1(struct objc_class_gsv1 *aClass)
{
if (!objc_test_class_flag_gsv1(aClass, objc_class_flag_new_abi_gsv1))
{
return 0;
}
return aClass->abi_version + 1;
}
static ivar_ownership ownershipForIvar(struct objc_class_gsv1 *cls, int idx) static ivar_ownership ownershipForIvar(struct objc_class_gsv1 *cls, int idx)
{ {
if (objc_get_class_version_legacy(cls) < 2) if (objc_get_class_version_gsv1(cls) < 2)
{ {
return ownership_unsafe; return ownership_unsafe;
} }
@ -51,7 +86,7 @@ static struct objc_ivar_list *upgradeIvarList(struct objc_class_gsv1 *cls)
int size = nextOffset - l->ivar_list[i].offset; int size = nextOffset - l->ivar_list[i].offset;
n->ivar_list[i].name = l->ivar_list[i].name; n->ivar_list[i].name = l->ivar_list[i].name;
n->ivar_list[i].type = type; n->ivar_list[i].type = type;
if (objc_test_class_flag_legacy(cls, objc_class_flag_new_abi)) if (objc_test_class_flag_gsv1(cls, objc_class_flag_new_abi_gsv1))
{ {
n->ivar_list[i].offset = cls->ivar_offsets[i]; n->ivar_list[i].offset = cls->ivar_offsets[i];
} }
@ -258,7 +293,7 @@ PRIVATE Class objc_upgrade_class(struct objc_class_gsv1 *oldClass)
// super_class is left nil and we upgrade it later. // super_class is left nil and we upgrade it later.
cls->name = oldClass->name; cls->name = oldClass->name;
cls->version = oldClass->version; cls->version = oldClass->version;
cls->info = oldClass->info; cls->info = objc_class_flag_meta;
cls->instance_size = oldClass->instance_size; cls->instance_size = oldClass->instance_size;
cls->ivars = upgradeIvarList(oldClass); cls->ivars = upgradeIvarList(oldClass);
cls->methods = upgradeMethodList(oldClass->methods); cls->methods = upgradeMethodList(oldClass->methods);
@ -266,8 +301,9 @@ PRIVATE Class objc_upgrade_class(struct objc_class_gsv1 *oldClass)
cls->abi_version = oldClass->abi_version; cls->abi_version = oldClass->abi_version;
cls->properties = upgradePropertyList(oldClass->properties); cls->properties = upgradePropertyList(oldClass->properties);
objc_register_selectors_from_class(cls); objc_register_selectors_from_class(cls);
if (!objc_test_class_flag(cls, objc_class_flag_meta)) if (!objc_test_class_flag_gsv1(oldClass, objc_class_flag_meta_gsv1))
{ {
cls->info = 0;
cls->isa = objc_upgrade_class((struct objc_class_gsv1*)cls->isa); cls->isa = objc_upgrade_class((struct objc_class_gsv1*)cls->isa);
objc_setAssociatedObject((id)cls, &legacy_key, (id)oldClass, OBJC_ASSOCIATION_ASSIGN); objc_setAssociatedObject((id)cls, &legacy_key, (id)oldClass, OBJC_ASSOCIATION_ASSIGN);
} }

@ -239,8 +239,7 @@ void objc_setPropertyStruct(void *dest,
objc_property_t class_getProperty(Class cls, const char *name) objc_property_t class_getProperty(Class cls, const char *name)
{ {
// Old ABI classes don't have declared properties if (Nil == cls)
if (Nil == cls || !objc_test_class_flag(cls, objc_class_flag_new_abi))
{ {
return NULL; return NULL;
} }
@ -262,12 +261,17 @@ objc_property_t class_getProperty(Class cls, const char *name)
objc_property_t* class_copyPropertyList(Class cls, unsigned int *outCount) objc_property_t* class_copyPropertyList(Class cls, unsigned int *outCount)
{ {
if (Nil == cls || !objc_test_class_flag(cls, objc_class_flag_new_abi)) if (Nil == cls)
{ {
if (NULL != outCount) { *outCount = 0; } if (NULL != outCount) { *outCount = 0; }
return NULL; return NULL;
} }
struct objc_property_list *properties = cls->properties; struct objc_property_list *properties = cls->properties;
if (!properties)
{
if (NULL != outCount) { *outCount = 0; }
return NULL;
}
unsigned int count = 0; unsigned int count = 0;
for (struct objc_property_list *l=properties ; NULL!=l ; l=l->next) for (struct objc_property_list *l=properties ; NULL!=l ; l=l->next)
{ {

@ -689,8 +689,7 @@ Class objc_allocateClassPair(Class superclass, const char *name, size_t extraByt
metaClass->super_class = superclass->isa; 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;
metaClass->dtable = uninstalled_dtable; metaClass->dtable = uninstalled_dtable;
metaClass->instance_size = sizeof(struct objc_class); metaClass->instance_size = sizeof(struct objc_class);
@ -699,8 +698,7 @@ Class objc_allocateClassPair(Class superclass, const char *name, size_t extraByt
newClass->super_class = superclass; newClass->super_class = superclass;
newClass->name = strdup(name); newClass->name = strdup(name);
newClass->info = objc_class_flag_class | objc_class_flag_user_created | newClass->info = objc_class_flag_user_created;
objc_class_flag_new_abi;
newClass->dtable = uninstalled_dtable; newClass->dtable = uninstalled_dtable;
newClass->abi_version = 2; newClass->abi_version = 2;

Loading…
Cancel
Save