Changeset 21221 in webkit for trunk/JavaScriptCore/wtf/Vector.h


Ignore:
Timestamp:
May 2, 2007, 6:11:05 AM (18 years ago)
Author:
harrison
Message:

JavaScriptCore:

Reviewed by Antti.

<rdar://problem/5174862> Crash resulting from DeprecatedString::insert()

Added insertion support for more than one value.


  • wtf/Vector.h: (WTF::::insert): Added support for inserting multiple values.


(WTF::::prepend):
New. Insert at the start of vectors. Convenient for vectors used as strings.

LayoutTests:

Reviewed by Antti.

  • test for <rdar://problem/5174862> Crash resulting from DeprecatedString::insert()


  • editing/selection/move-by-sentence-001-expected.checksum: Added.
  • editing/selection/move-by-sentence-001-expected.png: Added.
  • editing/selection/move-by-sentence-001-expected.txt: Added.
  • editing/selection/move-by-sentence-001.html: Added.

WebCore:

Reviewed by Antti.

<rdar://problem/5174862> Crash resulting from DeprecatedString::insert()


Test added: editing/selection/move-by-sentence-001.html

  • editing/visible_units.cpp: (WebCore::previousBoundary): (WebCore::nextBoundary): Use a UChar Vector instead of DeprecatedString. Avoid creating an extra string for secure bullet replacement unless it is actually needed.


  • platform/DeprecatedString.cpp: (WebCore::DeprecatedString::insert): Call forceUnicode() before setLength(), so that only the unicode buffer is resized.

(WebCore::DeprecatedString::setLength):

Adjust the unicode buffer even if the ascii buffer is valid.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/JavaScriptCore/wtf/Vector.h

    r19661 r21221  
    445445        template<typename U, size_t c> void append(const Vector<U, c>&);
    446446
     447        template<typename U> void insert(size_t position, const U*, size_t);
    447448        template<typename U> void insert(size_t position, const U&);
     449        template<typename U, size_t c> void insert(size_t position, const Vector<U, c>&);
     450
     451        template<typename U> void prepend(const U*, size_t);
     452        template<typename U> void prepend(const U&);
     453        template<typename U, size_t c> void prepend(const Vector<U, c>&);
    448454
    449455        void remove(size_t position);
     
    637643        append(val.begin(), val.size());
    638644    }
    639    
     645
     646    template<typename T, size_t inlineCapacity> template<typename U>
     647    void Vector<T, inlineCapacity>::insert(size_t position, const U* data, size_t dataSize)
     648    {
     649        ASSERT(position <= size());
     650        size_t newSize = m_size + dataSize;
     651        if (newSize > capacity())
     652            data = expandCapacity(newSize, data);
     653        T* spot = begin() + position;
     654        TypeOperations::moveOverlapping(spot, end(), spot + dataSize);
     655        for (size_t i = 0; i < dataSize; ++i)
     656            new (&spot[i]) T(data[i]);
     657        m_size = newSize;
     658    }
     659     
    640660    template<typename T, size_t inlineCapacity> template<typename U>
    641661    inline void Vector<T, inlineCapacity>::insert(size_t position, const U& val)
    642662    {
    643663        ASSERT(position <= size());
    644         const U* ptr = &val;
     664        const U* data = &val;
    645665        if (size() == capacity())
    646             ptr = expandCapacity(size() + 1, ptr);
     666            data = expandCapacity(size() + 1, data);
    647667        T* spot = begin() + position;
    648668        TypeOperations::moveOverlapping(spot, end(), spot + 1);
    649         new (spot) T(*ptr);
     669        new (spot) T(*data);
    650670        ++m_size;
    651671    }
    652 
     672   
     673    template<typename T, size_t inlineCapacity> template<typename U, size_t c>
     674    inline void Vector<T, inlineCapacity>::insert(size_t position, const Vector<U, c>& val)
     675    {
     676        insert(position, val.begin(), val.size());
     677    }
     678
     679    template<typename T, size_t inlineCapacity> template<typename U>
     680    void Vector<T, inlineCapacity>::prepend(const U* data, size_t dataSize)
     681    {
     682        insert(0, data, dataSize);
     683    }
     684
     685    template<typename T, size_t inlineCapacity> template<typename U>
     686    inline void Vector<T, inlineCapacity>::prepend(const U& val)
     687    {
     688        insert(0, val);
     689    }
     690   
     691    template<typename T, size_t inlineCapacity> template<typename U, size_t c>
     692    inline void Vector<T, inlineCapacity>::prepend(const Vector<U, c>& val)
     693    {
     694        insert(0, val.begin(), val.size());
     695    }
     696   
    653697    template<typename T, size_t inlineCapacity>
    654698    inline void Vector<T, inlineCapacity>::remove(size_t position)
Note: See TracChangeset for help on using the changeset viewer.