diff --git a/class.h b/class.h index 4d4f812..3e2963e 100644 --- a/class.h +++ b/class.h @@ -259,7 +259,7 @@ void class_table_insert(Class class); * used for storing 31-bit signed integers. In 64-bit mode then we can have 7, * because classes are guaranteed to be word aligned. */ -extern Class SmallObjectClasses[4]; +extern Class SmallObjectClasses[7]; static BOOL isSmallObject(id obj) { @@ -279,7 +279,7 @@ static inline Class classForObject(id obj) else { uintptr_t addr = ((uintptr_t)obj); - return SmallObjectClasses[((addr >> 1) & 3)]; + return SmallObjectClasses[(addr & OBJC_SMALL_OBJECT_MASK)]; } } return obj->isa; diff --git a/class_table.c b/class_table.c index 891da61..d01f5b9 100644 --- a/class_table.c +++ b/class_table.c @@ -423,29 +423,20 @@ PRIVATE void objc_load_class(struct objc_class *class) } } -PRIVATE Class SmallObjectClasses[4]; +PRIVATE Class SmallObjectClasses[7]; BOOL objc_registerSmallObjectClass_np(Class class, uintptr_t mask) { - if (sizeof(id) == 4) + if ((mask & OBJC_SMALL_OBJECT_MASK) != mask) { - if (SmallObjectClasses[0] == Nil && (mask == 1)) - { - SmallObjectClasses[0] = class; - return YES; - } + return NO; } - else + if (Nil != SmallObjectClasses[mask]) { - int i = (mask >> 1); - if ((mask < 7) && ((mask & 1) == 1)) - if (SmallObjectClasses[i] == Nil) - { - SmallObjectClasses[i] = class; - return YES; - } + return NO; } - return NO; + SmallObjectClasses[mask] = class; + return YES; }