Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1512)

Unified Diff: Source/heap/Heap.h

Issue 216723002: Make sure all destructors are called in HeapHashMap and HeapHashSet (Closed) Base URL: svn://svn.chromium.org/blink/trunk
Patch Set: CR feedback Created 6 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « Source/heap/Handle.h ('k') | Source/heap/HeapTest.cpp » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: Source/heap/Heap.h
diff --git a/Source/heap/Heap.h b/Source/heap/Heap.h
index c84a0ce76f81da717d30a1754e83a1ff535940fd..b00320f91886fceae29663f759a6f703ed4a3210 100644
--- a/Source/heap/Heap.h
+++ b/Source/heap/Heap.h
@@ -1312,9 +1312,9 @@ public:
// Like the VectorBackingHelper, but this type is used for HashSet and
// HashMap, both of which are implemented using HashTable.
- template<typename T, typename U, typename V, typename W, typename X>
+ template<typename Table>
struct HashTableBackingHelper {
- typedef HeapHashTableBacking<T, U, V, W, X> Type;
+ typedef HeapHashTableBacking<Table> Type;
};
template<typename T>
@@ -1399,7 +1399,7 @@ struct ThreadingTrait<WeakMember<T> > {
};
template<typename Key, typename Value, typename T, typename U, typename V>
-struct ThreadingTrait<HashMap<Key, Value, HeapAllocator, T, U, V> > {
+struct ThreadingTrait<HashMap<Key, Value, T, U, V, HeapAllocator> > {
static const ThreadAffinity Affinity =
(ThreadingTrait<Key>::Affinity == MainThreadOnly)
&& (ThreadingTrait<Value>::Affinity == MainThreadOnly) ? MainThreadOnly : AnyThread;
@@ -1413,7 +1413,7 @@ struct ThreadingTrait<WTF::KeyValuePair<First, Second> > {
};
template<typename T, typename U, typename V>
-struct ThreadingTrait<HashSet<T, HeapAllocator, U, V> > {
+struct ThreadingTrait<HashSet<T, U, V, HeapAllocator> > {
static const ThreadAffinity Affinity = ThreadingTrait<T>::Affinity;
};
@@ -1428,17 +1428,21 @@ struct ThreadingTrait<HeapVectorBacking<T, Traits> > {
static const ThreadAffinity Affinity = ThreadingTrait<T>::Affinity;
};
-template<typename Key, typename Value, typename Extractor, typename Traits, typename KeyTraits>
-struct ThreadingTrait<HeapHashTableBacking<Key, Value, Extractor, Traits, KeyTraits> > {
+template<typename Table>
+struct ThreadingTrait<HeapHashTableBacking<Table> > {
+ typedef typename Table::KeyType Key;
+ typedef typename Table::ValueType Value;
static const ThreadAffinity Affinity =
(ThreadingTrait<Key>::Affinity == MainThreadOnly)
&& (ThreadingTrait<Value>::Affinity == MainThreadOnly) ? MainThreadOnly : AnyThread;
};
-template<typename Key, typename Value>
-struct ThreadingTrait<HeapHashMap<Key, Value> > : public ThreadingTrait<HashMap<Key, Value, HeapAllocator> > { };
-template<typename Value>
-struct ThreadingTrait<HeapHashSet<Value> > : public ThreadingTrait<HashSet<Value, HeapAllocator> > { };
+template<typename T, typename U, typename V, typename W, typename X>
+struct ThreadingTrait<HeapHashMap<T, U, V, W, X> > : public ThreadingTrait<HashMap<T, U, V, W, X, HeapAllocator> > { };
+
+template<typename T, typename U, typename V>
+struct ThreadingTrait<HeapHashSet<T, U, V> > : public ThreadingTrait<HashSet<T, U, V, HeapAllocator> > { };
+
template<typename T, size_t inlineCapacity>
struct ThreadingTrait<HeapVector<T, inlineCapacity> > : public ThreadingTrait<Vector<T, inlineCapacity, HeapAllocator> > { };
@@ -1516,17 +1520,17 @@ const GCInfo GCInfoTrait<HeapVectorBacking<T, Traits> >::info = {
Traits::needsDestruction,
};
-template<typename T, typename U, typename V, typename W, typename X>
-struct GCInfoTrait<HeapHashTableBacking<T, U, V, W, X> > {
+template<typename Table>
+struct GCInfoTrait<HeapHashTableBacking<Table> > {
static const GCInfo* get() { return &info; }
static const GCInfo info;
};
-template<typename T, typename U, typename V, typename Traits, typename W>
-const GCInfo GCInfoTrait<HeapHashTableBacking<T, U, V, Traits, W> >::info = {
- TraceTrait<HeapHashTableBacking<T, U, V, Traits, W> >::trace,
- FinalizerTrait<HeapHashTableBacking<T, U, V, Traits, W> >::finalize,
- Traits::needsDestruction,
+template<typename Table>
+const GCInfo GCInfoTrait<HeapHashTableBacking<Table> >::info = {
+ TraceTrait<HeapHashTableBacking<Table> >::trace,
+ HeapHashTableBacking<Table>::finalize,
+ Table::ValueTraits::needsDestruction,
};
template<bool markWeakMembersStrongly, typename T, typename Traits>
@@ -1550,15 +1554,17 @@ struct BaseVisitVectorBackingTrait {
}
};
-template<bool markWeakMembersStrongly, typename Key, typename Value, typename Extractor, typename Traits, typename KeyTraits>
+template<bool markWeakMembersStrongly, typename Table>
struct BaseVisitHashTableBackingTrait {
+ typedef typename Table::ValueType Value;
+ typedef typename Table::ValueTraits Traits;
static void mark(WebCore::Visitor* visitor, void* self)
{
Value* array = reinterpret_cast<Value*>(self);
WebCore::FinalizedHeapObjectHeader* header = WebCore::FinalizedHeapObjectHeader::fromPayload(self);
size_t length = header->payloadSize() / sizeof(Value);
for (size_t i = 0; i < length; i++) {
- if (!WTF::HashTableHelper<Value, Extractor, KeyTraits>::isEmptyOrDeletedBucket(array[i]))
+ if (!WTF::HashTableHelper<Value, typename Table::ExtractorType, typename Table::KeyTraitsType>::isEmptyOrDeletedBucket(array[i]))
CollectionBackingTraceTrait<WTF::ShouldBeTraced<Traits>::value, Traits::isWeak, markWeakMembersStrongly, Value, Traits>::mark(visitor, array[i]);
}
}
@@ -1605,13 +1611,13 @@ struct CollectionBackingTraceTrait<true, isWeak, markWeakMembersStrongly, HeapVe
};
// FTT (hash table)
-template<typename Key, typename Value, typename Extractor, typename Traits, typename KeyTraits>
-struct CollectionBackingTraceTrait<false, true, true, HeapHashTableBacking<Key, Value, Extractor, Traits, KeyTraits>, void> : public BaseVisitHashTableBackingTrait<true, Key, Value, Extractor, Traits, KeyTraits> {
+template<typename Table>
+struct CollectionBackingTraceTrait<false, true, true, HeapHashTableBacking<Table>, void> : public BaseVisitHashTableBackingTrait<true, Table> {
};
// TXX (hash table)
-template<bool isWeak, bool markWeakMembersStrongly, typename Key, typename Value, typename Extractor, typename Traits, typename KeyTraits>
-struct CollectionBackingTraceTrait<true, isWeak, markWeakMembersStrongly, HeapHashTableBacking<Key, Value, Extractor, Traits, KeyTraits>, void> : public BaseVisitHashTableBackingTrait<markWeakMembersStrongly, Key, Value, Extractor, Traits, KeyTraits> {
+template<bool isWeak, bool markWeakMembersStrongly, typename Table>
+struct CollectionBackingTraceTrait<true, isWeak, markWeakMembersStrongly, HeapHashTableBacking<Table>, void> : public BaseVisitHashTableBackingTrait<markWeakMembersStrongly, Table> {
};
// FTT (key value pair)
@@ -1685,13 +1691,14 @@ struct TraceTrait<HeapVectorBacking<T, Traits> > {
// we disable weak processing of table entries. When the backing is found
// through the owning hash table we mark differently, in order to do weak
// processing.
-template<typename Key, typename Value, typename Extractor, typename Traits, typename KeyTraits>
-struct TraceTrait<HeapHashTableBacking<Key, Value, Extractor, Traits, KeyTraits> > {
- typedef HeapHashTableBacking<Key, Value, Extractor, Traits, KeyTraits> Backing;
+template<typename Table>
+struct TraceTrait<HeapHashTableBacking<Table> > {
+ typedef HeapHashTableBacking<Table> Backing;
+ typedef typename Table::ValueTraits Traits;
static void trace(WebCore::Visitor* visitor, void* self)
{
if (WTF::ShouldBeTraced<Traits>::value || Traits::isWeak)
- CollectionBackingTraceTrait<WTF::ShouldBeTraced<Traits>::value, Traits::isWeak, true, HeapHashTableBacking<Key, Value, Extractor, Traits, KeyTraits>, void>::mark(visitor, self);
+ CollectionBackingTraceTrait<WTF::ShouldBeTraced<Traits>::value, Traits::isWeak, true, Backing, void>::mark(visitor, self);
}
static void mark(Visitor* visitor, const Backing* backing)
{
@@ -1708,6 +1715,22 @@ struct TraceTrait<HeapHashTableBacking<Key, Value, Extractor, Traits, KeyTraits>
}
};
+template<typename Table>
+void HeapHashTableBacking<Table>::finalize(void* pointer)
+{
+ typedef typename Table::ValueType Value;
+ ASSERT(Table::ValueTraits::needsDestruction);
+ FinalizedHeapObjectHeader* header = FinalizedHeapObjectHeader::fromPayload(pointer);
+ // Use the payload size as recorded by the heap to determine how many
+ // elements to finalize.
+ size_t length = header->payloadSize() / sizeof(Value);
+ Value* table = reinterpret_cast<Value*>(pointer);
+ for (unsigned i = 0; i < length; i++) {
+ if (!Table::isEmptyOrDeletedBucket(table[i]))
+ table[i].~Value();
+ }
+}
+
template<typename T, typename U, typename V, typename W, typename X>
struct GCInfoTrait<HeapHashMap<T, U, V, W, X> > : public GCInfoTrait<HashMap<T, U, V, W, X, HeapAllocator> > { };
template<typename T, typename U, typename V>
« no previous file with comments | « Source/heap/Handle.h ('k') | Source/heap/HeapTest.cpp » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698