Author: thebeing
Date: Wed Jul 27 01:24:56 2016
New Revision: 40036

URL: http://svn.gna.org/viewcvs/gnustep?rev=40036&view=rev
Log:
Fix -getObjects:andKeys:

Modified:
    libs/base/trunk/ChangeLog
    libs/base/trunk/Source/NSDictionary.m
    libs/base/trunk/Tests/base/NSDictionary/general.m

Modified: libs/base/trunk/ChangeLog
URL: 
http://svn.gna.org/viewcvs/gnustep/libs/base/trunk/ChangeLog?rev=40036&r1=40035&r2=40036&view=diff
==============================================================================
--- libs/base/trunk/ChangeLog   (original)
+++ libs/base/trunk/ChangeLog   Wed Jul 27 01:24:56 2016
@@ -1,3 +1,9 @@
+2016-07-26  Niels Grewe <[email protected]>
+
+       * Source/NSDictionary.m
+       * Tests/base/NSDictionary/general.m:
+       Fix -getObjects:andKeys:
+       
 2016-07-26  Niels Grewe <[email protected]>
 
        * Headers/Foundation/NSData.h
@@ -66,7 +72,7 @@
 
        * Headers/Foundation/NSObjCRuntime.h
        * Headers/GNUstepBase/GNUstep.h:
-       
+
        Add NS_DESIGNATED_INITIALIZER macro
 
 2016-07-12  Richard Frith-Macdonald <[email protected]>
@@ -78,7 +84,7 @@
        like a date in the distant past (ie loop terminates at once), and the
        (-runUntilDate:) method fires any pending timers when given a date in
        the past.
-       
+
 2016-07-12  Wolfgang Lux  <[email protected]>
 
        * Source/GSICUString.m (UTextNSStringAccess): Fix unsigned
@@ -170,9 +176,9 @@
        to use a directory whose name is of the form architecture/library-combo
        rather than nested directories of the form cpu/os-abi/library-combo.
        The architecture name format is a sanitised triplet cpu-os-abi (where
-       previously we had cpu/os-abi). 
-       These changes are the first step in making GNUstep work seamlessly 
-       with Debian multiarch.  To use them you will need to rebuild your 
+       previously we had cpu/os-abi).
+       These changes are the first step in making GNUstep work seamlessly
+       with Debian multiarch.  To use them you will need to rebuild your
        entire gnustep installation using a version of gnustep-make which
        has correspoinding changes to know where to install bbinaries and
        resources.  However, the changes should have no effect on a flattened
@@ -226,7 +232,7 @@
        * Tests/base/NSRegularExpression/basic.m:
 
        Implement resource limits for regular expression evaluation. Tweaked
-       to roughly match the Cocoa behaviour, but can be changed through 
+       to roughly match the Cocoa behaviour, but can be changed through
        the GSRegularExpressionWorkLimit user default.
 
 2016-06-17  Niels Grewe <[email protected]>
@@ -276,8 +282,8 @@
 
 2016-05-27  Niels Grewe <[email protected]>
 
-       * Tools/AGSParser.m: Ignore __asm__ directives 
-       
+       * Tools/AGSParser.m: Ignore __asm__ directives
+
 2016-05-19 Seong Gu Lee <[email protected]>
 
        * GNUmakefile:

Modified: libs/base/trunk/Source/NSDictionary.m
URL: 
http://svn.gna.org/viewcvs/gnustep/libs/base/trunk/Source/NSDictionary.m?rev=40036&r1=40035&r2=40036&view=diff
==============================================================================
--- libs/base/trunk/Source/NSDictionary.m       (original)
+++ libs/base/trunk/Source/NSDictionary.m       Wed Jul 27 01:24:56 2016
@@ -863,10 +863,11 @@
 - (void)getObjects: (__unsafe_unretained id[])objects
            andKeys: (__unsafe_unretained id<NSCopying>[])keys
 {
-  int i=0;
+  NSUInteger i=0;
   FOR_IN(id, key, self)
-    keys[i] = key;
-    objects[i] = [self objectForKey: key];
+    if (keys != NULL) keys[i] = key;
+    if (objects != NULL) objects[i] = [self objectForKey: key];
+    i++;
   END_FOR_IN(self)
 }
 

Modified: libs/base/trunk/Tests/base/NSDictionary/general.m
URL: 
http://svn.gna.org/viewcvs/gnustep/libs/base/trunk/Tests/base/NSDictionary/general.m?rev=40036&r1=40035&r2=40036&view=diff
==============================================================================
--- libs/base/trunk/Tests/base/NSDictionary/general.m   (original)
+++ libs/base/trunk/Tests/base/NSDictionary/general.m   Wed Jul 27 01:24:56 2016
@@ -19,7 +19,8 @@
   NSArray *keys1, *keys2, *keys3, *keys4, *vals1, *vals2, *vals3, *vals4;
   id obj;
   NSDictionary *dict;
