mirror of
https://github.com/gnustep/libs-base.git
synced 2025-05-12 00:51:08 +00:00
Use the small object support in libobjc2 trunk for 31 / 61-bit signed NSNumbers on 32 / 64-bit platforms respectively. Still to do: add an NSSmallFloat equivalent for 64-bit platforms, storing a float.
git-svn-id: svn+ssh://svn.gna.org/svn/gnustep/libs/base/trunk@33639 72102866-910b-0410-8b05-ffd578937521
This commit is contained in:
parent
9895dac736
commit
c0f08f202a
1 changed files with 45 additions and 0 deletions
|
@ -47,6 +47,7 @@
|
||||||
#import "Foundation/NSException.h"
|
#import "Foundation/NSException.h"
|
||||||
#import "Foundation/NSValue.h"
|
#import "Foundation/NSValue.h"
|
||||||
#import "GNUstepBase/NSObject+GNUstepBase.h"
|
#import "GNUstepBase/NSObject+GNUstepBase.h"
|
||||||
|
#include <objc/runtime.h>
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* NSNumber implementation. This matches the behaviour of Apple's
|
* NSNumber implementation. This matches the behaviour of Apple's
|
||||||
|
@ -345,6 +346,42 @@ return NSOrderedSame;
|
||||||
#include "NSNumberMethods.h"
|
#include "NSNumberMethods.h"
|
||||||
@end
|
@end
|
||||||
|
|
||||||
|
#ifdef OBJC_SMALL_OBJECT_SHIFT
|
||||||
|
static BOOL useSmallInt;
|
||||||
|
|
||||||
|
|
||||||
|
@interface NSSmallInt : NSSignedIntegerNumber @end
|
||||||
|
@implementation NSSmallInt
|
||||||
|
#undef VALUE
|
||||||
|
#define VALUE (((intptr_t)self) >> 1)
|
||||||
|
#define FORMAT @"%d"
|
||||||
|
#include "NSNumberMethods.h"
|
||||||
|
+ (void)load
|
||||||
|
{
|
||||||
|
useSmallInt = objc_registerSmallObjectClass_np(self, 1);
|
||||||
|
}
|
||||||
|
+ (id)alloc
|
||||||
|
{
|
||||||
|
return (id)1;
|
||||||
|
}
|
||||||
|
+ (id)allocWithZone: (NSZone*)aZone
|
||||||
|
{
|
||||||
|
return (id)1;
|
||||||
|
}
|
||||||
|
- (id)copy
|
||||||
|
{
|
||||||
|
return self;
|
||||||
|
}
|
||||||
|
- (id)copyWithZone: (NSZone*)aZone
|
||||||
|
{
|
||||||
|
return self;
|
||||||
|
}
|
||||||
|
- (id)retain { return self; }
|
||||||
|
- (id)autorelease { return self; }
|
||||||
|
- (void)release { }
|
||||||
|
@end
|
||||||
|
#endif
|
||||||
|
|
||||||
@implementation NSNumber
|
@implementation NSNumber
|
||||||
|
|
||||||
static Class NSNumberClass;
|
static Class NSNumberClass;
|
||||||
|
@ -537,6 +574,14 @@ if (aValue >= -1 && aValue <= 12)\
|
||||||
}
|
}
|
||||||
|
|
||||||
CHECK_SINGLETON (aValue);
|
CHECK_SINGLETON (aValue);
|
||||||
|
#ifdef OBJC_SMALL_OBJECT_SHIFT
|
||||||
|
if (useSmallInt &&
|
||||||
|
(aValue < (INT_MAX>>OBJC_SMALL_OBJECT_SHIFT)) &&
|
||||||
|
(aValue > -(INT_MAX>>OBJC_SMALL_OBJECT_SHIFT)))
|
||||||
|
{
|
||||||
|
return (id)((aValue << 1) | 1);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
n = NSAllocateObject (NSIntNumberClass, 0, 0);
|
n = NSAllocateObject (NSIntNumberClass, 0, 0);
|
||||||
n->value = aValue;
|
n->value = aValue;
|
||||||
return AUTORELEASE(n);
|
return AUTORELEASE(n);
|
||||||
|
|
Loading…
Reference in a new issue