Tweak 64-bit support for small objects.

main
theraven 15 years ago
parent a7d4cfd640
commit 4e3e71c750

@ -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, * used for storing 31-bit signed integers. In 64-bit mode then we can have 7,
* because classes are guaranteed to be word aligned. * because classes are guaranteed to be word aligned.
*/ */
extern Class SmallObjectClasses[4]; extern Class SmallObjectClasses[7];
static BOOL isSmallObject(id obj) static BOOL isSmallObject(id obj)
{ {
@ -279,7 +279,7 @@ static inline Class classForObject(id obj)
else else
{ {
uintptr_t addr = ((uintptr_t)obj); uintptr_t addr = ((uintptr_t)obj);
return SmallObjectClasses[((addr >> 1) & 3)]; return SmallObjectClasses[(addr & OBJC_SMALL_OBJECT_MASK)];
} }
} }
return obj->isa; return obj->isa;

@ -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) 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)) return NO;
{
SmallObjectClasses[0] = class;
return YES;
}
} }
else if (Nil != SmallObjectClasses[mask])
{ {
int i = (mask >> 1); return NO;
if ((mask < 7) && ((mask & 1) == 1))
if (SmallObjectClasses[i] == Nil)
{
SmallObjectClasses[i] = class;
return YES;
}
} }
return NO; SmallObjectClasses[mask] = class;
return YES;
} }

Loading…
Cancel
Save