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


Ignore:
Timestamp:
Nov 6, 2007, 10:56:05 AM (18 years ago)
Author:
eseidel
Message:

2007-11-06 Eric Seidel <[email protected]>

Reviewed by darin.


SunSpider claims this is a 1.1% speedup.

  • kjs/nodes.cpp: (KJS::throwOutOfMemoryError): Added, non inline. (KJS::addSlowCase): renamed from add(), non inline. (KJS::add): add fast path for String + String, Number + Number and String + *
File:
1 edited

Legend:

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

    r27407 r27482  
    16701670// ------------------------------ Additive Nodes --------------------------------------
    16711671
     1672static JSValue* throwOutOfMemoryError(ExecState* exec)
     1673{
     1674    JSObject* error = Error::create(exec, GeneralError, "Out of memory");
     1675    exec->setException(error);
     1676    return error;
     1677}
    16721678
    16731679// ECMA 11.6
    1674 static inline JSValue *add(ExecState *exec, JSValue *v1, JSValue *v2)
     1680static JSValue* addSlowCase(ExecState* exec, JSValue* v1, JSValue* v2)
    16751681{
    16761682    // exception for the Date exception in defaultValue()
     
    16801686    if (p1->isString() || p2->isString()) {
    16811687        UString value = p1->toString(exec) + p2->toString(exec);
    1682         if (value.isNull()) {
    1683             JSObject *error = Error::create(exec, GeneralError, "Out of memory");
    1684             exec->setException(error);
    1685             return error;
    1686         } else
    1687             return jsString(value);
     1688        if (value.isNull())
     1689            return throwOutOfMemoryError(exec);
     1690        return jsString(value);
    16881691    }
    16891692   
    16901693    return jsNumber(p1->toNumber(exec) + p2->toNumber(exec));
     1694}
     1695
     1696// Fast-path choices here are based on frequency data from SunSpider:
     1697//    <times> Add case: <t1> <t2>
     1698//    ---------------------------
     1699//    5627160 Add case: 1 1
     1700//    247427  Add case: 5 5
     1701//    20901   Add case: 5 6
     1702//    13978   Add case: 5 1
     1703//    4000    Add case: 1 5
     1704//    1       Add case: 3 5
     1705
     1706static inline JSValue* add(ExecState* exec, JSValue* v1, JSValue *v2)
     1707{
     1708    JSType t1 = v1->type();
     1709    JSType t2 = v2->type();
     1710       
     1711    if (t1 == NumberType && t2 == NumberType)
     1712        return jsNumber(v1->toNumber(exec) + v2->toNumber(exec));
     1713    else if (t1 == StringType && t2 == StringType) {
     1714        UString value = static_cast<StringImp*>(v1)->value() + static_cast<StringImp*>(v2)->value();
     1715        if (value.isNull())
     1716            return throwOutOfMemoryError(exec);
     1717        return jsString(value);
     1718    } else if (t1 == StringType) { // common js idiom "" + object
     1719        UString value = static_cast<StringImp*>(v1)->value() + v2->toString(exec);
     1720        if (value.isNull())
     1721            return throwOutOfMemoryError(exec);
     1722        return jsString(value);
     1723    }
     1724   
     1725    // All other cases are pretty uncommon
     1726    return addSlowCase(exec, v1, v2);
    16911727}
    16921728
Note: See TracChangeset for help on using the changeset viewer.