Author: rfm
Date: Fri May 22 18:24:27 2015
New Revision: 38525
URL: http://svn.gna.org/viewcvs/gnustep?rev=38525&view=rev
Log:
Another tiny string optimisation
Modified:
libs/base/trunk/Source/GSString.m
libs/base/trunk/Source/NSString.m
Modified: libs/base/trunk/Source/GSString.m
URL:
http://svn.gna.org/viewcvs/gnustep/libs/base/trunk/Source/GSString.m?rev=38525&r1=38524&r2=38525&view=diff
==============================================================================
--- libs/base/trunk/Source/GSString.m (original)
+++ libs/base/trunk/Source/GSString.m Fri May 22 18:24:27 2015
@@ -749,6 +749,38 @@
#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
@@ -948,6 +980,11 @@
#else
return strtoll(buf, 0, 10);
#endif
+}
+
+- (BOOL) isEqualToString: (NSString*)aString
+{
+ return tinyEqualToString((uintptr_t)self, aString);
}
- (NSUInteger) length
@@ -5571,6 +5608,17 @@
{
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;
Modified: libs/base/trunk/Source/NSString.m
URL:
http://svn.gna.org/viewcvs/gnustep/libs/base/trunk/Source/NSString.m?rev=38525&r1=38524&r2=38525&view=diff
==============================================================================
--- libs/base/trunk/Source/NSString.m (original)
+++ libs/base/trunk/Source/NSString.m Fri May 22 18:24:27 2015
@@ -2685,12 +2685,19 @@
*/
- (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;
}
_______________________________________________
Gnustep-cvs mailing list
[email protected]
https://mail.gna.org/listinfo/gnustep-cvs