Author: rfm
Date: Fri May 22 10:34:36 2015
New Revision: 38517

URL: http://svn.gna.org/viewcvs/gnustep?rev=38517&view=rev
Log:
Some optimisation for searcvhes in strings

Modified:
    libs/base/trunk/Source/GSPrivate.h
    libs/base/trunk/Source/NSString.m

Modified: libs/base/trunk/Source/GSPrivate.h
URL: 
http://svn.gna.org/viewcvs/gnustep/libs/base/trunk/Source/GSPrivate.h?rev=38517&r1=38516&r2=38517&view=diff
==============================================================================
--- libs/base/trunk/Source/GSPrivate.h  (original)
+++ libs/base/trunk/Source/GSPrivate.h  Fri May 22 10:34:36 2015
@@ -110,14 +110,28 @@
       _base = malloc((S) * sizeof(T));\
       P = _base;\
     }
+#  define      GS_BEGINITEMBUF2(P, S, T) { \
+  T _ibuf2[GS_MAX_OBJECTS_FROM_STACK];\
+  T *P = _ibuf2;\
+  __attribute__((cleanup(GSFreeTempBuffer))) void *_base2 = 0;\
+  if (S > GS_MAX_OBJECTS_FROM_STACK)\
+    {\
+      _base2 = malloc((S) * sizeof(T));\
+      P = _base2;\
+    }
 #else
 /* Make minimum size of _ibuf 1 to avoid compiler warnings.
  */
 #  define      GS_BEGINITEMBUF(P, S, T) { \
   T _ibuf[(S) > 0 && (S) <= GS_MAX_OBJECTS_FROM_STACK ? (S) : 1]; \
   T *_base = ((S) <= GS_MAX_OBJECTS_FROM_STACK) ? _ibuf \
-    : (T*)NSZoneMalloc(NSDefaultMallocZone(), (S) * sizeof(T)); \
+    : (T*)malloc((S) * sizeof(T)); \
   T *(P) = _base;
+#  define      GS_BEGINITEMBUF2(P, S, T) { \
+  T _ibuf2[(S) > 0 && (S) <= GS_MAX_OBJECTS_FROM_STACK ? (S) : 1]; \
+  T *_base2 = ((S) <= GS_MAX_OBJECTS_FROM_STACK) ? _ibuf2 \
+    : (T*)malloc((S) * sizeof(T)); \
+  T *(P) = _base2;
 #endif
 
 /**
@@ -127,10 +141,15 @@
  */
 #if __GNUC__ > 3 && !defined(__clang__)
 # define       GS_ENDITEMBUF() }
+# define       GS_ENDITEMBUF2() }
 #else
 #  define      GS_ENDITEMBUF() \
   if (_base != _ibuf) \
-    NSZoneFree(NSDefaultMallocZone(), _base); \
+    free(_base); \
+  }
+#  define      GS_ENDITEMBUF2() \
+  if (_base2 != _ibuf2) \
+    free(_base2); \
   }
 #endif
 

Modified: libs/base/trunk/Source/NSString.m
URL: 
http://svn.gna.org/viewcvs/gnustep/libs/base/trunk/Source/NSString.m?rev=38517&r1=38516&r2=38517&view=diff
==============================================================================
--- libs/base/trunk/Source/NSString.m   (original)
+++ libs/base/trunk/Source/NSString.m   Fri May 22 10:34:36 2015
@@ -1985,7 +1985,10 @@
 
   search = NSMakeRange (0, [self length]);
   complete = search;
-  found = [self rangeOfString: separator];
+  found = [self rangeOfString: separator
+                      options: 0
+                        range: search
+                       locale: nil];
   while (found.length != 0)
     {
       NSRange current;
@@ -1998,7 +2001,8 @@
        complete.length - found.location - found.length);
       found = [self rangeOfString: separator
                          options: 0
-                           range: search];
+                           range: search
+                           locale: nil];
     }
   // Add the last search string range
   [array addObject: [self substringWithRange: search]];
