Changeset 26961 in webkit


Ignore:
Timestamp:
Oct 24, 2007 1:53:45 AM (17 years ago)
Author:
oliver
Message:

Remove old relation method, replace with specialised LessThan and lessThenEq functions for a 0.5-0.6% improvement in SunSpider

Reviewed by Darin

Location:
trunk/JavaScriptCore
Files:
4 edited

Legend:

Unmodified
Added
Removed
  • trunk/JavaScriptCore/ChangeLog

    r26960 r26961  
     12007-10-24  Oliver Hunt  <oliver@apple.com>
     2
     3        Reviewed by Darin.
     4
     5        Remove old relation method, replace with specialised LessThan and lessThenEq functions for a 0.5-0.6% improvement in SunSpider
     6
     7        * kjs/nodes.cpp:
     8        (KJS::lessThan):
     9        (KJS::lessThanEq):
     10        (KJS::LessNode::evaluate):
     11        (KJS::GreaterNode::evaluate):
     12        (KJS::LessEqNode::evaluate):
     13        (KJS::GreaterEqNode::evaluate):
     14        * kjs/operations.cpp:
     15        * kjs/operations.h:
     16
    1172007-10-24  Eric Seidel  <eric@webkit.org>
    218
  • trunk/JavaScriptCore/kjs/nodes.cpp

    r26957 r26961  
    13271327// ------------------------------ Relational Nodes -------------------------------
    13281328
     1329static inline JSValue* lessThan(ExecState *exec, JSValue* v1, JSValue* v2)
     1330{
     1331  JSValue *p1 = v1->toPrimitive(exec, NumberType);
     1332  JSValue *p2 = v2->toPrimitive(exec, NumberType);
     1333   
     1334  if (p1->isString() && p2->isString())
     1335    return jsBoolean(p1->toString(exec) < p2->toString(exec));
     1336   
     1337  return jsBoolean(p1->toNumber(exec) < p2->toNumber(exec));
     1338}
     1339
     1340static inline JSValue* lessThanEq(ExecState *exec, JSValue* v1, JSValue* v2)
     1341{
     1342  JSValue *p1 = v1->toPrimitive(exec, NumberType);
     1343  JSValue *p2 = v2->toPrimitive(exec, NumberType);
     1344   
     1345  if (p1->isString() && p2->isString())
     1346    return jsBoolean(!(p2->toString(exec) < p1->toString(exec)));
     1347
     1348  return jsBoolean(p1->toNumber(exec) <= p2->toNumber(exec));
     1349}
     1350
    13291351// ECMA 11.8.1
    13301352JSValue *LessNode::evaluate(ExecState *exec)
     
    13341356  JSValue *v2 = expr2->evaluate(exec);
    13351357  KJS_CHECKEXCEPTIONVALUE
    1336   int r = relation(exec, v1, v2);
    1337   if (r < 0)
    1338       return jsBoolean(false);
    1339   return jsBoolean(r == 1);
     1358  return lessThan(exec, v1, v2);
    13401359}
    13411360
     
    13471366  JSValue *v2 = expr2->evaluate(exec);
    13481367  KJS_CHECKEXCEPTIONVALUE
    1349   int r = relation(exec, v2, v1);
    1350   if (r < 0)
    1351       return jsBoolean(false);
    1352   return jsBoolean(r == 1);
     1368  return lessThan(exec, v2, v1);
    13531369}
    13541370
     
    13601376  JSValue *v2 = expr2->evaluate(exec);
    13611377  KJS_CHECKEXCEPTIONVALUE
    1362   int r = relation(exec, v2, v1);
    1363   if (r < 0)
    1364       return jsBoolean(false);
    1365   return jsBoolean(r == 0);
     1378  return lessThanEq(exec, v1, v2);
    13661379}
    13671380
     
    13731386  JSValue *v2 = expr2->evaluate(exec);
    13741387  KJS_CHECKEXCEPTIONVALUE
    1375   int r = relation(exec, v1, v2);
    1376   if (r < 0)
    1377       return jsBoolean(false);
    1378   return jsBoolean(r == 0);
     1388  return lessThanEq(exec, v2, v1);
    13791389}
    13801390
  • trunk/JavaScriptCore/kjs/operations.cpp

    r26945 r26961  
    190190}
    191191
    192 int relation(ExecState *exec, JSValue *v1, JSValue *v2)
    193 {
    194     JSValue *p1 = v1->toPrimitive(exec,NumberType);
    195     JSValue *p2 = v2->toPrimitive(exec,NumberType);
    196    
    197     if (p1->isString() && p2->isString())
    198         return p1->toString(exec) < p2->toString(exec) ? 1 : 0;
    199    
    200     double n1 = p1->toNumber(exec);
    201     double n2 = p2->toNumber(exec);
    202     if (n1 < n2)
    203         return 1;
    204     if (n1 >= n2)
    205         return 0;
    206     return -1; // must be NaN, so undefined
    207 }
    208 
    209192int maxInt(int d1, int d2)
    210193{
  • trunk/JavaScriptCore/kjs/operations.h

    r26945 r26961  
    4545  bool equal(ExecState *exec, JSValue *v1, JSValue *v2);
    4646  bool strictEqual(ExecState *exec, JSValue *v1, JSValue *v2);
    47   /**
    48    * This operator performs an abstract relational comparison of the two
    49    * arguments that can be of arbitrary type. If possible, conversions to the
    50    * string or number type will take place before the comparison.
    51    *
    52    * @return 1 if v1 is "less-than" v2, 0 if the relation is "greater-than-or-
    53    * equal". -1 if the result is undefined.
    54    */
    55   int relation(ExecState *exec, JSValue *v1, JSValue *v2);
    5647  int maxInt(int d1, int d2);
    5748  int minInt(int d1, int d2);
Note: See TracChangeset for help on using the changeset viewer.