Changeset 102298 in webkit


Ignore:
Timestamp:
Dec 7, 2011 6:19:59 PM (12 years ago)
Author:
msaboff@apple.com
Message:

StringBuilderTest.Append and StringBuilderTest.ToStringPreserveCapacity are failing.
https://bugs.webkit.org/show_bug.cgi?id=73995

Source/JavaScriptCore:

Reviewed by Geoffrey Garen.

Problem was that a call to characters on an StringImpl associated
with a StringBuilder that is being appended to gets stale.
Added a new m_valid16BitShadowlen that keeps the length of
the 16 bit shadow that has been upconverted or will be up converted
with the first getCharacters(). When StringBuilder::characters or
::reifyString is called, further characters are upconverted if
we have a shadow16bit copy and the m_valid16BitShadowlen is updated.

(WTF::StringBuilder::reifyString):

  • wtf/text/StringBuilder.h:

(WTF::StringBuilder::StringBuilder):
(WTF::StringBuilder::characters):
(WTF::StringBuilder::clear): Cleaned up as part of the change.

  • wtf/text/StringImpl.cpp:

(WTF::StringImpl::getData16SlowCase):
(WTF::StringImpl::upconvertCharacters):

  • wtf/text/StringImpl.h:

Tools:

Reenabled failing tests that the code part of the patch fixes.

Reviewed by Geoffrey Garen.

  • TestWebKitAPI/Tests/WTF/StringBuilder.cpp:

(TestWebKitAPI::TEST):

Location:
trunk
Files:
8 edited

Legend:

