Changeset 164097 in webkit


Ignore:
Timestamp:
Feb 14, 2014 3:14:56 AM (10 years ago)
Author:
commit-queue@webkit.org
Message:

(try)append and insert operations don't need new operator for PODs
https://bugs.webkit.org/show_bug.cgi?id=128185

Patch by Wojciech Bielawski <w.bielawski@samsung.com> on 2014-02-14
Reviewed by Darin Adler.

Vector's methods use VectorCopier to copy data.
VectorCopier for PODs exteded to be used with different types. For different types placement new copy approach is applied. For the same types memcpy is applied.

  • wtf/Vector.h:

(WTF::OverflowHandler>::append): use VectorCopier to copy data.
(WTF::OverflowHandler>::tryAppend): use VectorCopier to copy data.
(WTF::OverflowHandler>::insert): use VectorCopier to copy data.

Location:
trunk/Source/WTF
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • trunk/Source/WTF/ChangeLog

    r164072 r164097  
     12014-02-14  Wojciech Bielawski  <w.bielawski@samsung.com>
     2
     3        (try)append and insert operations don't need new operator for PODs
     4        https://bugs.webkit.org/show_bug.cgi?id=128185
     5
     6        Reviewed by Darin Adler.
     7
     8        Vector's methods use VectorCopier to copy data.
     9        VectorCopier for PODs exteded to be used with different types. For different types placement new copy approach is applied. For the same types memcpy is applied.
     10
     11        * wtf/Vector.h:
     12        (WTF::OverflowHandler>::append): use VectorCopier to copy data.
     13        (WTF::OverflowHandler>::tryAppend): use VectorCopier to copy data.
     14        (WTF::OverflowHandler>::insert): use VectorCopier to copy data.
     15
    1162014-02-13  Daniel Bates  <dabates@apple.com>
    217
  • trunk/Source/WTF/wtf/Vector.h

    r163850 r164097  
    137137struct VectorCopier<false, T>
    138138{
    139     static void uninitializedCopy(const T* src, const T* srcEnd, T* dst)
     139    template<typename U>
     140    static void uninitializedCopy(const T* src, const T* srcEnd, U* dst)
    140141    {
    141142        while (src != srcEnd) {
    142             new (NotNull, dst) T(*src);
     143            new (NotNull, dst) U(*src);
    143144            ++dst;
    144145            ++src;
     
    150151struct VectorCopier<true, T>
    151152{
    152     static void uninitializedCopy(const T* src, const T* srcEnd, T* dst) 
     153    static void uninitializedCopy(const T* src, const T* srcEnd, T* dst)
    153154    {
    154155        memcpy(dst, src, reinterpret_cast<const char*>(srcEnd) - reinterpret_cast<const char*>(src));
     156    }
     157    template<typename U>
     158    static void uninitializedCopy(const T* src, const T* srcEnd, U* dst)
     159    {
     160        VectorCopier<false, T>::uninitializedCopy(src, srcEnd, dst);
    155161    }
    156162};
     
    10051011// because for instance it allows a PassRefPtr to be appended to a RefPtr vector
    10061012// without refcount thrash.
    1007 
    10081013template<typename T, size_t inlineCapacity, typename OverflowHandler> template<typename U>
    10091014void Vector<T, inlineCapacity, OverflowHandler>::append(const U* data, size_t dataSize)
     
    10171022        CRASH();
    10181023    T* dest = end();
    1019     for (size_t i = 0; i < dataSize; ++i)
    1020         new (NotNull, &dest[i]) T(data[i]);
     1024    VectorCopier<std::is_trivial<T>::value, U>::uninitializedCopy(data, &data[dataSize], dest);
    10211025    m_size = newSize;
    10221026}
     
    10351039        return false;
    10361040    T* dest = end();
    1037     for (size_t i = 0; i < dataSize; ++i)
    1038         new (NotNull, &dest[i]) T(data[i]);
     1041    VectorCopier<std::is_trivial<T>::value, U>::uninitializedCopy(data, &data[dataSize], dest);
    10391042    m_size = newSize;
    10401043    return true;
     
    10981101    T* spot = begin() + position;
    10991102    TypeOperations::moveOverlapping(spot, end(), spot + dataSize);
    1100     for (size_t i = 0; i < dataSize; ++i)
    1101         new (NotNull, &spot[i]) T(data[i]);
     1103    VectorCopier<std::is_trivial<T>::value, U>::uninitializedCopy(data, &data[dataSize], spot);
    11021104    m_size = newSize;
    11031105}
Note: See TracChangeset for help on using the changeset viewer.