Remove old relation method, replace with specialised LessThan and lessThenEq function...
authoroliver <oliver@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Wed, 24 Oct 2007 08:53:45 +0000 (08:53 +0000)
committeroliver <oliver@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Wed, 24 Oct 2007 08:53:45 +0000 (08:53 +0000)
Reviewed by Darin

git-svn-id: https://svn.webkit.org/repository/webkit/trunk@26961 268f45cc-cd09-0410-ab3c-d52691b4dbfc

JavaScriptCore/ChangeLog
JavaScriptCore/kjs/nodes.cpp
JavaScriptCore/kjs/operations.cpp
JavaScriptCore/kjs/operations.h

index 51b49c1db94a68b0f51cab1c21a4f07a9ea81972..dd70d060ea2b3f01efd6f2b8809e1f8e25bb7973 100644 (file)
@@ -1,3 +1,19 @@
+2007-10-24  Oliver Hunt  <oliver@apple.com>
+
+        Reviewed by Darin.
+
+        Remove old relation method, replace with specialised LessThan and lessThenEq functions for a 0.5-0.6% improvement in SunSpider
+
+        * kjs/nodes.cpp:
+        (KJS::lessThan):
+        (KJS::lessThanEq):
+        (KJS::LessNode::evaluate):
+        (KJS::GreaterNode::evaluate):
+        (KJS::LessEqNode::evaluate):
+        (KJS::GreaterEqNode::evaluate):
+        * kjs/operations.cpp:
+        * kjs/operations.h:
+
 2007-10-24  Eric Seidel  <eric@webkit.org>
 
         Reviewed by darin.
index f12405dd6e34bd1652b65c144cb1d273b9513e05..13ee750bf3f338728e03804def072a881bfa7880 100644 (file)
@@ -1326,6 +1326,28 @@ JSValue *UnsignedRightShiftNode::evaluate(ExecState *exec)
 
 // ------------------------------ Relational Nodes -------------------------------
 
+static inline JSValue* lessThan(ExecState *exec, JSValue* v1, JSValue* v2) 
+{
+  JSValue *p1 = v1->toPrimitive(exec, NumberType);
+  JSValue *p2 = v2->toPrimitive(exec, NumberType);
+    
+  if (p1->isString() && p2->isString())
+    return jsBoolean(p1->toString(exec) < p2->toString(exec));
+    
+  return jsBoolean(p1->toNumber(exec) < p2->toNumber(exec));
+}
+
+static inline JSValue* lessThanEq(ExecState *exec, JSValue* v1, JSValue* v2) 
+{
+  JSValue *p1 = v1->toPrimitive(exec, NumberType);
+  JSValue *p2 = v2->toPrimitive(exec, NumberType);
+    
+  if (p1->isString() && p2->isString())
+    return jsBoolean(!(p2->toString(exec) < p1->toString(exec)));
+
+  return jsBoolean(p1->toNumber(exec) <= p2->toNumber(exec));
+}
+
 // ECMA 11.8.1
 JSValue *LessNode::evaluate(ExecState *exec)
 {
@@ -1333,10 +1355,7 @@ JSValue *LessNode::evaluate(ExecState *exec)
   KJS_CHECKEXCEPTIONVALUE
   JSValue *v2 = expr2->evaluate(exec);
   KJS_CHECKEXCEPTIONVALUE
-  int r = relation(exec, v1, v2);
-  if (r < 0)
-      return jsBoolean(false);
-  return jsBoolean(r == 1);
+  return lessThan(exec, v1, v2);
 }
 
 // ECMA 11.8.2
@@ -1346,10 +1365,7 @@ JSValue *GreaterNode::evaluate(ExecState *exec)
   KJS_CHECKEXCEPTIONVALUE
   JSValue *v2 = expr2->evaluate(exec);
   KJS_CHECKEXCEPTIONVALUE
-  int r = relation(exec, v2, v1);
-  if (r < 0)
-      return jsBoolean(false);
-  return jsBoolean(r == 1);
+  return lessThan(exec, v2, v1);
 }
 
 // ECMA 11.8.3
@@ -1359,10 +1375,7 @@ JSValue *LessEqNode::evaluate(ExecState *exec)
   KJS_CHECKEXCEPTIONVALUE
   JSValue *v2 = expr2->evaluate(exec);
   KJS_CHECKEXCEPTIONVALUE
-  int r = relation(exec, v2, v1);
-  if (r < 0)
-      return jsBoolean(false);
-  return jsBoolean(r == 0);
+  return lessThanEq(exec, v1, v2);
 }
 
 // ECMA 11.8.4
@@ -1372,10 +1385,7 @@ JSValue *GreaterEqNode::evaluate(ExecState *exec)
   KJS_CHECKEXCEPTIONVALUE
   JSValue *v2 = expr2->evaluate(exec);
   KJS_CHECKEXCEPTIONVALUE
-  int r = relation(exec, v1, v2);
-  if (r < 0)
-      return jsBoolean(false);
-  return jsBoolean(r == 0);
+  return lessThanEq(exec, v2, v1);
 }
 
 // ECMA 11.8.6
index b13ee78154bfa2ee9b1452250ae2f6d36a18cbcb..aede0d8bb2161f3596196f2bd41a18a51169abd3 100644 (file)
@@ -189,23 +189,6 @@ bool strictEqual(ExecState *exec, JSValue *v1, JSValue *v2)
     return false;
 }
 
-int relation(ExecState *exec, JSValue *v1, JSValue *v2)
-{
-    JSValue *p1 = v1->toPrimitive(exec,NumberType);
-    JSValue *p2 = v2->toPrimitive(exec,NumberType);
-    
-    if (p1->isString() && p2->isString())
-        return p1->toString(exec) < p2->toString(exec) ? 1 : 0;
-    
-    double n1 = p1->toNumber(exec);
-    double n2 = p2->toNumber(exec);
-    if (n1 < n2)
-        return 1;
-    if (n1 >= n2)
-        return 0;
-    return -1; // must be NaN, so undefined
-}
-
 int maxInt(int d1, int d2)
 {
     return (d1 > d2) ? d1 : d2;
index a055ae845b322d118e5094a02a26b3ecceb51621..a3fff53b1641d021dab40be4db0558da29c957fa 100644 (file)
@@ -44,15 +44,6 @@ namespace KJS {
 
   bool equal(ExecState *exec, JSValue *v1, JSValue *v2);
   bool strictEqual(ExecState *exec, JSValue *v1, JSValue *v2);
-  /**
-   * This operator performs an abstract relational comparison of the two
-   * arguments that can be of arbitrary type. If possible, conversions to the
-   * string or number type will take place before the comparison.
-   *
-   * @return 1 if v1 is "less-than" v2, 0 if the relation is "greater-than-or-
-   * equal". -1 if the result is undefined.
-   */
-  int relation(ExecState *exec, JSValue *v1, JSValue *v2);
   int maxInt(int d1, int d2);
   int minInt(int d1, int d2);