Index: Source/wtf/Vector.h |
diff --git a/Source/wtf/Vector.h b/Source/wtf/Vector.h |
index efaa47ce883978c2ccf5df4cefa240823a923223..6043295f62d04b4a6e4ea756f910397fec5084b1 100644 |
--- a/Source/wtf/Vector.h |
+++ b/Source/wtf/Vector.h |
@@ -276,31 +276,10 @@ static const size_t kInitialVectorSize = 16; |
m_buffer = static_cast<T*>(fastRealloc(m_buffer, sizeToAllocate)); |
} |
- void deallocateBuffer(T* bufferToDeallocate) |
- { |
- if (!bufferToDeallocate) |
- return; |
- |
- if (m_buffer == bufferToDeallocate) { |
- m_buffer = 0; |
- m_capacity = 0; |
- } |
- |
- fastFree(bufferToDeallocate); |
- } |
- |
T* buffer() { return m_buffer; } |
const T* buffer() const { return m_buffer; } |
size_t capacity() const { return m_capacity; } |
- T* releaseBuffer() |
- { |
- T* buffer = m_buffer; |
- m_buffer = 0; |
- m_capacity = 0; |
- return buffer; |
- } |
- |
protected: |
VectorBufferBase() |
: m_buffer(0) |
@@ -316,7 +295,8 @@ static const size_t kInitialVectorSize = 16; |
~VectorBufferBase() |
{ |
- // FIXME: It would be nice to find a way to ASSERT that m_buffer hasn't leaked here. |
+ m_buffer = 0; |
+ m_size = 0; |
} |
T* m_buffer; |
@@ -344,6 +324,17 @@ static const size_t kInitialVectorSize = 16; |
allocateBuffer(capacity); |
} |
+ void deallocateBuffer(T* bufferToDeallocate) |
+ { |
+ fastFree(bufferToDeallocate); |
+ } |
+ |
+ void clearBufferPointer() |
+ { |
+ m_buffer = 0; |
+ m_capacity = 0; |
+ } |
+ |
~VectorBuffer() |
{ |
deallocateBuffer(buffer()); |
@@ -360,13 +351,10 @@ static const size_t kInitialVectorSize = 16; |
using Base::allocateBuffer; |
using Base::shouldReallocateBuffer; |
using Base::reallocateBuffer; |
- using Base::deallocateBuffer; |
using Base::buffer; |
using Base::capacity; |
- using Base::releaseBuffer; |
- |
protected: |
using Base::m_size; |
@@ -393,6 +381,18 @@ static const size_t kInitialVectorSize = 16; |
Base::allocateBuffer(capacity); |
} |
+ void deallocateBuffer(T* bufferToDeallocate) |
+ { |
+ if (UNLIKELY(bufferToDeallocate != inlineBuffer())) |
+ fastFree(bufferToDeallocate); |
+ } |
+ |
+ void clearBufferPointer() |
+ { |
+ m_buffer = 0; |
+ m_capacity = 0; |
+ } |
+ |
~VectorBuffer() |
{ |
deallocateBuffer(buffer()); |
@@ -409,13 +409,6 @@ static const size_t kInitialVectorSize = 16; |
} |
} |
- void deallocateBuffer(T* bufferToDeallocate) |
- { |
- if (bufferToDeallocate == inlineBuffer()) |
- return; |
- Base::deallocateBuffer(bufferToDeallocate); |
- } |
- |
bool shouldReallocateBuffer(size_t newCapacity) const |
{ |
// We cannot reallocate the inline buffer. |
@@ -460,13 +453,6 @@ static const size_t kInitialVectorSize = 16; |
using Base::buffer; |
using Base::capacity; |
- T* releaseBuffer() |
- { |
- if (buffer() == inlineBuffer()) |
- return 0; |
- return Base::releaseBuffer(); |
- } |
- |
protected: |
using Base::m_size; |
@@ -505,14 +491,12 @@ static const size_t kInitialVectorSize = 16; |
: Base(size) |
{ |
m_size = size; |
- if (begin()) |
- TypeOperations::initialize(begin(), end()); |
+ TypeOperations::initialize(begin(), end()); |
} |
~Vector() |
{ |
- if (m_size) |
- shrink(0); |
+ shrink(0); |
} |
Vector(const Vector&); |
@@ -605,8 +589,7 @@ static const size_t kInitialVectorSize = 16; |
: Base(size) |
{ |
m_size = size; |
- if (begin()) |
- TypeOperations::uninitializedFill(begin(), end(), val); |
+ TypeOperations::uninitializedFill(begin(), end(), val); |
} |
void fill(const T&, size_t); |
@@ -614,8 +597,6 @@ static const size_t kInitialVectorSize = 16; |
template<typename Iterator> void appendRange(Iterator start, Iterator end); |
- T* releaseBuffer(); |
- |
void swap(Vector<T, inlineCapacity>& other) |
{ |
std::swap(m_size, other.m_size); |
@@ -635,11 +616,9 @@ static const size_t kInitialVectorSize = 16; |
using Base::capacity; |
using Base::swap; |
using Base::allocateBuffer; |
- using Base::deallocateBuffer; |
using Base::shouldReallocateBuffer; |
using Base::reallocateBuffer; |
using Base::restoreInlineBufferIfNeeded; |
- using Base::releaseBuffer; |
}; |
template<typename T, size_t inlineCapacity> |
@@ -647,8 +626,7 @@ static const size_t kInitialVectorSize = 16; |
: Base(other.capacity()) |
{ |
m_size = other.size(); |
- if (begin()) |
- TypeOperations::uninitializedCopy(other.begin(), other.end(), begin()); |
+ TypeOperations::uninitializedCopy(other.begin(), other.end(), begin()); |
} |
template<typename T, size_t inlineCapacity> |
@@ -657,14 +635,13 @@ static const size_t kInitialVectorSize = 16; |
: Base(other.capacity()) |
{ |
m_size = other.size(); |
- if (begin()) |
- TypeOperations::uninitializedCopy(other.begin(), other.end(), begin()); |
+ TypeOperations::uninitializedCopy(other.begin(), other.end(), begin()); |
} |
template<typename T, size_t inlineCapacity> |
Vector<T, inlineCapacity>& Vector<T, inlineCapacity>::operator=(const Vector<T, inlineCapacity>& other) |
{ |
- if (&other == this) |
+ if (UNLIKELY(&other == this)) |
return *this; |
if (size() > other.size()) |
@@ -829,8 +806,7 @@ static const size_t kInitialVectorSize = 16; |
else { |
if (size > capacity()) |
expandCapacity(size); |
- if (begin()) |
- TypeOperations::initialize(end(), begin() + size); |
+ TypeOperations::initialize(end(), begin() + size); |
} |
m_size = size; |
@@ -850,21 +826,19 @@ static const size_t kInitialVectorSize = 16; |
ASSERT(size >= m_size); |
if (size > capacity()) |
expandCapacity(size); |
- if (begin()) |
- TypeOperations::initialize(end(), begin() + size); |
+ TypeOperations::initialize(end(), begin() + size); |
m_size = size; |
} |
template<typename T, size_t inlineCapacity> |
void Vector<T, inlineCapacity>::reserveCapacity(size_t newCapacity) |
{ |
- if (newCapacity <= capacity()) |
+ if (UNLIKELY(newCapacity <= capacity())) |
return; |
T* oldBuffer = begin(); |
T* oldEnd = end(); |
Base::allocateBuffer(newCapacity); |
- if (begin()) |
- TypeOperations::move(oldBuffer, oldEnd, begin()); |
+ TypeOperations::move(oldBuffer, oldEnd, begin()); |
Base::deallocateBuffer(oldBuffer); |
} |
@@ -897,6 +871,8 @@ static const size_t kInitialVectorSize = 16; |
Base::allocateBuffer(newCapacity); |
if (begin() != oldBuffer) |
TypeOperations::move(oldBuffer, oldEnd, begin()); |
+ } else { |
+ Base::clearBufferPointer(); |
} |
Base::deallocateBuffer(oldBuffer); |
@@ -1060,22 +1036,6 @@ static const size_t kInitialVectorSize = 16; |
} |
template<typename T, size_t inlineCapacity> |
- inline T* Vector<T, inlineCapacity>::releaseBuffer() |
- { |
- T* buffer = Base::releaseBuffer(); |
- if (inlineCapacity && !buffer && m_size) { |
- // If the vector had some data, but no buffer to release, |
- // that means it was using the inline buffer. In that case, |
- // we create a brand new buffer so the caller always gets one. |
- size_t bytes = m_size * sizeof(T); |
- buffer = static_cast<T*>(fastMalloc(bytes)); |
- memcpy(buffer, data(), bytes); |
- } |
- m_size = 0; |
- return buffer; |
- } |
- |
- template<typename T, size_t inlineCapacity> |
void deleteAllValues(const Vector<T, inlineCapacity>& collection) |
{ |
typedef typename Vector<T, inlineCapacity>::const_iterator iterator; |