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

Reply via email to