Unmodified
Added
Removed
  • trunk/Source/JavaScriptCore/ChangeLog

    r102295 r102298  
     12011-12-07  Michael Saboff  <msaboff@apple.com>
     2
     3        StringBuilderTest.Append and StringBuilderTest.ToStringPreserveCapacity are failing.
     4        https://bugs.webkit.org/show_bug.cgi?id=73995
     5
     6        Reviewed by Geoffrey Garen.
     7
     8        Problem was that a call to characters on an StringImpl associated
     9        with a StringBuilder that is being appended to gets stale.
     10        Added a new m_valid16BitShadowlen that keeps the length of
     11        the 16 bit shadow that has been upconverted or will be up converted
     12        with the first getCharacters().  When StringBuilder::characters or
     13        ::reifyString is called, further characters are upconverted if
     14        we have a shadow16bit copy and the m_valid16BitShadowlen is updated.
     15
     16        * JavaScriptCore.exp:
     17        * wtf/text/StringBuilder.cpp:
     18        (WTF::StringBuilder::reifyString):
     19        * wtf/text/StringBuilder.h:
     20        (WTF::StringBuilder::StringBuilder):
     21        (WTF::StringBuilder::characters):
     22        (WTF::StringBuilder::clear): Cleaned up as part of the change.
     23        * wtf/text/StringImpl.cpp:
     24        (WTF::StringImpl::getData16SlowCase):
     25        (WTF::StringImpl::upconvertCharacters):
     26        * wtf/text/StringImpl.h:
     27
    1282011-12-07  Filip Pizlo  <fpizlo@apple.com>
    229
  • trunk/Source/JavaScriptCore/JavaScriptCore.exp

    r101713 r102298  
    584584__ZNK3JSC9HashTable11deleteTableEv
    585585__ZNK3WTF10StringImpl17getData16SlowCaseEv
     586__ZNK3WTF10StringImpl19upconvertCharactersEjj
    586587__ZNK3WTF12AtomicString5lowerEv
    587588__ZNK3WTF13DecimalNumber15toStringDecimalEPtj
  • trunk/Source/JavaScriptCore/wtf/text/StringBuilder.cpp

    r102017 r102298  
    5252        ? m_buffer.get()
    5353        : StringImpl::create(m_buffer, 0, m_length);
     54
     55    if (m_buffer->has16BitShadow() && m_valid16BitShadowLength < m_length)
     56        m_buffer->upconvertCharacters(m_valid16BitShadowLength, m_length);
     57
     58    m_valid16BitShadowLength = m_length;
    5459}
    5560
  • trunk/Source/JavaScriptCore/wtf/text/StringBuilder.h

    r102146 r102298  
    3737        : m_length(0)
    3838        , m_is8Bit(true)
     39        , m_valid16BitShadowLength(0)
    3940        , m_bufferCharacters8(0)
    4041    {
     
    170171            return m_string.characters();
    171172        ASSERT(m_buffer);
     173        if (m_buffer->has16BitShadow() && m_valid16BitShadowLength < m_length)
     174            m_buffer->upconvertCharacters(m_valid16BitShadowLength, m_length);
     175
     176        m_valid16BitShadowLength = m_length;
     177
    172178        return m_buffer->characters();
    173179    }
     
    178184        m_string = String();
    179185        m_buffer = 0;
     186        m_bufferCharacters8 = 0;
     187        m_is8Bit = true;
     188        m_valid16BitShadowLength = 0;
    180189    }
    181190
     
    198207    RefPtr<StringImpl> m_buffer;
    199208    bool m_is8Bit;
     209    mutable unsigned m_valid16BitShadowLength;
    200210    union {
    201211        LChar* m_bufferCharacters8;
  • trunk/Source/JavaScriptCore/wtf/text/StringImpl.cpp

    r101747 r102298  
    206206    m_copyData16 = static_cast<UChar*>(fastMalloc(len * sizeof(UChar)));
    207207
    208     if (hasTerminatingNullCharacter()) {
    209         len--;
    210         m_copyData16[len] = '\0';
    211     }
    212 
    213     for (size_t i = 0; i < len; i++)
     208    m_hashAndFlags |= s_hashFlagHas16BitShadow;
     209
     210    upconvertCharacters(0, len);
     211
     212    return m_copyData16;
     213}
     214
     215void StringImpl::upconvertCharacters(unsigned start, unsigned end) const
     216{
     217    ASSERT(is8Bit());
     218    ASSERT(has16BitShadow());
     219
     220    for (size_t i = start; i < end; i++)
    214221        m_copyData16[i] = m_data8[i];
    215 
    216     m_hashAndFlags |= s_hashFlagHas16BitShadow;
    217 
    218     return m_copyData16;
    219 }
     222}
     223   
    220224
    221225bool StringImpl::containsOnlyWhitespace()
  • trunk/Source/JavaScriptCore/wtf/text/StringImpl.h

    r101713 r102298  
    310310
    311311    bool has16BitShadow() const { return m_hashAndFlags & s_hashFlagHas16BitShadow; }
     312    void upconvertCharacters(unsigned, unsigned) const;
    312313    bool isIdentifier() const { return m_hashAndFlags & s_hashFlagIsIdentifier; }
    313314    void setIsIdentifier(bool isIdentifier)
  • trunk/Tools/ChangeLog

    r102296 r102298  
     12011-12-07  Michael Saboff  <msaboff@apple.com>
     2
     3        StringBuilderTest.Append and StringBuilderTest.ToStringPreserveCapacity are failing.
     4        https://bugs.webkit.org/show_bug.cgi?id=73995
     5
     6        Reenabled failing tests that the code part of the patch fixes.
     7
     8        Reviewed by Geoffrey Garen.
     9
     10        * TestWebKitAPI/Tests/WTF/StringBuilder.cpp:
     11        (TestWebKitAPI::TEST):
     12
    1132011-12-07  MORITA Hajime  <morrita@google.com>
    214
  • trunk/Tools/TestWebKitAPI/Tests/WTF/StringBuilder.cpp

    r102230 r102298  
    6767}
    6868
    69 TEST(StringBuilderTest, DISABLED_Append)
     69TEST(StringBuilderTest, Append)
    7070{
    7171    StringBuilder builder;
     
    124124}
    125125
    126 TEST(StringBuilderTest, DISABLED_ToStringPreserveCapacity)
     126TEST(StringBuilderTest, ToStringPreserveCapacity)
    127127{
    128128    StringBuilder builder;
Note: See TracChangeset for help on using the changeset viewer.