Ignore:
Timestamp:
Dec 10, 2009, 6:07:42 PM (15 years ago)
Author:
[email protected]
Message:

https://bugs.webkit.org/show_bug.cgi?id=32400
Switch remaining cases of string addition to use ropes.

Reviewed by Oliver Hunt.

~1% progression on Sunspidey.

  • jit/JITStubs.cpp:

(JSC::DEFINE_STUB_FUNCTION):

  • runtime/JSString.h:

(JSC::JSString::JSString):
(JSC::JSString::appendStringInConstruct):

  • runtime/Operations.cpp:

(JSC::jsAddSlowCase):

  • runtime/Operations.h:

(JSC::jsString):
(JSC::jsAdd):

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/JavaScriptCore/runtime/Operations.h

    r51964 r51975  
    3838    ALWAYS_INLINE JSValue jsString(ExecState* exec, JSString* s1, JSString* s2)
    3939    {
     40        if (!s1->length())
     41            return s2;
     42        if (!s2->length())
     43            return s1;
     44
    4045        unsigned ropeLength = s1->ropeLength() + s2->ropeLength();
    4146        JSGlobalData* globalData = &exec->globalData();
     
    5055        rope->append(index, s1);
    5156        rope->append(index, s2);
     57        ASSERT(index == ropeLength);
     58        return new (globalData) JSString(globalData, rope.release());
     59    }
     60
     61    ALWAYS_INLINE JSValue jsString(ExecState* exec, const UString& u1, JSString* s2)
     62    {
     63        unsigned ropeLength = 1 + s2->ropeLength();
     64        JSGlobalData* globalData = &exec->globalData();
     65
     66        if (ropeLength <= JSString::s_maxInternalRopeLength)
     67            return new (globalData) JSString(globalData, ropeLength, u1, s2);
     68
     69        unsigned index = 0;
     70        RefPtr<JSString::Rope> rope = JSString::Rope::createOrNull(ropeLength);
     71        if (UNLIKELY(!rope))
     72            return throwOutOfMemoryError(exec);
     73        rope->append(index, u1);
     74        rope->append(index, s2);
     75        ASSERT(index == ropeLength);
     76        return new (globalData) JSString(globalData, rope.release());
     77    }
     78
     79    ALWAYS_INLINE JSValue jsString(ExecState* exec, JSString* s1, const UString& u2)
     80    {
     81        unsigned ropeLength = s1->ropeLength() + 1;
     82        JSGlobalData* globalData = &exec->globalData();
     83
     84        if (ropeLength <= JSString::s_maxInternalRopeLength)
     85            return new (globalData) JSString(globalData, ropeLength, s1, u2);
     86
     87        unsigned index = 0;
     88        RefPtr<JSString::Rope> rope = JSString::Rope::createOrNull(ropeLength);
     89        if (UNLIKELY(!rope))
     90            return throwOutOfMemoryError(exec);
     91        rope->append(index, s1);
     92        rope->append(index, u2);
    5293        ASSERT(index == ropeLength);
    5394        return new (globalData) JSString(globalData, rope.release());
     
    248289    ALWAYS_INLINE JSValue jsAdd(CallFrame* callFrame, JSValue v1, JSValue v2)
    249290    {
    250         double left;
    251         double right = 0.0;
    252 
    253         bool rightIsNumber = v2.getNumber(right);
    254         if (rightIsNumber && v1.getNumber(left))
     291        double left = 0.0, right;
     292        if (v1.getNumber(left), v2.getNumber(right))
    255293            return jsNumber(callFrame, left + right);
    256294       
    257         bool leftIsString = v1.isString();
    258         if (leftIsString && v2.isString()) {
    259             if (!asString(v1)->length())
    260                 return asString(v2);
    261             if (!asString(v2)->length())
    262                 return asString(v1);
    263             return jsString(callFrame, asString(v1), asString(v2));
    264         }
    265 
    266         if (rightIsNumber & leftIsString) {
    267             RefPtr<UString::Rep> value = v2.isInt32() ?
    268                 concatenate(asString(v1)->value(callFrame).rep(), v2.asInt32()) :
    269                 concatenate(asString(v1)->value(callFrame).rep(), right);
    270 
    271             if (!value)
    272                 return throwOutOfMemoryError(callFrame);
    273             return jsString(callFrame, value.release());
     295        if (v1.isString()) {
     296            return v2.isString()
     297                ? jsString(callFrame, asString(v1), asString(v2))
     298                : jsString(callFrame, asString(v1), v2.toString(callFrame));
    274299        }
    275300
Note: See TracChangeset for help on using the changeset viewer.