diff --git a/NSBlocks.m b/NSBlocks.m index 2235069..13e1c75 100644 --- a/NSBlocks.m +++ b/NSBlocks.m @@ -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(); diff --git a/associate.m b/associate.m index 37b9c26..fd3317c 100644 --- a/associate.m +++ b/associate.m @@ -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; diff --git a/class.h b/class.h index 0c3df08..7ed2d26 100644 --- a/class.h +++ b/class.h @@ -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. */ diff --git a/legacy.c b/legacy.c index 8c99730..aac1da8 100644 --- a/legacy.c +++ b/legacy.c @@ -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); } diff --git a/properties.m b/properties.m index c25ec37..17fb0f7 100644 --- a/properties.m +++ b/properties.m @@ -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) { diff --git a/runtime.c b/runtime.c index 5e064c1..ee4b67e 100644 --- a/runtime.c +++ b/runtime.c @@ -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;