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->super_class = superclass;
newClass->name = name;
newClass->info = objc_class_flag_class;
newClass->dtable = uninstalled_dtable;
LOCK_RUNTIME_FOR_SCOPE();

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

@ -307,10 +307,8 @@ struct objc_class_gcc
*/
enum objc_class_flags
{
/** This class structure represents a class. */
objc_class_flag_class = (1<<0),
/** 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
* exactly once to every class that is sent a message by the runtime, just
@ -324,12 +322,6 @@ enum objc_class_flags
* if applicable.
*/
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.
*/
@ -375,36 +367,6 @@ static inline BOOL objc_test_class_flag(struct objc_class *aClass,
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.
*/

@ -12,9 +12,44 @@
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)
{
if (objc_get_class_version_legacy(cls) < 2)
if (objc_get_class_version_gsv1(cls) < 2)
{
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;
n->ivar_list[i].name = l->ivar_list[i].name;
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];
}
@ -258,7 +293,7 @@ PRIVATE Class objc_upgrade_class(struct objc_class_gsv1 *oldClass)
// super_class is left nil and we upgrade it later.
cls->name = oldClass->name;
cls->version = oldClass->version;
cls->info = oldClass->info;
cls->info = objc_class_flag_meta;
cls->instance_size = oldClass->instance_size;
cls->ivars = upgradeIvarList(oldClass);
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->properties = upgradePropertyList(oldClass->properties);
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);
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)
{
// Old ABI classes don't have declared properties
if (Nil == cls || !objc_test_class_flag(cls, objc_class_flag_new_abi))
if (Nil == cls)
{
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)
{
if (Nil == cls || !objc_test_class_flag(cls, objc_class_flag_new_abi))
if (Nil == cls)
{
if (NULL != outCount) { *outCount = 0; }
return NULL;
}
struct objc_property_list *properties = cls->properties;
if (!properties)
{
if (NULL != outCount) { *outCount = 0; }
return NULL;
}
unsigned int count = 0;
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->name = strdup(name);
metaClass->info = objc_class_flag_meta | objc_class_flag_user_created |
objc_class_flag_new_abi;
metaClass->info = objc_class_flag_meta | objc_class_flag_user_created;
metaClass->dtable = uninstalled_dtable;
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->name = strdup(name);
newClass->info = objc_class_flag_class | objc_class_flag_user_created |
objc_class_flag_new_abi;
newClass->info = objc_class_flag_user_created;
newClass->dtable = uninstalled_dtable;
newClass->abi_version = 2;

Loading…
Cancel
Save