Changeset 51978 in webkit


Ignore:
Timestamp:
Dec 10, 2009 7:42:33 PM (14 years ago)
Author:
abarth@webkit.org
Message:

2009-12-10 Adam Barth <abarth@webkit.org>

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):
Location:
trunk/JavaScriptCore
Files:
5 edited

Legend:

Unmodified
Added
Removed
  • trunk/JavaScriptCore/ChangeLog

    r51976 r51978  
     12009-12-10  Adam Barth  <abarth@webkit.org>
     2
     3        No review, rolling out r51975.
     4        http://trac.webkit.org/changeset/51975
     5
     6        * jit/JITStubs.cpp:
     7        (JSC::DEFINE_STUB_FUNCTION):
     8        * runtime/JSString.h:
     9        (JSC::JSString::JSString):
     10        (JSC::JSString::appendStringInConstruct):
     11        * runtime/Operations.cpp:
     12        (JSC::jsAddSlowCase):
     13        * runtime/Operations.h:
     14        (JSC::jsString):
     15        (JSC::jsAdd):
     16
    1172009-12-10  Oliver Hunt  <oliver@apple.com>
    218
  • trunk/JavaScriptCore/jit/JITStubs.cpp

    r51976 r51978  
    10341034    JSValue v1 = stackFrame.args[0].jsValue();
    10351035    JSValue v2 = stackFrame.args[1].jsValue();
    1036     CallFrame* callFrame = stackFrame.callFrame;
    1037 
    1038     if (v1.isString()) {
    1039         JSValue result = v2.isString()
    1040             ? jsString(callFrame, asString(v1), asString(v2))
    1041             : jsString(callFrame, asString(v1), v2.toString(callFrame));
     1036
     1037    double left;
     1038    double right = 0.0;
     1039
     1040    bool rightIsNumber = v2.getNumber(right);
     1041    if (rightIsNumber && v1.getNumber(left))
     1042        return JSValue::encode(jsNumber(stackFrame.globalData, left + right));
     1043   
     1044    CallFrame* callFrame = stackFrame.callFrame;
     1045
     1046    bool leftIsString = v1.isString();
     1047    if (leftIsString && v2.isString()) {
     1048        JSValue result = jsString(callFrame, asString(v1), asString(v2));
    10421049        CHECK_FOR_EXCEPTION_AT_END();
    10431050        return JSValue::encode(result);
    10441051    }
    10451052
    1046     double left = 0.0, right;
    1047     if (v1.getNumber(left) && v2.getNumber(right))
    1048         return JSValue::encode(jsNumber(stackFrame.globalData, left + right));
     1053    if (rightIsNumber & leftIsString) {
     1054        RefPtr<UString::Rep> value = v2.isInt32() ?
     1055            concatenate(asString(v1)->value(callFrame).rep(), v2.asInt32()) :
     1056            concatenate(asString(v1)->value(callFrame).rep(), right);
     1057
     1058        if (UNLIKELY(!value)) {
     1059            throwOutOfMemoryError(callFrame);
     1060            VM_THROW_EXCEPTION();
     1061        }
     1062        return JSValue::encode(jsString(stackFrame.globalData, value.release()));
     1063    }
    10491064
    10501065    // All other cases are pretty uncommon
  • trunk/JavaScriptCore/runtime/JSString.h

    r51975 r51978  
    204204            ASSERT(ropeLength == index);
    205205        }
    206         // This constructor constructs a new string by concatenating s1 & s2.
    207         // This should only be called with ropeLength <= 3.
    208         JSString(JSGlobalData* globalData, unsigned ropeLength, JSString* s1, const UString& u2)
    209             : JSCell(globalData->stringStructure.get())
    210             , m_stringLength(s1->length() + u2.size())
    211             , m_ropeLength(ropeLength)
    212         {
    213             ASSERT(ropeLength <= s_maxInternalRopeLength);
    214             unsigned index = 0;
    215             appendStringInConstruct(index, s1);
    216             appendStringInConstruct(index, u2);
    217             ASSERT(ropeLength == index);
    218         }
    219         // This constructor constructs a new string by concatenating s1 & s2.
    220         // This should only be called with ropeLength <= 3.
    221         JSString(JSGlobalData* globalData, unsigned ropeLength, const UString& u1, JSString* s2)
    222             : JSCell(globalData->stringStructure.get())
    223             , m_stringLength(u1.size() + s2->length())
    224             , m_ropeLength(ropeLength)
    225         {
    226             ASSERT(ropeLength <= s_maxInternalRopeLength);
    227             unsigned index = 0;
    228             appendStringInConstruct(index, u1);
    229             appendStringInConstruct(index, s2);
    230             ASSERT(ropeLength == index);
    231         }
    232206        // This constructor constructs a new string by concatenating v1, v2 & v3.
    233207        // This should only be called with ropeLength <= 3 ... which since every
     
    285259        void resolveRope(ExecState*) const;
    286260
    287         void appendStringInConstruct(unsigned& index, const UString& string)
    288         {
    289             m_fibers[index++] = Rope::Fiber(string.rep()->ref());
    290         }
    291 
    292261        void appendStringInConstruct(unsigned& index, JSString* jsString)
    293262        {
     
    296265                    m_fibers[index++] = jsString->m_fibers[i].ref();
    297266            } else
    298                 appendStringInConstruct(index, jsString->string());
     267                m_fibers[index++] = Rope::Fiber(jsString->string().rep()->ref());
    299268        }
    300269
     
    343312
    344313        friend JSValue jsString(ExecState* exec, JSString* s1, JSString* s2);
    345         friend JSValue jsString(ExecState* exec, const UString& u1, JSString* s2);
    346         friend JSValue jsString(ExecState* exec, JSString* s1, const UString& u2);
    347314        friend JSValue jsString(ExecState* exec, Register* strings, unsigned count);
    348315    };
  • trunk/JavaScriptCore/runtime/Operations.cpp

    r51975 r51978  
    5555    JSValue p2 = v2.toPrimitive(callFrame);
    5656
    57     if (p1.isString()) {
    58         return p2.isString()
    59             ? jsString(callFrame, asString(p1), asString(p2))
    60             : jsString(callFrame, asString(p1), p2.toString(callFrame));
     57    if (p1.isString() || p2.isString()) {
     58        RefPtr<UString::Rep> value = concatenate(p1.toString(callFrame).rep(), p2.toString(callFrame).rep());
     59        if (!value)
     60            return throwOutOfMemoryError(callFrame);
     61        return jsString(callFrame, value.release());
    6162    }
    62     if (p2.isString())
    63         return jsString(callFrame, p1.toString(callFrame), asString(p2));
    6463
    6564    return jsNumber(callFrame, p1.toNumber(callFrame) + p2.toNumber(callFrame));
  • 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.