Index: Source/wtf/ListHashSet.h |
diff --git a/Source/wtf/ListHashSet.h b/Source/wtf/ListHashSet.h |
index 12b83451ee425228c4dcd4541920936e131c0f8f..2a40d49c02cee0fabbf806c2d808eedd7d7f9c47 100644 |
--- a/Source/wtf/ListHashSet.h |
+++ b/Source/wtf/ListHashSet.h |
@@ -56,10 +56,29 @@ namespace WTF { |
template<typename HashArg> struct ListHashSetNodeHashFunctions; |
template<typename HashArg> struct ListHashSetTranslator; |
+ // Don't declare a destructor for HeapAllocated ListHashSet. |
+ template<typename Derived, typename Allocator, bool isGarbageCollected> |
+ class ListHashSetDestructorBase; |
+ |
+ template<typename Derived, typename Allocator> |
+ class ListHashSetDestructorBase<Derived, Allocator, true> { |
+ protected: |
+ typename Allocator::AllocatorProvider m_allocatorProvider; |
+ }; |
+ |
+ template<typename Derived, typename Allocator> |
+ class ListHashSetDestructorBase<Derived, Allocator, false> { |
+ public: |
+ ~ListHashSetDestructorBase() { static_cast<Derived*>(this)->finalize(); } |
+ protected: |
+ typename Allocator::AllocatorProvider m_allocatorProvider; |
+ }; |
+ |
// Note that for a ListHashSet you cannot specify the HashTraits as a |
// template argument. It uses the default hash traits for the ValueArg |
// type. |
- template<typename ValueArg, size_t inlineCapacity = 256, typename HashArg = typename DefaultHash<ValueArg>::Hash, typename AllocatorArg = ListHashSetAllocator<ValueArg, inlineCapacity> > class ListHashSet { |
+ template<typename ValueArg, size_t inlineCapacity = 256, typename HashArg = typename DefaultHash<ValueArg>::Hash, typename AllocatorArg = ListHashSetAllocator<ValueArg, inlineCapacity> > class ListHashSet |
+ : public ListHashSetDestructorBase<ListHashSet<ValueArg, inlineCapacity, HashArg, AllocatorArg>, AllocatorArg, AllocatorArg::isGarbageCollected> { |
typedef AllocatorArg Allocator; |
WTF_USE_ALLOCATOR(ListHashSet, Allocator); |
@@ -98,7 +117,7 @@ namespace WTF { |
ListHashSet(); |
ListHashSet(const ListHashSet&); |
ListHashSet& operator=(const ListHashSet&); |
- ~ListHashSet(); |
+ void finalize(); |
void swap(ListHashSet&); |
@@ -171,9 +190,9 @@ namespace WTF { |
void prependNode(Node*); |
void insertNodeBefore(Node* beforeNode, Node* newNode); |
void deleteAllNodes(); |
- Allocator* allocator() const { return m_allocatorProvider.get(); } |
- void createAllocatorIfNeeded() { m_allocatorProvider.createAllocatorIfNeeded(); } |
- void deallocate(Node* node) const { m_allocatorProvider.deallocate(node); } |
+ Allocator* allocator() const { return this->m_allocatorProvider.get(); } |
+ void createAllocatorIfNeeded() { this->m_allocatorProvider.createAllocatorIfNeeded(); } |
+ void deallocate(Node* node) const { this->m_allocatorProvider.deallocate(node); } |
iterator makeIterator(Node* position) { return iterator(this, position); } |
const_iterator makeConstIterator(Node* position) const { return const_iterator(this, position); } |
@@ -185,7 +204,6 @@ namespace WTF { |
ImplType m_impl; |
Node* m_head; |
Node* m_tail; |
- typename Allocator::AllocatorProvider m_allocatorProvider; |
}; |
// ListHashSetNode has this base class to hold the members because the MSVC |
@@ -669,14 +687,14 @@ namespace WTF { |
m_impl.swap(other.m_impl); |
std::swap(m_head, other.m_head); |
std::swap(m_tail, other.m_tail); |
- m_allocatorProvider.swap(other.m_allocatorProvider); |
+ this->m_allocatorProvider.swap(other.m_allocatorProvider); |
} |
template<typename T, size_t inlineCapacity, typename U, typename V> |
- inline ListHashSet<T, inlineCapacity, U, V>::~ListHashSet() |
+ inline void ListHashSet<T, inlineCapacity, U, V>::finalize() |
{ |
- if (!Allocator::isGarbageCollected) |
- deleteAllNodes(); |
+ COMPILE_ASSERT(!Allocator::isGarbageCollected, FinalizeOnHeapAllocatedListHashSetShouldNeverBeCalled); |
+ deleteAllNodes(); |
} |
template<typename T, size_t inlineCapacity, typename U, typename V> |