Reviewed by Geoff.
authorbdakin@apple.com <bdakin@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Thu, 13 Mar 2008 18:32:07 +0000 (18:32 +0000)
committerbdakin@apple.com <bdakin@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Thu, 13 Mar 2008 18:32:07 +0000 (18:32 +0000)
        Adding new functionality to Vector. Currently all of the shrink and
        resize functions on Vector only shrink the size of the Vector, not
        the capacity. For the Vector to take up as little memory as
        possible, though, it is necessary to be able to shrink the capacity
        as well. So this patch adds that functionality.

        I need this for a speed up I am working on, and Geoff wants to use
        it in a speed up he is working on also, so he asked me to commit it
        now.

        * wtf/Vector.h:
        (WTF::VectorBufferBase::allocateBuffer):
        (WTF::::shrinkCapacity):

git-svn-id: https://svn.webkit.org/repository/webkit/trunk@31032 268f45cc-cd09-0410-ab3c-d52691b4dbfc

JavaScriptCore/ChangeLog
JavaScriptCore/wtf/Vector.h

index 887bac122f26b7ee74738562060300578fe86734..14798b3375229ec5d5d9a7ca4e03e8c29bb2a2df 100644 (file)
@@ -1,3 +1,21 @@
+2008-03-13  Beth Dakin  <bdakin@apple.com>
+
+        Reviewed by Geoff.
+
+        Adding new functionality to Vector. Currently all of the shrink and 
+        resize functions on Vector only shrink the size of the Vector, not 
+        the capacity. For the Vector to take up as little memory as 
+        possible, though, it is necessary to be able to shrink the capacity 
+        as well. So this patch adds that functionality. 
+
+        I need this for a speed up I am working on, and Geoff wants to use 
+        it in a speed up he is working on also, so he asked me to commit it 
+        now. 
+
+        * wtf/Vector.h:
+        (WTF::VectorBufferBase::allocateBuffer):
+        (WTF::::shrinkCapacity):
+
 2008-03-13  Simon Hausmann  <hausmann@webkit.org>
 
         Reviewed by Adam Roben.
index 63520f700076536b514e05565f8fa241577a4126..55691d217d5114142d82b43fe1f6a15c493b9156 100644 (file)
@@ -245,7 +245,6 @@ namespace WTF {
     public:
         void allocateBuffer(size_t newCapacity)
         {
-            ASSERT(newCapacity >= m_capacity);
             m_capacity = newCapacity;
             if (newCapacity > std::numeric_limits<size_t>::max() / sizeof(T))
                 CRASH();
@@ -455,6 +454,7 @@ namespace WTF {
         void grow(size_t size);
         void resize(size_t size);
         void reserveCapacity(size_t newCapacity);
+        void shrinkCapacity(size_t newCapacity);
 
         void clear() { if (m_size) shrink(0); }
 
@@ -658,6 +658,22 @@ namespace WTF {
         TypeOperations::move(oldBuffer, oldEnd, begin());
         m_buffer.deallocateBuffer(oldBuffer);
     }
+    
+    template<typename T, size_t inlineCapacity>
+    void Vector<T, inlineCapacity>::shrinkCapacity(size_t newCapacity)
+    {
+        if (newCapacity >= capacity())
+            return;
+
+        T* oldBuffer = begin();
+        if (newCapacity > 0) {
+            T* oldEnd = end();
+            m_buffer.allocateBuffer(newCapacity);
+            TypeOperations::move(oldBuffer, oldEnd, begin());
+        }
+        m_size = min(m_size, newCapacity);
+        m_buffer.deallocateBuffer(oldBuffer);
+    }
 
     // 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