-
+  id vals1Array[2] = { nil, nil };
+  id keys1Array[2] = { nil, nil };
   key1 = @"Key1";
   key2 = @"Key2";
   key3 = @"Key3";
@@ -33,16 +34,16 @@
   vals1 = [NSArray arrayWithObjects:val1,val2,nil];
   vals2 = [NSArray arrayWithObjects:val1,val2,val2,nil]; /* duplicate vals */
   vals3 = [NSArray arrayWithObjects:val1,val2,val3,nil];
-  vals4 = [NSArray arrayWithObjects:val1, val2, val3, [NSDate date], 
+  vals4 = [NSArray arrayWithObjects:val1, val2, val3, [NSDate date],
                                     [NSNumber numberWithInt:2],
                                    [NSData data], nil];
   keys4 = [NSArray arrayWithObjects:key1, key2, key2, @"date", @"number",
                                     @"data",nil];
-   
-  
+
+
   dict = [NSDictionary new];
-  PASS(dict != nil && 
-       [dict isKindOfClass:[NSDictionary class]] 
+  PASS(dict != nil &&
+       [dict isKindOfClass:[NSDictionary class]]
        && [dict count] == 0,
        "-count returns zero for an empty dictionary");
 
@@ -52,7 +53,7 @@
        [obj isKindOfClass:[NSArray class]] &&
        [obj count] == 0,
        "-allKeys gives an empty array for an empty dictionary");
-  
+
   obj = [dict allKeysForObject:nil];
   PASS(obj == nil, "-allKeysForObject: gives nil for an empty dictionary");
 
@@ -67,20 +68,20 @@
 
     o1 = [dict objectForKey:nil];
     o2 = [dict objectForKey:key1];
-    PASS(o1 == nil && o2 == nil, 
+    PASS(o1 == nil && o2 == nil,
          "-objectForKey: gives nil for an empty dictionary");
   }
 
   {
     NSEnumerator *e = [dict keyEnumerator];
     id k1,k2;
-    
+
     k1 = [e nextObject];
     k2 = [e nextObject];
-    PASS(e != nil && k1 == nil && k2 == nil, 
+    PASS(e != nil && k1 == nil && k2 == nil,
          "-keyEnumerator: is ok for empty dictionary");
   }
-  
+
   {
     NSEnumerator *e = [dict objectEnumerator];
     id v1,v2;
@@ -90,7 +91,7 @@
     PASS(e != nil && v1 == nil && v2 == nil,
          "-objectEnumerator: is ok for empty dictionary");
   }
-  
+
   {
     NSString *notFound = @"notFound";
     NSArray *a = [dict objectsForKeys:keys1 notFoundMarker:notFound];
@@ -101,30 +102,30 @@
         [a objectAtIndex:1] == notFound,
         "-objectsForKeys:notFoundMarker: is ok for empty dictionary");
   }
- 
+
   obj = [dict description];
   obj = [obj propertyList];
-  PASS(obj != nil && 
-       [obj isKindOfClass:[NSDictionary class]] && 
+  PASS(obj != nil &&
+       [obj isKindOfClass:[NSDictionary class]] &&
        [obj count] == 0,
        "-description gives us a text property-list");
-  
+
   dict = [[NSDictionary dictionaryWithObjects:vals1 forKeys:keys1] retain];
-  PASS(dict != nil && 
-       [dict isKindOfClass:[NSDictionary class]] && 
+  PASS(dict != nil &&
+       [dict isKindOfClass:[NSDictionary class]] &&
        [dict count] == 2,
        "-count returns two for an dictionary with two keys");
-  
+
   PASS([dict hash] == 2, "-hash returns two for a dictionary with two keys");
-  
+
   obj = [dict allKeys];
   PASS(obj != nil &&
        [obj isKindOfClass:[NSArray class]] &&
        [obj count] == 2 &&
        [obj containsObject:key1] &&
-       [obj containsObject:key1], 
+       [obj containsObject:key1],
        "-allKeys gives the keys we put in the dictionary");
- 
+
   {
     NSArray *o1,*o2;
     o1 = [dict allKeysForObject:val1];
@@ -146,53 +147,53 @@
        [obj containsObject:val1] &&
        [obj containsObject:val2],
        "-allValues gives the values we put in the dictionary");
- 
+
   PASS([dict objectForKey:nil] == nil,"-objectForKey: gives nil for a nil 
key");
   PASS([dict objectForKey:key3] == nil,
        "-objectForKey: gives nil for a key not in the dictionary");
-  
+
   {
     id o1 = [dict objectForKey: key1];
     id o2 = [dict objectForKey: key2];
-    PASS(o1 == val1 && o2 == val2, 
+    PASS(o1 == val1 && o2 == val2,
          "-objectForKey: gives the objects we added for the keys");
   }
 
   {
     NSEnumerator *e = [dict keyEnumerator];
     id k1,k2,k3;
-    k1 = [e nextObject]; 
-    k2 = [e nextObject]; 
-    k3 = [e nextObject]; 
+    k1 = [e nextObject];
+    k2 = [e nextObject];
+    k3 = [e nextObject];
     PASS(k1 != nil &&
          k2 != nil &&
         k3 == nil &&
         k1 != k2 &&
         [keys1 containsObject:k1] &&
-        [keys1 containsObject:k2], 
-         "-keyEnumerator: enumerates the dictionary");  
-  }
-  
+        [keys1 containsObject:k2],
+         "-keyEnumerator: enumerates the dictionary");
+  }
+
   {
     NSEnumerator *e = [dict objectEnumerator];
     id v1,v2,v3;
-    v1 = [e nextObject]; 
-    v2 = [e nextObject]; 
-    v3 = [e nextObject]; 
-    
+    v1 = [e nextObject];
+    v2 = [e nextObject];
+    v3 = [e nextObject];
+
     PASS(v1 != nil &&
          v2 != nil &&
         v3 == nil &&
         v1 != v2 &&
         [vals1 containsObject:v1] &&
-        [vals1 containsObject:v2], 
-         "-objectEnumerator: enumerates the dictionary");       
-  }
-  
+        [vals1 containsObject:v2],
+         "-objectEnumerator: enumerates the dictionary");
+  }
+
   {
     NSString *notFound = @"notFound";
     NSArray *a = [dict objectsForKeys:keys2 notFoundMarker:notFound];
-    
+
     PASS(a != nil &&
          [a isKindOfClass:[NSArray class]] &&
         [a count] == 3 &&
@@ -201,7 +202,7 @@
         [a objectAtIndex:2] == notFound,
         "-objectsForKeys:notFoundMarker: is ok for dictionary");
   }
-  
+
   {
     NSArray *a = [dict keysSortedByValueUsingSelector:@selector(compare:)];
     PASS(a != nil &&
@@ -211,18 +212,42 @@
         [a objectAtIndex:1] == key1,
         "-keysSortedByValueUsingSelector: seems ok");
   }
-  
+
   obj = [dict description];
   obj = [obj propertyList];
-  PASS(obj != nil && 
+  PASS(obj != nil &&
        [obj isKindOfClass:[NSDictionary class]] &&
        [obj isEqual:dict],
        "-description gives us a text property-list");
-  
+
+  [dict getObjects: &vals1Array andKeys: &keys1Array];
+  uint8_t found = 0;
+  if (vals1Array[0] == val1 || vals1Array[1] == val1)
+    {
+      found |= 1;
+    }
+  if (vals1Array[0] == val2 || vals1Array[1] == val2)
+    {
+      found |= 1 << 1;
+    }
+  if (keys1Array[0] == key1 || keys1Array[1] == key1)
+    {
+      found |= 1 << 2;
+    }
+  if (keys1Array[0] == key2 || keys1Array[1] == key2)
+    {
+      found |= 1 << 3;
+    }
+  PASS(found == 0b1111, "-getObjects:andKeys: returns correct objects");
+  PASS_RUNS([dict getObjects: NULL andKeys: &keys1Array],
+    "-getObjects:andKeys: can ignore objects");
+  PASS_RUNS([dict getObjects: &vals1Array andKeys: NULL],
+    "-getObjects:andKeys: can ignore keys");
+
 
   ASSIGN(dict,[NSDictionary dictionaryWithObjects:vals4 forKeys:keys4]);
   PASS(dict != nil, "we can create a dictionary with several keys");
-  
+
 #if     defined(GNUSTEP_BASE_LIBRARY)
   obj = [NSSerializer serializePropertyList:dict];
   obj = [NSDeserializer deserializePropertyListFromData:obj
@@ -232,7 +257,7 @@
        [obj isEqual:dict],
        "data/number/data are ok in serialized property-list");
 #endif
-  
+
   [arp release]; arp = nil;
   return 0;
 }


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

Reply via email to