Title: [164097] trunk/Source/WTF
Revision
164097
Author
[email protected]
Date
2014-02-14 03:14:56 -0800 (Fri, 14 Feb 2014)

Log 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 <[email protected]> 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.

Modified Paths

Diff

Modified: trunk/Source/WTF/ChangeLog (164096 => 164097)


--- trunk/Source/WTF/ChangeLog	2014-02-14 11:10:28 UTC (rev 164096)
+++ trunk/Source/WTF/ChangeLog	2014-02-14 11:14:56 UTC (rev 164097)
@@ -1,3 +1,18 @@
+2014-02-14  Wojciech Bielawski  <[email protected]>
+
+        (try)append and insert operations don't need new operator for PODs
+        https://bugs.webkit.org/show_bug.cgi?id=128185
+
+        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.
+
 2014-02-13  Daniel Bates  <[email protected]>
 
         Fix the iOS build after <http://trac.webkit.org/changeset/164064

Modified: trunk/Source/WTF/wtf/Vector.h (164096 => 164097)


--- trunk/Source/WTF/wtf/Vector.h	2014-02-14 11:10:28 UTC (rev 164096)
+++ trunk/Source/WTF/wtf/Vector.h	2014-02-14 11:14:56 UTC (rev 164097)
@@ -136,10 +136,11 @@
 template<typename T>
 struct VectorCopier<false, T>
 {
-    static void uninitializedCopy(const T* src, const T* srcEnd, T* dst) 
+    template<typename U>
+    static void uninitializedCopy(const T* src, const T* srcEnd, U* dst)
     {
         while (src != srcEnd) {
-            new (NotNull, dst) T(*src);
+            new (NotNull, dst) U(*src);
             ++dst;
             ++src;
         }
@@ -149,10 +150,15 @@
 template<typename T>
 struct VectorCopier<true, T>
 {
-    static void uninitializedCopy(const T* src, const T* srcEnd, T* dst) 
+    static void uninitializedCopy(const T* src, const T* srcEnd, T* dst)
     {
         memcpy(dst, src, reinterpret_cast<const char*>(srcEnd) - reinterpret_cast<const char*>(src));
     }
+    template<typename U>
+    static void uninitializedCopy(const T* src, const T* srcEnd, U* dst)
+    {
+        VectorCopier<false, T>::uninitializedCopy(src, srcEnd, dst);
+    }
 };
 
 template <bool canFillWithMemset, typename T>
@@ -1004,7 +1010,6 @@
 // Templatizing these is better than just letting the conversion happen implicitly,
 // because for instance it allows a PassRefPtr to be appended to a RefPtr vector
 // without refcount thrash.
-
 template<typename T, size_t inlineCapacity, typename OverflowHandler> template<typename U>
 void Vector<T, inlineCapacity, OverflowHandler>::append(const U* data, size_t dataSize)
 {
@@ -1016,8 +1021,7 @@
     if (newSize < m_size)
         CRASH();
     T* dest = end();
-    for (size_t i = 0; i < dataSize; ++i)
-        new (NotNull, &dest[i]) T(data[i]);
+    VectorCopier<std::is_trivial<T>::value, U>::uninitializedCopy(data, &data[dataSize], dest);
     m_size = newSize;
 }
 
@@ -1034,8 +1038,7 @@
     if (newSize < m_size)
         return false;
     T* dest = end();
-    for (size_t i = 0; i < dataSize; ++i)
-        new (NotNull, &dest[i]) T(data[i]);
+    VectorCopier<std::is_trivial<T>::value, U>::uninitializedCopy(data, &data[dataSize], dest);
     m_size = newSize;
     return true;
 }
@@ -1097,8 +1100,7 @@
         CRASH();
     T* spot = begin() + position;
     TypeOperations::moveOverlapping(spot, end(), spot + dataSize);
-    for (size_t i = 0; i < dataSize; ++i)
-        new (NotNull, &spot[i]) T(data[i]);
+    VectorCopier<std::is_trivial<T>::value, U>::uninitializedCopy(data, &data[dataSize], spot);
     m_size = newSize;
 }
  
_______________________________________________
webkit-changes mailing list
[email protected]
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to