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,
* 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;

@ -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;
}

Loading…
Cancel
Save