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

2009-12-10 Adam Barth <[email protected]>

No review, rolling out r51975.
http://trac.webkit.org/changeset/51975

  • 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

    r51975 r51978  
    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 
    4540        unsigned ropeLength = s1->ropeLength() + s2->ropeLength();
    4641        JSGlobalData* globalData = &exec->globalData();
     
    5550        rope->append(index, s1);
    5651        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);
    9352        ASSERT(index == ropeLength);
    9453        return new (globalData) JSString(globalData, rope.release());
     
    289248    ALWAYS_INLINE JSValue jsAdd(CallFrame* callFrame, JSValue v1, JSValue v2)
    290249    {
    291         double left = 0.0, right;
    292         if (v1.getNumber(left), v2.getNumber(right))
     250        double left;
     251        double right = 0.0;
     252
     253        bool rightIsNumber = v2.getNumber(right);
     254        if (rightIsNumber && v1.getNumber(left))
    293255            return jsNumber(callFrame, left + right);
    294256       
    295         if (v1.isString()) {
    296             return v2.isString()
    297                 ? jsString(callFrame, asString(v1), asString(v2))
    298                 : jsString(callFrame, asString(v1), v2.toString(callFrame));
     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());
    299274        }
    300275
Note: See TracChangeset for help on using the changeset viewer.