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

Unified Diff: Source/heap/Visitor.h

Issue 131803005: Add more oilpan collections support (Closed) Base URL: svn://svn.chromium.org/blink/trunk
Patch Set: Created 6 years, 11 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
Index: Source/heap/Visitor.h
diff --git a/Source/heap/Visitor.h b/Source/heap/Visitor.h
index 4ddaea3aa4f1f620cc347102b94bb200dd604cf4..40e75b5cca872f4d22359bd12ee40dfc02f76ffc 100644
--- a/Source/heap/Visitor.h
+++ b/Source/heap/Visitor.h
@@ -195,6 +195,11 @@ public:
template<typename T> class TraceTrait<const T> : public TraceTrait<T> { };
+template<typename Collection>
+struct OffHeapCollectionTraceTrait {
+ static void mark(Visitor*, const Collection&);
haraken 2014/01/15 04:48:35 Shouldn't this be "trace" instead of "mark"?
Erik Corry 2014/01/15 09:27:32 Done.
+};
+
template<typename T>
struct ObjectAliveTrait {
static bool isAlive(Visitor*, T);
@@ -335,6 +340,53 @@ private:
*cell = 0;
}
};
+template<typename T, typename HashFunctions, typename Traits>
+struct OffHeapCollectionTraceTrait<WTF::HashSet<T, WTF::DefaultAllocator, HashFunctions, Traits> > {
+ typedef WTF::HashSet<T, WTF::DefaultAllocator, HashFunctions, Traits> HashSet;
+
+ static void mark(Visitor* v, const HashSet& set)
haraken 2014/01/15 04:48:35 v => visitor
Erik Corry 2014/01/15 09:27:32 Done.
+ {
+ if (set.isEmpty())
+ return;
+ if (WTF::NeedsTracing<T>::value) {
+ for (typename HashSet::const_iterator it = set.begin(), end = set.end(); it != end; ++it)
+ CollectionBackingTraceTrait<Traits::needsTracing, Traits::isWeak, false, T, Traits>::mark(v, *it);
+ }
+ COMPILE_ASSERT(!Traits::isWeak, WeakOffHeapCollectionsConsideredDangerous);
+ }
+};
+
+template<typename T, size_t inlineCapacity, typename HashFunctions>
+struct OffHeapCollectionTraceTrait<WTF::ListHashSet<T, inlineCapacity, HashFunctions> > {
+ typedef WTF::ListHashSet<T, inlineCapacity, HashFunctions> ListHashSet;
+
+ static void mark(Visitor* visitor, const ListHashSet& set)
+ {
+ if (set.isEmpty())
+ return;
+ for (typename ListHashSet::const_iterator it = set.begin(), end = set.end(); it != end; ++it)
+ visitor->trace(*it);
+ }
+};
+
+template<typename Key, typename Value, typename HashFunctions, typename KeyTraits, typename ValueTraits>
+struct OffHeapCollectionTraceTrait<WTF::HashMap<Key, Value, WTF::DefaultAllocator, HashFunctions, KeyTraits, ValueTraits> > {
+ typedef WTF::HashMap<Key, Value, WTF::DefaultAllocator, HashFunctions, KeyTraits, ValueTraits> HashMap;
+
+ static void mark(Visitor* v, const HashMap& map)
haraken 2014/01/15 04:48:35 v => visitor
Erik Corry 2014/01/15 09:27:32 Done.
+ {
+ if (map.isEmpty())
+ return;
+ if (WTF::NeedsTracing<Key>::value || WTF::NeedsTracing<Value>::value) {
+ for (typename HashMap::const_iterator it = map.begin(), end = map.end(); it != end; ++it) {
+ CollectionBackingTraceTrait<KeyTraits::needsTracing, KeyTraits::isWeak, false, Key, KeyTraits>::mark(v, it->key);
+ CollectionBackingTraceTrait<ValueTraits::needsTracing, ValueTraits::isWeak, false, Value, ValueTraits>::mark(v, it->value);
+ }
+ }
haraken 2014/01/15 04:48:35 Shouldn't this be: for (typename HashMap::const_i
Erik Corry 2014/01/15 09:27:32 This would go through the loop even if nothing nee
+ COMPILE_ASSERT(!KeyTraits::isWeak, WeakOffHeapCollectionsConsideredDangerous);
+ COMPILE_ASSERT(!ValueTraits::isWeak, WeakOffHeapCollectionsConsideredDangerous);
+ }
+};
template<typename T, typename Traits = WTF::VectorTraits<T> >
class HeapVectorBacking;
@@ -376,6 +428,31 @@ ITERATE_DO_NOTHING_TYPES(DECLARE_DO_NOTHING_TRAIT)
#undef DECLARE_DO_NOTHING_TRAIT
+// Vectors are simple collections, and it's possible to mark vectors in a more
+// general way so that collections of objects (not pointers to objects) can be
+// marked.
+template<typename T, size_t N>
+struct OffHeapCollectionTraceTrait<WTF::Vector<T, N, WTF::DefaultAllocator> > {
+ typedef WTF::Vector<T, N, WTF::DefaultAllocator> Vector;
+
+ static void mark(Visitor* v, const Vector& vector)
haraken 2014/01/15 04:48:35 v => visitor
Erik Corry 2014/01/15 09:27:32 Done.
+ {
+ if (vector.isEmpty())
+ return;
+ for (typename Vector::const_iterator it = vector.begin(), end = vector.end(); it != end; ++it)
+ TraceTrait<T>::trace(v, const_cast<T*>(it));
+ }
+};
+
+// Fallback definition.
+template<typename Collection> void OffHeapCollectionTraceTrait<Collection>::mark(Visitor* visitor, const Collection& collection)
+{
+ if (collection.isEmpty())
+ return;
+ for (typename Collection::const_iterator it = collection.begin(), end = collection.end(); it != end; ++it)
+ visitor->trace(*it);
+}
+
#ifndef NDEBUG
template<typename T> void TraceTrait<T>::checkTypeMarker(Visitor* visitor, const T* t)
{

Powered by Google App Engine
This is Rietveld 408576698