Ignore:
Timestamp:
May 4, 2014, 11:10:03 PM (11 years ago)
Author:
[email protected]
Message:

Unreviewed, rolling out r168254.

Very crashy on debug JSC tests.

Reverted changeset:

"jsSubstring() should be lazy"
https://bugs.webkit.org/show_bug.cgi?id=132556
http://trac.webkit.org/changeset/168254

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/Source/JavaScriptCore/runtime/JSString.cpp

    r168254 r168255  
    8383void JSRopeString::visitFibers(SlotVisitor& visitor)
    8484{
    85     if (isSubstring()) {
    86         visitor.append(&substringBase());
    87         return;
    88     }
    89     for (size_t i = 0; i < s_maxInternalRopeLength && fiber(i); ++i)
    90         visitor.append(&fiber(i));
     85    for (size_t i = 0; i < s_maxInternalRopeLength && m_fibers[i]; ++i)
     86        visitor.append(&m_fibers[i]);
    9187}
    9288
     
    9490{
    9591    ASSERT(isRope());
    96    
    97     if (isSubstring()) {
    98         ASSERT(!substringBase()->isRope());
    99         m_value = substringBase()->m_value.substring(substringOffset(), m_length);
    100         substringBase().clear();
    101         return;
    102     }
    103    
     92
    10493    if (is8Bit()) {
    10594        LChar* buffer;
     
    111100            return;
    112101        }
    113        
    114         for (size_t i = 0; i < s_maxInternalRopeLength && fiber(i); ++i) {
    115             if (fiber(i)->isRope())
     102
     103        for (size_t i = 0; i < s_maxInternalRopeLength && m_fibers[i]; ++i) {
     104            if (m_fibers[i]->isRope())
    116105                return resolveRopeSlowCase8(buffer);
    117106        }
    118107
    119108        LChar* position = buffer;
    120         for (size_t i = 0; i < s_maxInternalRopeLength && fiber(i); ++i) {
    121             StringImpl* string = fiber(i)->m_value.impl();
     109        for (size_t i = 0; i < s_maxInternalRopeLength && m_fibers[i]; ++i) {
     110            StringImpl* string = m_fibers[i]->m_value.impl();
    122111            unsigned length = string->length();
    123112            StringImpl::copyChars(position, string->characters8(), length);
    124113            position += length;
    125             fiber(i).clear();
     114            m_fibers[i].clear();
    126115        }
    127116        ASSERT((buffer + m_length) == position);
     
    140129    }
    141130
    142     for (size_t i = 0; i < s_maxInternalRopeLength && fiber(i); ++i) {
    143         if (fiber(i)->isRope())
     131    for (size_t i = 0; i < s_maxInternalRopeLength && m_fibers[i]; ++i) {
     132        if (m_fibers[i]->isRope())
    144133            return resolveRopeSlowCase(buffer);
    145134    }
    146135
    147136    UChar* position = buffer;
    148     for (size_t i = 0; i < s_maxInternalRopeLength && fiber(i); ++i) {
    149         StringImpl* string = fiber(i)->m_value.impl();
     137    for (size_t i = 0; i < s_maxInternalRopeLength && m_fibers[i]; ++i) {
     138        StringImpl* string = m_fibers[i]->m_value.impl();
    150139        unsigned length = string->length();
    151140        if (string->is8Bit())
     
    154143            StringImpl::copyChars(position, string->characters16(), length);
    155144        position += length;
    156         fiber(i).clear();
     145        m_fibers[i].clear();
    157146    }
    158147    ASSERT((buffer + m_length) == position);
     
    175164    Vector<JSString*, 32, UnsafeVectorOverflow> workQueue; // Putting strings into a Vector is only OK because there are no GC points in this method.
    176165   
    177     for (size_t i = 0; i < s_maxInternalRopeLength && fiber(i); ++i) {
    178         workQueue.append(fiber(i).get());
     166    for (size_t i = 0; i < s_maxInternalRopeLength && m_fibers[i]; ++i) {
     167        workQueue.append(m_fibers[i].get());
    179168        // Clearing here works only because there are no GC points in this method.
    180         fiber(i).clear();
     169        m_fibers[i].clear();
    181170    }
    182171
     
    184173        JSString* currentFiber = workQueue.last();
    185174        workQueue.removeLast();
    186        
    187         const LChar* characters;
    188        
     175
    189176        if (currentFiber->isRope()) {
    190177            JSRopeString* currentFiberAsRope = static_cast<JSRopeString*>(currentFiber);
    191             if (!currentFiberAsRope->isSubstring()) {
    192                 for (size_t i = 0; i < s_maxInternalRopeLength && currentFiberAsRope->fiber(i); ++i)
    193                     workQueue.append(currentFiberAsRope->fiber(i).get());
    194                 continue;
    195             }
    196             ASSERT(!currentFiberAsRope->substringBase()->isRope());
    197             characters =
    198                 currentFiberAsRope->substringBase()->m_value.characters8() +
    199                 currentFiberAsRope->substringOffset();
    200         } else
    201             characters = currentFiber->m_value.characters8();
    202 
    203         unsigned length = currentFiber->length();
     178            for (size_t i = 0; i < s_maxInternalRopeLength && currentFiberAsRope->m_fibers[i]; ++i)
     179                workQueue.append(currentFiberAsRope->m_fibers[i].get());
     180            continue;
     181        }
     182
     183        StringImpl* string = static_cast<StringImpl*>(currentFiber->m_value.impl());
     184        unsigned length = string->length();
    204185        position -= length;
    205         StringImpl::copyChars(position, characters, length);
     186        StringImpl::copyChars(position, string->characters8(), length);
    206187    }
    207188
     
    215196    Vector<JSString*, 32, UnsafeVectorOverflow> workQueue; // These strings are kept alive by the parent rope, so using a Vector is OK.
    216197
    217     for (size_t i = 0; i < s_maxInternalRopeLength && fiber(i); ++i)
    218         workQueue.append(fiber(i).get());
     198    for (size_t i = 0; i < s_maxInternalRopeLength && m_fibers[i]; ++i)
     199        workQueue.append(m_fibers[i].get());
    219200
    220201    while (!workQueue.isEmpty()) {
     
    224205        if (currentFiber->isRope()) {
    225206            JSRopeString* currentFiberAsRope = static_cast<JSRopeString*>(currentFiber);
    226             if (currentFiberAsRope->isSubstring()) {
    227                 ASSERT(!currentFiberAsRope->substringBase()->isRope());
    228                 StringImpl* string = static_cast<StringImpl*>(
    229                     currentFiberAsRope->substringBase()->m_value.impl());
    230                 unsigned offset = currentFiberAsRope->substringOffset();
    231                 unsigned length = currentFiberAsRope->length();
    232                 position -= length;
    233                 if (string->is8Bit())
    234                     StringImpl::copyChars(position, string->characters8() + offset, length);
    235                 else
    236                     StringImpl::copyChars(position, string->characters16() + offset, length);
    237                 continue;
    238             }
    239             for (size_t i = 0; i < s_maxInternalRopeLength && currentFiberAsRope->fiber(i); ++i)
    240                 workQueue.append(currentFiberAsRope->fiber(i).get());
     207            for (size_t i = 0; i < s_maxInternalRopeLength && currentFiberAsRope->m_fibers[i]; ++i)
     208                workQueue.append(currentFiberAsRope->m_fibers[i].get());
    241209            continue;
    242210        }
     
    257225void JSRopeString::outOfMemory(ExecState* exec) const
    258226{
    259     for (size_t i = 0; i < s_maxInternalRopeLength && fiber(i); ++i)
    260         u[i].string.clear();
     227    for (size_t i = 0; i < s_maxInternalRopeLength && m_fibers[i]; ++i)
     228        m_fibers[i].clear();
    261229    ASSERT(isRope());
    262230    ASSERT(m_value.isNull());
Note: See TracChangeset for help on using the changeset viewer.