Remove old relation method, replace with specialised LessThan and lessThenEq function...
[WebKit-https.git] / JavaScriptCore / kjs / nodes.cpp
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