@@ -2211,7 +2215,8 @@
 
   return [self rangeOfString: string
                     options: 0
-                      range: all];
+                      range: all
+                      locale: nil];
 }
 
 /**
@@ -2225,7 +2230,8 @@
 
   return [self rangeOfString: string
                     options: mask
-                      range: all];
+                      range: all
+                      locale: nil];
 }
 
 /**
@@ -2301,18 +2307,13 @@
 
       if (NULL != coll)
        {
-         NSRange result = NSMakeRange(NSNotFound, 0);
-         UErrorCode status = U_ZERO_ERROR; 
-         NSUInteger countSelf = searchRange.length;
-         NSUInteger countOther = [aString length];       
-         unichar *charsSelf;
-         unichar *charsOther;
+         NSRange       result = NSMakeRange(NSNotFound, 0);
+         UErrorCode    status = U_ZERO_ERROR; 
+         NSUInteger    countSelf = searchRange.length;
+         NSUInteger    countOther = [aString length];       
          UStringSearch *search = NULL;
-
-         charsSelf = NSZoneMalloc(NSDefaultMallocZone(),
-           countSelf * sizeof(unichar));
-         charsOther = NSZoneMalloc(NSDefaultMallocZone(),
-           countOther * sizeof(unichar));
+          GS_BEGINITEMBUF(charsSelf, (countSelf * sizeof(unichar)), unichar)
+          GS_BEGINITEMBUF2(charsOther, (countOther * sizeof(unichar)), unichar)
 
          // Copy to buffer
       
@@ -2326,6 +2327,7 @@
            {
              int32_t matchLocation;
              int32_t matchLength;
+
              if ((mask & NSBackwardsSearch) == NSBackwardsSearch)
                {               
                  matchLocation = usearch_last(search, &status);
@@ -2365,8 +2367,8 @@
                    }
                }
            }
-         NSZoneFree(NSDefaultMallocZone(), charsSelf);
-         NSZoneFree(NSDefaultMallocZone(), charsOther);          
+          GS_ENDITEMBUF2()
+          GS_ENDITEMBUF()
          usearch_close(search);
          ucol_close(coll);
          return result;
@@ -2381,7 +2383,7 @@
 {
   NSRange range = {0, [self length]};
 
-  range = [self rangeOfString: substring options: 0 range: range];
+  range = [self rangeOfString: substring options: 0 range: range locale: nil];
   return range.length ? range.location : NSNotFound;
 }
 
@@ -2390,7 +2392,7 @@
 {
   NSRange range = {index, [self length] - index};
 
-  range = [self rangeOfString: substring options: 0 range: range];
+  range = [self rangeOfString: substring options: 0 range: range locale: nil];
   return range.length ? range.location : NSNotFound;
 }
 
@@ -2483,9 +2485,12 @@
  */
 - (BOOL) hasPrefix: (NSString*)aString
 {
-  NSRange      range;
-
-  range = [self rangeOfString: aString options: NSAnchoredSearch];
+  NSRange      range = NSMakeRange(0, [self length]);
+
+  range = [self rangeOfString: aString
+                      options: NSAnchoredSearch
+                        range: range
+                       locale: nil];
   return (range.length > 0) ? YES : NO;
 }
 
@@ -2494,10 +2499,12 @@
  */
 - (BOOL) hasSuffix: (NSString*)aString
 {
-  NSRange      range;
+  NSRange      range = NSMakeRange(0, [self length]);
 
   range = [self rangeOfString: aString
-                      options: NSAnchoredSearch | NSBackwardsSearch];
+                      options: NSAnchoredSearch | NSBackwardsSearch
+                        range: range
+                       locale: nil];
   return (range.length > 0) ? YES : NO;
 }
 
@@ -2511,12 +2518,9 @@
     {
       return YES;
     }
-  if (anObject != nil && GSObjCIsInstance(anObject) == YES)
-    {
-      if ([anObject isKindOfClass: NSStringClass])
-       {
-         return [self isEqualToString: anObject];
-       }
+  if (anObject != nil && [anObject isKindOfClass: NSStringClass])
+    {
+      return [self isEqualToString: anObject];
     }
   return NO;
 }
@@ -3905,7 +3909,10 @@
    * Look for a dot in the path ... if there isn't one, or if it is
    * immediately after the root or a path separator, there is no extension.
    */
-  range = [self rangeOfString: @"." options: NSBackwardsSearch range: range];
+  range = [self rangeOfString: @"."
+                      options: NSBackwardsSearch
+                        range: range
+                       locale: nil];
   if (range.length > 0 && range.location > root
     && pathSepMember([self characterAtIndex: range.location-1]) == NO)
     {
@@ -4232,7 +4239,8 @@
    */
   r0 = [self rangeOfString: @"."
                   options: NSBackwardsSearch
-                    range: range];
+                    range: range
+                    locale: nil];
   /*
    * Locate a path separator.
    */
@@ -4841,7 +4849,8 @@
 
   // Condense ('/./') sequences.
   r = (NSRange){root, l-root};
-  while ((r = [s rangeOfString: @"." options: 0 range: r]).length == 1)
+  while ((r = [s rangeOfString: @"." options: 0 range: r locale: nil]).length
+    == 1)
     {
       if (r.location > 0 && r.location < l - 1
        && pathSepMember((*caiImp)(s, caiSel, r.location-1)) == YES
@@ -4884,7 +4893,8 @@
    *   remove '/../' sequences and their matching parent directories.
    */
   r = (NSRange){root, l-root};
-  while ((r = [s rangeOfString: @".." options: 0 range: r]).length == 2)
+  while ((r = [s rangeOfString: @".." options: 0 range: r locale: nil]).length
+    == 2)
     {
       if (r.location > 0
        && pathSepMember((*caiImp)(s, caiSel, r.location-1)) == YES


_______________________________________________
Gnustep-cvs mailing list
[email protected]
https://mail.gna.org/listinfo/gnustep-cvs

Reply via email to