Changeset 26945 in webkit for trunk/JavaScriptCore/kjs/nodes.cpp


Ignore:
Timestamp:
Oct 23, 2007, 7:01:53 PM (18 years ago)
Author:
oliver
Message:

Reduce branching in implementations of some operator implementations, yielding 1.3% boost to SunSpider.

Reviewed by Maciej

  • kjs/nodes.cpp: (KJS::MultNode::evaluate): (KJS::DivNode::evaluate): (KJS::ModNode::evaluate): (KJS::add): (KJS::sub): (KJS::AddNode::evaluate): (KJS::SubNode::evaluate): (KJS::valueForReadModifyAssignment):
  • kjs/operations.cpp:
  • kjs/operations.h:
File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/JavaScriptCore/kjs/nodes.cpp

    r26925 r26945  
    11941194    JSValue *v2 = term2->evaluate(exec);
    11951195    KJS_CHECKEXCEPTIONVALUE
    1196        
    1197     return mult(exec, v1, v2, '*');
     1196
     1197    return jsNumber(v1->toNumber(exec) * v2->toNumber(exec));
    11981198}
    11991199
    12001200// ECMA 11.5.2
    12011201JSValue *DivNode::evaluate(ExecState *exec)
     1202{
     1203    JSValue *v1 = term1->evaluate(exec);
     1204    KJS_CHECKEXCEPTIONVALUE
     1205       
     1206    JSValue *v2 = term2->evaluate(exec);
     1207    KJS_CHECKEXCEPTIONVALUE
     1208
     1209    return jsNumber(v1->toNumber(exec) / v2->toNumber(exec));
     1210}
     1211
     1212// ECMA 11.5.3
     1213JSValue *ModNode::evaluate(ExecState *exec)
     1214{
     1215    JSValue *v1 = term1->evaluate(exec);
     1216    KJS_CHECKEXCEPTIONVALUE
     1217       
     1218    JSValue *v2 = term2->evaluate(exec);
     1219    KJS_CHECKEXCEPTIONVALUE
     1220
     1221    return jsNumber(fmod(v1->toNumber(exec), v2->toNumber(exec)));
     1222}
     1223
     1224// ------------------------------ Additive Nodes --------------------------------------
     1225
     1226
     1227// ECMA 11.6
     1228static inline JSValue *add(ExecState *exec, JSValue *v1, JSValue *v2)
     1229{
     1230    // exception for the Date exception in defaultValue()
     1231    JSValue *p1 = v1->toPrimitive(exec, UnspecifiedType);
     1232    JSValue *p2 = v2->toPrimitive(exec, UnspecifiedType);
     1233   
     1234    if (p1->isString() || p2->isString()) {
     1235        UString value = p1->toString(exec) + p2->toString(exec);
     1236        if (value.isNull()) {
     1237            JSObject *error = Error::create(exec, GeneralError, "Out of memory");
     1238            exec->setException(error);
     1239            return error;
     1240        } else
     1241            return jsString(value);
     1242    }
     1243   
     1244    return jsNumber(p1->toNumber(exec) + p2->toNumber(exec));
     1245}
     1246
     1247static inline JSValue *sub(ExecState *exec, JSValue *v1, JSValue *v2)
     1248{
     1249    JSValue *p1 = v1->toPrimitive(exec, NumberType);
     1250    JSValue *p2 = v2->toPrimitive(exec, NumberType);
     1251
     1252    return jsNumber(p1->toNumber(exec) - p2->toNumber(exec));
     1253}
     1254
     1255// ECMA 11.6.1
     1256JSValue *AddNode::evaluate(ExecState *exec)
     1257{
     1258  JSValue *v1 = term1->evaluate(exec);
     1259  KJS_CHECKEXCEPTIONVALUE
     1260
     1261  JSValue *v2 = term2->evaluate(exec);
     1262  KJS_CHECKEXCEPTIONVALUE
     1263
     1264  return add(exec, v1, v2);
     1265}
     1266
     1267
     1268// ECMA 11.6.2
     1269JSValue *SubNode::evaluate(ExecState *exec)
    12021270{
    12031271    JSValue *v1 = term1->evaluate(exec);
     
    12071275    KJS_CHECKEXCEPTIONVALUE
    12081276       
    1209     return mult(exec, v1, v2, '/');
    1210 }
    1211 
    1212 // ECMA 11.5.3
    1213 JSValue *ModNode::evaluate(ExecState *exec)
    1214 {
    1215     JSValue *v1 = term1->evaluate(exec);
    1216     KJS_CHECKEXCEPTIONVALUE
    1217        
    1218     JSValue *v2 = term2->evaluate(exec);
    1219     KJS_CHECKEXCEPTIONVALUE
    1220        
    1221     return mult(exec, v1, v2, '%');
    1222 }
    1223 
    1224 // ------------------------------ Additive Nodes --------------------------------------
    1225 
    1226 // ECMA 11.6.1
    1227 JSValue *AddNode::evaluate(ExecState *exec)
    1228 {
    1229   JSValue *v1 = term1->evaluate(exec);
    1230   KJS_CHECKEXCEPTIONVALUE
    1231 
    1232   JSValue *v2 = term2->evaluate(exec);
    1233   KJS_CHECKEXCEPTIONVALUE
    1234 
    1235   return add(exec, v1, v2, '+');
    1236 }
    1237 
    1238 
    1239 // ECMA 11.6.2
    1240 JSValue *SubNode::evaluate(ExecState *exec)
    1241 {
    1242     JSValue *v1 = term1->evaluate(exec);
    1243     KJS_CHECKEXCEPTIONVALUE
    1244        
    1245     JSValue *v2 = term2->evaluate(exec);
    1246     KJS_CHECKEXCEPTIONVALUE
    1247        
    1248     return add(exec, v1, v2, '-');
     1277    return sub(exec, v1, v2);
    12491278}
    12501279
     
    15211550  switch (oper) {
    15221551  case OpMultEq:
    1523     v = mult(exec, v1, v2, '*');
     1552    v = jsNumber(v1->toNumber(exec) * v2->toNumber(exec));
    15241553    break;
    15251554  case OpDivEq:
    1526     v = mult(exec, v1, v2, '/');
     1555    v = jsNumber(v1->toNumber(exec) / v2->toNumber(exec));
    15271556    break;
    15281557  case OpPlusEq:
    1529     v = add(exec, v1, v2, '+');
     1558    v = add(exec, v1, v2);
    15301559    break;
    15311560  case OpMinusEq:
    1532     v = add(exec, v1, v2, '-');
     1561    v = sub(exec, v1, v2);
    15331562    break;
    15341563  case OpLShift:
Note: See TracChangeset for help on using the changeset viewer.