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

Side by Side Diff: Source/platform/heap/Heap.h

Issue 400543004: Rename WebCore namespace to blink in Platform (Closed) Base URL: svn://svn.chromium.org/blink/trunk
Patch Set: Created 6 years, 5 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 unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « Source/platform/heap/Handle.h ('k') | Source/platform/heap/Heap.cpp » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 /* 1 /*
2 * Copyright (C) 2013 Google Inc. All rights reserved. 2 * Copyright (C) 2013 Google Inc. All rights reserved.
3 * 3 *
4 * Redistribution and use in source and binary forms, with or without 4 * Redistribution and use in source and binary forms, with or without
5 * modification, are permitted provided that the following conditions are 5 * modification, are permitted provided that the following conditions are
6 * met: 6 * met:
7 * 7 *
8 * * Redistributions of source code must retain the above copyright 8 * * Redistributions of source code must retain the above copyright
9 * notice, this list of conditions and the following disclaimer. 9 * notice, this list of conditions and the following disclaimer.
10 * * Redistributions in binary form must reproduce the above 10 * * Redistributions in binary form must reproduce the above
(...skipping 28 matching lines...) Expand all
39 #include "wtf/Assertions.h" 39 #include "wtf/Assertions.h"
40 #include "wtf/HashCountedSet.h" 40 #include "wtf/HashCountedSet.h"
41 #include "wtf/LinkedHashSet.h" 41 #include "wtf/LinkedHashSet.h"
42 #include "wtf/ListHashSet.h" 42 #include "wtf/ListHashSet.h"
43 #include "wtf/OwnPtr.h" 43 #include "wtf/OwnPtr.h"
44 #include "wtf/PassRefPtr.h" 44 #include "wtf/PassRefPtr.h"
45 #include "wtf/ThreadSafeRefCounted.h" 45 #include "wtf/ThreadSafeRefCounted.h"
46 46
47 #include <stdint.h> 47 #include <stdint.h>
48 48
49 namespace WebCore { 49 namespace blink {
50 50
51 const size_t blinkPageSizeLog2 = 17; 51 const size_t blinkPageSizeLog2 = 17;
52 const size_t blinkPageSize = 1 << blinkPageSizeLog2; 52 const size_t blinkPageSize = 1 << blinkPageSizeLog2;
53 const size_t blinkPageOffsetMask = blinkPageSize - 1; 53 const size_t blinkPageOffsetMask = blinkPageSize - 1;
54 const size_t blinkPageBaseMask = ~blinkPageOffsetMask; 54 const size_t blinkPageBaseMask = ~blinkPageOffsetMask;
55 55
56 // We allocate pages at random addresses but in groups of 56 // We allocate pages at random addresses but in groups of
57 // blinkPagesPerRegion at a given random address. We group pages to 57 // blinkPagesPerRegion at a given random address. We group pages to
58 // not spread out too much over the address space which would blow 58 // not spread out too much over the address space which would blow
59 // away the page tables and lead to bad performance. 59 // away the page tables and lead to bad performance.
(...skipping 1402 matching lines...) Expand 10 before | Expand all | Expand 10 after
1462 return HeapTrait<T>::HeapType::roundedAllocationSize(count * sizeof(T)); 1462 return HeapTrait<T>::HeapType::roundedAllocationSize(count * sizeof(T));
1463 } 1463 }
1464 static const size_t kMaxUnquantizedAllocation = maxHeapObjectSize; 1464 static const size_t kMaxUnquantizedAllocation = maxHeapObjectSize;
1465 }; 1465 };
1466 1466
1467 // This is a static-only class used as a trait on collections to make them heap allocated. 1467 // This is a static-only class used as a trait on collections to make them heap allocated.
1468 // However see also HeapListHashSetAllocator. 1468 // However see also HeapListHashSetAllocator.
1469 class HeapAllocator { 1469 class HeapAllocator {
1470 public: 1470 public:
1471 typedef HeapAllocatorQuantizer Quantizer; 1471 typedef HeapAllocatorQuantizer Quantizer;
1472 typedef WebCore::Visitor Visitor; 1472 typedef blink::Visitor Visitor;
1473 static const bool isGarbageCollected = true; 1473 static const bool isGarbageCollected = true;
1474 1474
1475 template <typename Return, typename Metadata> 1475 template <typename Return, typename Metadata>
1476 static Return backingMalloc(size_t size) 1476 static Return backingMalloc(size_t size)
1477 { 1477 {
1478 return malloc<Return, Metadata>(size); 1478 return malloc<Return, Metadata>(size);
1479 } 1479 }
1480 template <typename Return, typename Metadata> 1480 template <typename Return, typename Metadata>
1481 static Return zeroedBackingMalloc(size_t size) 1481 static Return zeroedBackingMalloc(size_t size)
1482 { 1482 {
(...skipping 556 matching lines...) Expand 10 before | Expand all | Expand 10 after
2039 Table::ValueTraits::needsDestruction, 2039 Table::ValueTraits::needsDestruction,
2040 WTF::IsPolymorphic<TargetType>::value, 2040 WTF::IsPolymorphic<TargetType>::value,
2041 #if ENABLE(GC_TRACING) 2041 #if ENABLE(GC_TRACING)
2042 TypenameStringTrait<TargetType>::get() 2042 TypenameStringTrait<TargetType>::get()
2043 #endif 2043 #endif
2044 }; 2044 };
2045 return &info; 2045 return &info;
2046 } 2046 }
2047 }; 2047 };
2048 2048
2049 } // namespace WebCore 2049 } // namespace blink
2050 2050
2051 namespace WTF { 2051 namespace WTF {
2052 2052
2053 // Catch-all for types that have a way to trace that don't have special 2053 // Catch-all for types that have a way to trace that don't have special
2054 // handling for weakness in collections. This means that if this type 2054 // handling for weakness in collections. This means that if this type
2055 // contains WeakMember fields, they will simply be zeroed, but the entry 2055 // contains WeakMember fields, they will simply be zeroed, but the entry
2056 // will not be removed from the collection. This always happens for 2056 // will not be removed from the collection. This always happens for
2057 // things in vectors, which don't currently support special handling of 2057 // things in vectors, which don't currently support special handling of
2058 // weak elements. 2058 // weak elements.
2059 template<ShouldWeakPointersBeMarkedStrongly strongify, typename T, typename Trai ts> 2059 template<ShouldWeakPointersBeMarkedStrongly strongify, typename T, typename Trai ts>
2060 struct TraceInCollectionTrait<NoWeakHandlingInCollections, strongify, T, Traits> { 2060 struct TraceInCollectionTrait<NoWeakHandlingInCollections, strongify, T, Traits> {
2061 static bool trace(WebCore::Visitor* visitor, T& t) 2061 static bool trace(blink::Visitor* visitor, T& t)
2062 { 2062 {
2063 WebCore::TraceTrait<T>::trace(visitor, &t); 2063 blink::TraceTrait<T>::trace(visitor, &t);
2064 return false; 2064 return false;
2065 } 2065 }
2066 }; 2066 };
2067 2067
2068 // Catch-all for things that have HashTrait support for tracing with weakness. 2068 // Catch-all for things that have HashTrait support for tracing with weakness.
2069 template<ShouldWeakPointersBeMarkedStrongly strongify, typename T, typename Trai ts> 2069 template<ShouldWeakPointersBeMarkedStrongly strongify, typename T, typename Trai ts>
2070 struct TraceInCollectionTrait<WeakHandlingInCollections, strongify, T, Traits> { 2070 struct TraceInCollectionTrait<WeakHandlingInCollections, strongify, T, Traits> {
2071 static bool trace(WebCore::Visitor* visitor, T& t) 2071 static bool trace(blink::Visitor* visitor, T& t)
2072 { 2072 {
2073 return Traits::traceInCollection(visitor, t, strongify); 2073 return Traits::traceInCollection(visitor, t, strongify);
2074 } 2074 }
2075 }; 2075 };
2076 2076
2077 // Vector backing that needs marking. We don't support weak members in vectors. 2077 // Vector backing that needs marking. We don't support weak members in vectors.
2078 template<ShouldWeakPointersBeMarkedStrongly strongify, typename T, typename Trai ts> 2078 template<ShouldWeakPointersBeMarkedStrongly strongify, typename T, typename Trai ts>
2079 struct TraceInCollectionTrait<NoWeakHandlingInCollections, strongify, WebCore::H eapVectorBacking<T, Traits>, void> { 2079 struct TraceInCollectionTrait<NoWeakHandlingInCollections, strongify, blink::Hea pVectorBacking<T, Traits>, void> {
2080 static bool trace(WebCore::Visitor* visitor, void* self) 2080 static bool trace(blink::Visitor* visitor, void* self)
2081 { 2081 {
2082 // The allocator can oversize the allocation a little, according to 2082 // The allocator can oversize the allocation a little, according to
2083 // the allocation granularity. The extra size is included in the 2083 // the allocation granularity. The extra size is included in the
2084 // payloadSize call below, since there is nowhere to store the 2084 // payloadSize call below, since there is nowhere to store the
2085 // originally allocated memory. This assert ensures that visiting the 2085 // originally allocated memory. This assert ensures that visiting the
2086 // last bit of memory can't cause trouble. 2086 // last bit of memory can't cause trouble.
2087 COMPILE_ASSERT(!ShouldBeTraced<Traits>::value || sizeof(T) > WebCore::al locationGranularity || Traits::canInitializeWithMemset, HeapOverallocationCanCau seSpuriousVisits); 2087 COMPILE_ASSERT(!ShouldBeTraced<Traits>::value || sizeof(T) > blink::allo cationGranularity || Traits::canInitializeWithMemset, HeapOverallocationCanCause SpuriousVisits);
2088 2088
2089 T* array = reinterpret_cast<T*>(self); 2089 T* array = reinterpret_cast<T*>(self);
2090 WebCore::FinalizedHeapObjectHeader* header = WebCore::FinalizedHeapObjec tHeader::fromPayload(self); 2090 blink::FinalizedHeapObjectHeader* header = blink::FinalizedHeapObjectHea der::fromPayload(self);
2091 // Use the payload size as recorded by the heap to determine how many 2091 // Use the payload size as recorded by the heap to determine how many
2092 // elements to mark. 2092 // elements to mark.
2093 size_t length = header->payloadSize() / sizeof(T); 2093 size_t length = header->payloadSize() / sizeof(T);
2094 for (size_t i = 0; i < length; i++) 2094 for (size_t i = 0; i < length; i++)
2095 WebCore::CollectionBackingTraceTrait<ShouldBeTraced<Traits>::value, Traits::weakHandlingFlag, WeakPointersActStrong, T, Traits>::trace(visitor, arra y[i]); 2095 blink::CollectionBackingTraceTrait<ShouldBeTraced<Traits>::value, Tr aits::weakHandlingFlag, WeakPointersActStrong, T, Traits>::trace(visitor, array[ i]);
2096 return false; 2096 return false;
2097 } 2097 }
2098 }; 2098 };
2099 2099
2100 // Almost all hash table backings are visited with this specialization. 2100 // Almost all hash table backings are visited with this specialization.
2101 template<ShouldWeakPointersBeMarkedStrongly strongify, typename Table> 2101 template<ShouldWeakPointersBeMarkedStrongly strongify, typename Table>
2102 struct TraceInCollectionTrait<NoWeakHandlingInCollections, strongify, WebCore::H eapHashTableBacking<Table>, void> { 2102 struct TraceInCollectionTrait<NoWeakHandlingInCollections, strongify, blink::Hea pHashTableBacking<Table>, void> {
2103 typedef typename Table::ValueType Value; 2103 typedef typename Table::ValueType Value;
2104 typedef typename Table::ValueTraits Traits; 2104 typedef typename Table::ValueTraits Traits;
2105 static bool trace(WebCore::Visitor* visitor, void* self) 2105 static bool trace(blink::Visitor* visitor, void* self)
2106 { 2106 {
2107 Value* array = reinterpret_cast<Value*>(self); 2107 Value* array = reinterpret_cast<Value*>(self);
2108 WebCore::FinalizedHeapObjectHeader* header = WebCore::FinalizedHeapObjec tHeader::fromPayload(self); 2108 blink::FinalizedHeapObjectHeader* header = blink::FinalizedHeapObjectHea der::fromPayload(self);
2109 size_t length = header->payloadSize() / sizeof(Value); 2109 size_t length = header->payloadSize() / sizeof(Value);
2110 for (size_t i = 0; i < length; i++) { 2110 for (size_t i = 0; i < length; i++) {
2111 if (!HashTableHelper<Value, typename Table::ExtractorType, typename Table::KeyTraitsType>::isEmptyOrDeletedBucket(array[i])) 2111 if (!HashTableHelper<Value, typename Table::ExtractorType, typename Table::KeyTraitsType>::isEmptyOrDeletedBucket(array[i]))
2112 WebCore::CollectionBackingTraceTrait<ShouldBeTraced<Traits>::val ue, Traits::weakHandlingFlag, strongify, Value, Traits>::trace(visitor, array[i] ); 2112 blink::CollectionBackingTraceTrait<ShouldBeTraced<Traits>::value , Traits::weakHandlingFlag, strongify, Value, Traits>::trace(visitor, array[i]);
2113 } 2113 }
2114 return false; 2114 return false;
2115 } 2115 }
2116 }; 2116 };
2117 2117
2118 // This specialization of TraceInCollectionTrait is for the backing of 2118 // This specialization of TraceInCollectionTrait is for the backing of
2119 // HeapListHashSet. This is for the case that we find a reference to the 2119 // HeapListHashSet. This is for the case that we find a reference to the
2120 // backing from the stack. That probably means we have a GC while we are in a 2120 // backing from the stack. That probably means we have a GC while we are in a
2121 // ListHashSet method since normal API use does not put pointers to the backing 2121 // ListHashSet method since normal API use does not put pointers to the backing
2122 // on the stack. 2122 // on the stack.
2123 template<ShouldWeakPointersBeMarkedStrongly strongify, typename NodeContents, si ze_t inlineCapacity, typename T, typename U, typename V, typename W, typename X, typename Y> 2123 template<ShouldWeakPointersBeMarkedStrongly strongify, typename NodeContents, si ze_t inlineCapacity, typename T, typename U, typename V, typename W, typename X, typename Y>
2124 struct TraceInCollectionTrait<NoWeakHandlingInCollections, strongify, WebCore::H eapHashTableBacking<HashTable<ListHashSetNode<NodeContents, WebCore::HeapListHas hSetAllocator<T, inlineCapacity> >*, U, V, W, X, Y, WebCore::HeapAllocator> >, v oid> { 2124 struct TraceInCollectionTrait<NoWeakHandlingInCollections, strongify, blink::Hea pHashTableBacking<HashTable<ListHashSetNode<NodeContents, blink::HeapListHashSet Allocator<T, inlineCapacity> >*, U, V, W, X, Y, blink::HeapAllocator> >, void> {
2125 typedef ListHashSetNode<NodeContents, WebCore::HeapListHashSetAllocator<T, i nlineCapacity> > Node; 2125 typedef ListHashSetNode<NodeContents, blink::HeapListHashSetAllocator<T, inl ineCapacity> > Node;
2126 typedef HashTable<Node*, U, V, W, X, Y, WebCore::HeapAllocator> Table; 2126 typedef HashTable<Node*, U, V, W, X, Y, blink::HeapAllocator> Table;
2127 static bool trace(WebCore::Visitor* visitor, void* self) 2127 static bool trace(blink::Visitor* visitor, void* self)
2128 { 2128 {
2129 Node** array = reinterpret_cast<Node**>(self); 2129 Node** array = reinterpret_cast<Node**>(self);
2130 WebCore::FinalizedHeapObjectHeader* header = WebCore::FinalizedHeapObjec tHeader::fromPayload(self); 2130 blink::FinalizedHeapObjectHeader* header = blink::FinalizedHeapObjectHea der::fromPayload(self);
2131 size_t length = header->payloadSize() / sizeof(Node*); 2131 size_t length = header->payloadSize() / sizeof(Node*);
2132 for (size_t i = 0; i < length; i++) { 2132 for (size_t i = 0; i < length; i++) {
2133 if (!HashTableHelper<Node*, typename Table::ExtractorType, typename Table::KeyTraitsType>::isEmptyOrDeletedBucket(array[i])) { 2133 if (!HashTableHelper<Node*, typename Table::ExtractorType, typename Table::KeyTraitsType>::isEmptyOrDeletedBucket(array[i])) {
2134 traceListHashSetValue(visitor, array[i]->m_value); 2134 traceListHashSetValue(visitor, array[i]->m_value);
2135 // Just mark the node without tracing because we already traced 2135 // Just mark the node without tracing because we already traced
2136 // the contents, and there is no need to trace the next and 2136 // the contents, and there is no need to trace the next and
2137 // prev fields since iterating over the hash table backing will 2137 // prev fields since iterating over the hash table backing will
2138 // find the whole chain. 2138 // find the whole chain.
2139 visitor->markNoTracing(array[i]); 2139 visitor->markNoTracing(array[i]);
2140 } 2140 }
2141 } 2141 }
2142 return false; 2142 return false;
2143 } 2143 }
2144 }; 2144 };
2145 2145
2146 // Key value pairs, as used in HashMap. To disambiguate template choice we have 2146 // Key value pairs, as used in HashMap. To disambiguate template choice we have
2147 // to have two versions, first the one with no special weak handling, then the 2147 // to have two versions, first the one with no special weak handling, then the
2148 // one with weak handling. 2148 // one with weak handling.
2149 template<ShouldWeakPointersBeMarkedStrongly strongify, typename Key, typename Va lue, typename Traits> 2149 template<ShouldWeakPointersBeMarkedStrongly strongify, typename Key, typename Va lue, typename Traits>
2150 struct TraceInCollectionTrait<NoWeakHandlingInCollections, strongify, KeyValuePa ir<Key, Value>, Traits> { 2150 struct TraceInCollectionTrait<NoWeakHandlingInCollections, strongify, KeyValuePa ir<Key, Value>, Traits> {
2151 static bool trace(WebCore::Visitor* visitor, KeyValuePair<Key, Value>& self) 2151 static bool trace(blink::Visitor* visitor, KeyValuePair<Key, Value>& self)
2152 { 2152 {
2153 ASSERT(ShouldBeTraced<Traits>::value); 2153 ASSERT(ShouldBeTraced<Traits>::value);
2154 WebCore::CollectionBackingTraceTrait<ShouldBeTraced<typename Traits::Key Traits>::value, NoWeakHandlingInCollections, strongify, Key, typename Traits::Ke yTraits>::trace(visitor, self.key); 2154 blink::CollectionBackingTraceTrait<ShouldBeTraced<typename Traits::KeyTr aits>::value, NoWeakHandlingInCollections, strongify, Key, typename Traits::KeyT raits>::trace(visitor, self.key);
2155 WebCore::CollectionBackingTraceTrait<ShouldBeTraced<typename Traits::Val ueTraits>::value, NoWeakHandlingInCollections, strongify, Value, typename Traits ::ValueTraits>::trace(visitor, self.value); 2155 blink::CollectionBackingTraceTrait<ShouldBeTraced<typename Traits::Value Traits>::value, NoWeakHandlingInCollections, strongify, Value, typename Traits:: ValueTraits>::trace(visitor, self.value);
2156 return false; 2156 return false;
2157 } 2157 }
2158 }; 2158 };
2159 2159
2160 template<ShouldWeakPointersBeMarkedStrongly strongify, typename Key, typename Va lue, typename Traits> 2160 template<ShouldWeakPointersBeMarkedStrongly strongify, typename Key, typename Va lue, typename Traits>
2161 struct TraceInCollectionTrait<WeakHandlingInCollections, strongify, KeyValuePair <Key, Value>, Traits> { 2161 struct TraceInCollectionTrait<WeakHandlingInCollections, strongify, KeyValuePair <Key, Value>, Traits> {
2162 static bool trace(WebCore::Visitor* visitor, KeyValuePair<Key, Value>& self) 2162 static bool trace(blink::Visitor* visitor, KeyValuePair<Key, Value>& self)
2163 { 2163 {
2164 // This is the core of the ephemeron-like functionality. If there is 2164 // This is the core of the ephemeron-like functionality. If there is
2165 // weakness on the key side then we first check whether there are 2165 // weakness on the key side then we first check whether there are
2166 // dead weak pointers on that side, and if there are we don't mark the 2166 // dead weak pointers on that side, and if there are we don't mark the
2167 // value side (yet). Conversely if there is weakness on the value side 2167 // value side (yet). Conversely if there is weakness on the value side
2168 // we check that first and don't mark the key side yet if we find dead 2168 // we check that first and don't mark the key side yet if we find dead
2169 // weak pointers. 2169 // weak pointers.
2170 // Corner case: If there is weakness on both the key and value side, 2170 // Corner case: If there is weakness on both the key and value side,
2171 // and there are also strong pointers on the both sides then we could 2171 // and there are also strong pointers on the both sides then we could
2172 // unexpectedly leak. The scenario is that the weak pointer on the key 2172 // unexpectedly leak. The scenario is that the weak pointer on the key
2173 // side is alive, which causes the strong pointer on the key side to be 2173 // side is alive, which causes the strong pointer on the key side to be
2174 // marked. If that then results in the object pointed to by the weak 2174 // marked. If that then results in the object pointed to by the weak
2175 // pointer on the value side being marked live, then the whole 2175 // pointer on the value side being marked live, then the whole
2176 // key-value entry is leaked. To avoid unexpected leaking, we disallow 2176 // key-value entry is leaked. To avoid unexpected leaking, we disallow
2177 // this case, but if you run into this assert, please reach out to Blink 2177 // this case, but if you run into this assert, please reach out to Blink
2178 // reviewers, and we may relax it. 2178 // reviewers, and we may relax it.
2179 const bool keyIsWeak = Traits::KeyTraits::weakHandlingFlag == WeakHandli ngInCollections; 2179 const bool keyIsWeak = Traits::KeyTraits::weakHandlingFlag == WeakHandli ngInCollections;
2180 const bool valueIsWeak = Traits::ValueTraits::weakHandlingFlag == WeakHa ndlingInCollections; 2180 const bool valueIsWeak = Traits::ValueTraits::weakHandlingFlag == WeakHa ndlingInCollections;
2181 const bool keyHasStrongRefs = ShouldBeTraced<typename Traits::KeyTraits> ::value; 2181 const bool keyHasStrongRefs = ShouldBeTraced<typename Traits::KeyTraits> ::value;
2182 const bool valueHasStrongRefs = ShouldBeTraced<typename Traits::ValueTra its>::value; 2182 const bool valueHasStrongRefs = ShouldBeTraced<typename Traits::ValueTra its>::value;
2183 COMPILE_ASSERT(!keyIsWeak || !valueIsWeak || !keyHasStrongRefs || !value HasStrongRefs, ThisConfigurationWasDisallowedToAvoidUnexpectedLeaks); 2183 COMPILE_ASSERT(!keyIsWeak || !valueIsWeak || !keyHasStrongRefs || !value HasStrongRefs, ThisConfigurationWasDisallowedToAvoidUnexpectedLeaks);
2184 if ((valueIsWeak && !keyIsWeak) || (valueIsWeak && keyIsWeak && !valueHa sStrongRefs)) { 2184 if ((valueIsWeak && !keyIsWeak) || (valueIsWeak && keyIsWeak && !valueHa sStrongRefs)) {
2185 // Check value first. 2185 // Check value first.
2186 bool deadWeakObjectsFoundOnValueSide = WebCore::CollectionBackingTra ceTrait<ShouldBeTraced<typename Traits::ValueTraits>::value, Traits::ValueTraits ::weakHandlingFlag, strongify, Value, typename Traits::ValueTraits>::trace(visit or, self.value); 2186 bool deadWeakObjectsFoundOnValueSide = blink::CollectionBackingTrace Trait<ShouldBeTraced<typename Traits::ValueTraits>::value, Traits::ValueTraits:: weakHandlingFlag, strongify, Value, typename Traits::ValueTraits>::trace(visitor , self.value);
2187 if (deadWeakObjectsFoundOnValueSide) 2187 if (deadWeakObjectsFoundOnValueSide)
2188 return true; 2188 return true;
2189 return WebCore::CollectionBackingTraceTrait<ShouldBeTraced<typename Traits::KeyTraits>::value, Traits::KeyTraits::weakHandlingFlag, strongify, Key, typename Traits::KeyTraits>::trace(visitor, self.key); 2189 return blink::CollectionBackingTraceTrait<ShouldBeTraced<typename Tr aits::KeyTraits>::value, Traits::KeyTraits::weakHandlingFlag, strongify, Key, ty pename Traits::KeyTraits>::trace(visitor, self.key);
2190 } 2190 }
2191 // Check key first. 2191 // Check key first.
2192 bool deadWeakObjectsFoundOnKeySide = WebCore::CollectionBackingTraceTrai t<ShouldBeTraced<typename Traits::KeyTraits>::value, Traits::KeyTraits::weakHand lingFlag, strongify, Key, typename Traits::KeyTraits>::trace(visitor, self.key); 2192 bool deadWeakObjectsFoundOnKeySide = blink::CollectionBackingTraceTrait< ShouldBeTraced<typename Traits::KeyTraits>::value, Traits::KeyTraits::weakHandli ngFlag, strongify, Key, typename Traits::KeyTraits>::trace(visitor, self.key);
2193 if (deadWeakObjectsFoundOnKeySide) 2193 if (deadWeakObjectsFoundOnKeySide)
2194 return true; 2194 return true;
2195 return WebCore::CollectionBackingTraceTrait<ShouldBeTraced<typename Trai ts::ValueTraits>::value, Traits::ValueTraits::weakHandlingFlag, strongify, Value , typename Traits::ValueTraits>::trace(visitor, self.value); 2195 return blink::CollectionBackingTraceTrait<ShouldBeTraced<typename Traits ::ValueTraits>::value, Traits::ValueTraits::weakHandlingFlag, strongify, Value, typename Traits::ValueTraits>::trace(visitor, self.value);
2196 } 2196 }
2197 }; 2197 };
2198 2198
2199 // Nodes used by LinkedHashSet. Again we need two versions to disambiguate the 2199 // Nodes used by LinkedHashSet. Again we need two versions to disambiguate the
2200 // template. 2200 // template.
2201 template<ShouldWeakPointersBeMarkedStrongly strongify, typename Value, typename Traits> 2201 template<ShouldWeakPointersBeMarkedStrongly strongify, typename Value, typename Traits>
2202 struct TraceInCollectionTrait<NoWeakHandlingInCollections, strongify, LinkedHash SetNode<Value>, Traits> { 2202 struct TraceInCollectionTrait<NoWeakHandlingInCollections, strongify, LinkedHash SetNode<Value>, Traits> {
2203 static bool trace(WebCore::Visitor* visitor, LinkedHashSetNode<Value>& self) 2203 static bool trace(blink::Visitor* visitor, LinkedHashSetNode<Value>& self)
2204 { 2204 {
2205 ASSERT(ShouldBeTraced<Traits>::value); 2205 ASSERT(ShouldBeTraced<Traits>::value);
2206 WebCore::TraceTrait<Value>::trace(visitor, &self.m_value); 2206 blink::TraceTrait<Value>::trace(visitor, &self.m_value);
2207 return false; 2207 return false;
2208 } 2208 }
2209 }; 2209 };
2210 2210
2211 template<ShouldWeakPointersBeMarkedStrongly strongify, typename Value, typename Traits> 2211 template<ShouldWeakPointersBeMarkedStrongly strongify, typename Value, typename Traits>
2212 struct TraceInCollectionTrait<WeakHandlingInCollections, strongify, LinkedHashSe tNode<Value>, Traits> { 2212 struct TraceInCollectionTrait<WeakHandlingInCollections, strongify, LinkedHashSe tNode<Value>, Traits> {
2213 static bool trace(WebCore::Visitor* visitor, LinkedHashSetNode<Value>& self) 2213 static bool trace(blink::Visitor* visitor, LinkedHashSetNode<Value>& self)
2214 { 2214 {
2215 return TraceInCollectionTrait<WeakHandlingInCollections, strongify, Valu e, typename Traits::ValueTraits>::trace(visitor, self.m_value); 2215 return TraceInCollectionTrait<WeakHandlingInCollections, strongify, Valu e, typename Traits::ValueTraits>::trace(visitor, self.m_value);
2216 } 2216 }
2217 }; 2217 };
2218 2218
2219 // ListHashSetNode pointers (a ListHashSet is implemented as a hash table of the se pointers). 2219 // ListHashSetNode pointers (a ListHashSet is implemented as a hash table of the se pointers).
2220 template<ShouldWeakPointersBeMarkedStrongly strongify, typename Value, size_t in lineCapacity, typename Traits> 2220 template<ShouldWeakPointersBeMarkedStrongly strongify, typename Value, size_t in lineCapacity, typename Traits>
2221 struct TraceInCollectionTrait<NoWeakHandlingInCollections, strongify, ListHashSe tNode<Value, WebCore::HeapListHashSetAllocator<Value, inlineCapacity> >*, Traits > { 2221 struct TraceInCollectionTrait<NoWeakHandlingInCollections, strongify, ListHashSe tNode<Value, blink::HeapListHashSetAllocator<Value, inlineCapacity> >*, Traits> {
2222 typedef ListHashSetNode<Value, WebCore::HeapListHashSetAllocator<Value, inli neCapacity> > Node; 2222 typedef ListHashSetNode<Value, blink::HeapListHashSetAllocator<Value, inline Capacity> > Node;
2223 static bool trace(WebCore::Visitor* visitor, Node* node) 2223 static bool trace(blink::Visitor* visitor, Node* node)
2224 { 2224 {
2225 traceListHashSetValue(visitor, node->m_value); 2225 traceListHashSetValue(visitor, node->m_value);
2226 // Just mark the node without tracing because we already traced the 2226 // Just mark the node without tracing because we already traced the
2227 // contents, and there is no need to trace the next and prev fields 2227 // contents, and there is no need to trace the next and prev fields
2228 // since iterating over the hash table backing will find the whole 2228 // since iterating over the hash table backing will find the whole
2229 // chain. 2229 // chain.
2230 visitor->markNoTracing(node); 2230 visitor->markNoTracing(node);
2231 return false; 2231 return false;
2232 } 2232 }
2233 }; 2233 };
2234 2234
2235 } // namespace WTF 2235 } // namespace WTF
2236 2236
2237 namespace WebCore { 2237 namespace blink {
2238 2238
2239 // CollectionBackingTraceTrait. Do nothing for things in collections that don't 2239 // CollectionBackingTraceTrait. Do nothing for things in collections that don't
2240 // need tracing, or call TraceInCollectionTrait for those that do. 2240 // need tracing, or call TraceInCollectionTrait for those that do.
2241 2241
2242 // Specialization for things that don't need marking and have no weak pointers. We 2242 // Specialization for things that don't need marking and have no weak pointers. We
2243 // do nothing, even if WTF::WeakPointersActStrong. 2243 // do nothing, even if WTF::WeakPointersActStrong.
2244 template<WTF::ShouldWeakPointersBeMarkedStrongly strongify, typename T, typename Traits> 2244 template<WTF::ShouldWeakPointersBeMarkedStrongly strongify, typename T, typename Traits>
2245 struct CollectionBackingTraceTrait<false, WTF::NoWeakHandlingInCollections, stro ngify, T, Traits> { 2245 struct CollectionBackingTraceTrait<false, WTF::NoWeakHandlingInCollections, stro ngify, T, Traits> {
2246 static bool trace(Visitor*, T&) { return false; } 2246 static bool trace(Visitor*, T&) { return false; }
2247 }; 2247 };
(...skipping 127 matching lines...) Expand 10 before | Expand all | Expand 10 after
2375 }; 2375 };
2376 2376
2377 template<typename T> 2377 template<typename T>
2378 struct IfWeakMember<WeakMember<T> > { 2378 struct IfWeakMember<WeakMember<T> > {
2379 static bool isDead(Visitor* visitor, const WeakMember<T>& t) { return !visit or->isAlive(t.get()); } 2379 static bool isDead(Visitor* visitor, const WeakMember<T>& t) { return !visit or->isAlive(t.get()); }
2380 }; 2380 };
2381 2381
2382 } 2382 }
2383 2383
2384 #endif // Heap_h 2384 #endif // Heap_h
OLDNEW
« no previous file with comments | « Source/platform/heap/Handle.h ('k') | Source/platform/heap/Heap.cpp » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698