Author: rfm
Date: Sun Apr  9 14:45:18 2017
New Revision: 40462

URL: http://svn.gna.org/viewcvs/gnustep?rev=40462&view=rev
Log:
fixes for #47618

Modified:
    libs/base/trunk/ChangeLog
    libs/base/trunk/Source/NSPredicate.m
    libs/base/trunk/Tests/base/NSPredicate/basic.m

Modified: libs/base/trunk/ChangeLog
URL: 
http://svn.gna.org/viewcvs/gnustep/libs/base/trunk/ChangeLog?rev=40462&r1=40461&r2=40462&view=diff
==============================================================================
--- libs/base/trunk/ChangeLog   (original)
+++ libs/base/trunk/ChangeLog   Sun Apr  9 14:45:18 2017
@@ -1,3 +1,9 @@
+2017-04-09  Richard Frith-Macdonald <[email protected]>
+
+        * Source/NSPredicate.m:
+        * Tests/base/NSPredicate/basic.m:
+       Fixes for bug #47618.
+
 2017-04-09  Richard Frith-Macdonald <[email protected]>
 
        * Headers/Foundation/NSTask.h:

Modified: libs/base/trunk/Source/NSPredicate.m
URL: 
http://svn.gna.org/viewcvs/gnustep/libs/base/trunk/Source/NSPredicate.m?rev=40462&r1=40461&r2=40462&view=diff
==============================================================================
--- libs/base/trunk/Source/NSPredicate.m        (original)
+++ libs/base/trunk/Source/NSPredicate.m        Sun Apr  9 14:45:18 2017
@@ -362,10 +362,10 @@
 
 #if OS_API_VERSION(MAC_OS_X_VERSION_10_5, GS_API_LATEST)
 - (BOOL) evaluateWithObject: (id)object
-         substitutionVariables: (GS_GENERIC_CLASS(NSDictionary, NSString*, 
id)*)variables
+      substitutionVariables: (GS_GENERIC_CLASS(NSDictionary, NSString*, 
id)*)variables
 {
   return [[self predicateWithSubstitutionVariables: variables]
-                  evaluateWithObject: object];
+                                evaluateWithObject: object];
 }
 #endif
 - (Class) classForCoder
@@ -898,15 +898,6 @@
   BOOL leftIsNil;
   BOOL rightIsNil;
 
-  if (leftResult == evaluatedObjectExpression)
-    {
-      leftResult = object;
-    }
-  if (rightResult == evaluatedObjectExpression)
-    {
-      rightResult = object;
-    }
-
   leftIsNil = (leftResult == nil || [leftResult isEqual: [NSNull null]]);
   rightIsNil = (rightResult == nil || [rightResult isEqual: [NSNull null]]);
   if (leftIsNil || rightIsNil)
@@ -949,17 +940,29 @@
   switch (_type)
     {
       case NSLessThanPredicateOperatorType:
-       return ([leftResult compare: rightResult] == NSOrderedAscending)
-          ? YES : NO;
+        {
+          double ld = [leftResult doubleValue];
+          double rd = [rightResult doubleValue];
+          return (ld < rd) ? YES : NO;
+        }
       case NSLessThanOrEqualToPredicateOperatorType:
-       return ([leftResult compare: rightResult] != NSOrderedDescending)
-          ? YES : NO;
+        {
+          double ld = [leftResult doubleValue];
+          double rd = [rightResult doubleValue];
+          return (ld <= rd) ? YES : NO;
+        }
       case NSGreaterThanPredicateOperatorType:
-       return ([leftResult compare: rightResult] == NSOrderedDescending)
-          ? YES : NO;
+        {
+          double ld = [leftResult doubleValue];
+          double rd = [rightResult doubleValue];
+          return (ld > rd) ? YES : NO;
+        }
       case NSGreaterThanOrEqualToPredicateOperatorType:
-       return ([leftResult compare: rightResult] != NSOrderedAscending)
-          ? YES : NO;
+        {
+          double ld = [leftResult doubleValue];
+          double rd = [rightResult doubleValue];
+          return (ld >= rd) ? YES : NO;
+        }
       case NSEqualToPredicateOperatorType:
        return [leftResult isEqual: rightResult];
       case NSNotEqualToPredicateOperatorType:
@@ -1070,11 +1073,6 @@
       NSEnumerator *e;
       id value;
 
-      if (leftValue == evaluatedObjectExpression)
-       {
-         leftValue = object;
-       }
-
       if (![leftValue respondsToSelector: @selector(objectEnumerator)])
         {
           [NSException raise: NSInvalidArgumentException 
@@ -1356,14 +1354,18 @@
 - (id) expressionValueWithObject: (id)object
                         context: (NSMutableDictionary *)context
 {
+  return object;
+}
+
+- (id) _expressionWithSubstitutionVariables: (NSDictionary *)variables
+{
   return self;
 }
 
-- (id) _expressionWithSubstitutionVariables: (NSDictionary *)variables
-{
-  return self;
-}
-
+- (NSString *) keyPath
+{
+  return @"SELF";
+}
 @end
 
 @implementation GSVariableExpression
@@ -2525,10 +2527,17 @@
                           format: @"Invalid right keypath: %@", left];
             }
 
-          // concatenate
-          left = [NSExpression expressionForKeyPath:
-                    [NSString stringWithFormat: @"%@.%@",
-                              [left keyPath], [right keyPath]]];
+          if (evaluatedObjectExpression != left)
+            {
+              // concatenate
+              left = [NSExpression expressionForKeyPath:
+                        [NSString stringWithFormat: @"%@.%@",
+                                  [left keyPath], [right keyPath]]];
+            }
+          else
+            {
+              left = [NSExpression expressionForKeyPath: [right keyPath]];
+            }
         }
       else
         {

Modified: libs/base/trunk/Tests/base/NSPredicate/basic.m
URL: 
http://svn.gna.org/viewcvs/gnustep/libs/base/trunk/Tests/base/NSPredicate/basic.m?rev=40462&r1=40461&r2=40462&view=diff
==============================================================================
--- libs/base/trunk/Tests/base/NSPredicate/basic.m      (original)
+++ libs/base/trunk/Tests/base/NSPredicate/basic.m      Sun Apr  9 14:45:18 2017
@@ -205,6 +205,11 @@
   p = [NSPredicate predicateWithFormat: @"SELF == 'aaa'"];
   PASS([p evaluateWithObject: @"aaa"], "SELF equality works");
 
+  d = [NSDictionary dictionaryWithObjectsAndKeys: 
+    @"2", @"foo", nil]; 
+  p = [NSPredicate predicateWithFormat: @"SELF.foo <= 2"];
+  PASS([p evaluateWithObject: d], "SELF.foo <= 2");
+
   p = [NSPredicate predicateWithFormat:
     @"%K like %@+$b+$c", @"$single", @"b\""];
   PASS_EQUAL([p predicateFormat], @"$single LIKE (\"b\\\"\" + $b) + $c",


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

Reply via email to