From 19ba70e988f7766b529731bc88005a079f68409e Mon Sep 17 00:00:00 2001 From: Richard Frith-MacDonald Date: Fri, 22 May 2015 16:24:27 +0000 Subject: [PATCH] Another tiny string optimisation git-svn-id: svn+ssh://svn.gna.org/svn/gnustep/libs/base/trunk@38525 72102866-910b-0410-8b05-ffd578937521 --- Source/GSString.m | 48 +++++++++++++++++++++++++++++++++++++++++++++++ Source/NSString.m | 13 ++++++++++--- 2 files changed, 58 insertions(+), 3 deletions(-) diff --git a/Source/GSString.m b/Source/GSString.m index 2d7c41483..0caab5a1c 100644 --- a/Source/GSString.m +++ b/Source/GSString.m @@ -749,6 +749,38 @@ static BOOL useTinyStrings; #define TINY_STRING_CHAR(s, x) ((s & (0xFE00000000000000 >> (x*7))) >> (57-(x*7))) #define TINY_STRING_LENGTH_MASK 0x1f #define TINY_STRING_LENGTH_SHIFT OBJC_SMALL_OBJECT_SHIFT + +static BOOL +tinyEqualToString(uintptr_t s, NSString *aString) +{ + NSUInteger l; + + if ((NSString*)s == aString) + { + return YES; + } + + l = (s >> TINY_STRING_LENGTH_SHIFT) & TINY_STRING_LENGTH_MASK; + if ([aString length] != l) + { + return NO; + } + else if (l > 0) + { + unichar buf[8]; + + [aString getCharacters: buf range: NSMakeRange(0, l)]; + while (l-- > 0) + { + if ((unichar)TINY_STRING_CHAR(s, l) != buf[l]) + { + return NO; + } + } + } + return YES; +} + @interface GSTinyString : NSString @end @@ -950,6 +982,11 @@ tsbytes(uintptr_t s, char *buf) #endif } +- (BOOL) isEqualToString: (NSString*)aString +{ + return tinyEqualToString((uintptr_t)self, aString); +} + - (NSUInteger) length { uintptr_t s = (uintptr_t)self; @@ -5571,6 +5608,17 @@ literalIsEqual(NXConstantString *self, id anObject) { return NO; } +#if defined(OBJC_SMALL_OBJECT_SHIFT) && (OBJC_SMALL_OBJECT_SHIFT == 3) + if (useTinyStrings) + { + uintptr_t s = (uintptr_t)anObject; + + if (s & TINY_STRING_MASK) + { + return tinyEqualToString((uintptr_t)anObject, self); + } + } +#endif if (GSObjCIsInstance(anObject) == NO) { return NO; diff --git a/Source/NSString.m b/Source/NSString.m index 77c638601..e7634606d 100644 --- a/Source/NSString.m +++ b/Source/NSString.m @@ -2685,12 +2685,19 @@ static BOOL (*nbImp)(id, SEL, unichar) = 0; */ - (BOOL) isEqualToString: (NSString*)aString { + if (aString == self) + { + return YES; + } if ([self hash] != [aString hash]) - return NO; - + { + return NO; + } if (strCompNsNs(self, aString, 0, (NSRange){0, [self length]}) == NSOrderedSame) - return YES; + { + return YES; + } return NO; }