| OLD | NEW |
| 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 87 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 98 } | 98 } |
| 99 | 99 |
| 100 static bool equal(const ThreadMarker& a, const ThreadMarker& b) | 100 static bool equal(const ThreadMarker& a, const ThreadMarker& b) |
| 101 { | 101 { |
| 102 return a == b; | 102 return a == b; |
| 103 } | 103 } |
| 104 | 104 |
| 105 static const bool safeToCompareToEmptyOrDeleted = false; | 105 static const bool safeToCompareToEmptyOrDeleted = false; |
| 106 }; | 106 }; |
| 107 | 107 |
| 108 typedef std::pair<Member<IntWrapper>, WeakMember<IntWrapper> > StrongWeakPair; | 108 typedef std::pair<Member<IntWrapper>, WeakMember<IntWrapper>> StrongWeakPair; |
| 109 | 109 |
| 110 struct PairWithWeakHandling : public StrongWeakPair { | 110 struct PairWithWeakHandling : public StrongWeakPair { |
| 111 ALLOW_ONLY_INLINE_ALLOCATION(); | 111 ALLOW_ONLY_INLINE_ALLOCATION(); |
| 112 | 112 |
| 113 public: | 113 public: |
| 114 // Regular constructor. | 114 // Regular constructor. |
| 115 PairWithWeakHandling(IntWrapper* one, IntWrapper* two) | 115 PairWithWeakHandling(IntWrapper* one, IntWrapper* two) |
| 116 : StrongWeakPair(one, two) | 116 : StrongWeakPair(one, two) |
| 117 { | 117 { |
| 118 ASSERT(one); // We use null first field to indicate empty slots in the h
ash table. | 118 ASSERT(one); // We use null first field to indicate empty slots in the h
ash table. |
| (...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 163 static const bool emptyValueIsZero = true; | 163 static const bool emptyValueIsZero = true; |
| 164 static void constructDeletedValue(blink::ThreadMarker& slot, bool) { new (No
tNull, &slot) blink::ThreadMarker(HashTableDeletedValue); } | 164 static void constructDeletedValue(blink::ThreadMarker& slot, bool) { new (No
tNull, &slot) blink::ThreadMarker(HashTableDeletedValue); } |
| 165 static bool isDeletedValue(const blink::ThreadMarker& slot) { return slot.is
HashTableDeletedValue(); } | 165 static bool isDeletedValue(const blink::ThreadMarker& slot) { return slot.is
HashTableDeletedValue(); } |
| 166 }; | 166 }; |
| 167 | 167 |
| 168 // The hash algorithm for our custom pair class is just the standard double | 168 // The hash algorithm for our custom pair class is just the standard double |
| 169 // hash for pairs. Note that this means you can't mutate either of the parts of | 169 // hash for pairs. Note that this means you can't mutate either of the parts of |
| 170 // the pair while they are in the hash table, as that would change their hash | 170 // the pair while they are in the hash table, as that would change their hash |
| 171 // code and thus their preferred placement in the table. | 171 // code and thus their preferred placement in the table. |
| 172 template<> struct DefaultHash<blink::PairWithWeakHandling> { | 172 template<> struct DefaultHash<blink::PairWithWeakHandling> { |
| 173 typedef PairHash<blink::Member<blink::IntWrapper>, blink::WeakMember<blink::
IntWrapper> > Hash; | 173 typedef PairHash<blink::Member<blink::IntWrapper>, blink::WeakMember<blink::
IntWrapper>> Hash; |
| 174 }; | 174 }; |
| 175 | 175 |
| 176 // Custom traits for the pair. These are weakness handling traits, which means | 176 // Custom traits for the pair. These are weakness handling traits, which means |
| 177 // PairWithWeakHandling must implement the traceInCollection method. | 177 // PairWithWeakHandling must implement the traceInCollection method. |
| 178 // In addition, these traits are concerned with the two magic values for the | 178 // In addition, these traits are concerned with the two magic values for the |
| 179 // object, that represent empty and deleted slots in the hash table. The | 179 // object, that represent empty and deleted slots in the hash table. The |
| 180 // SimpleClassHashTraits allow empty slots in the table to be initialzed with | 180 // SimpleClassHashTraits allow empty slots in the table to be initialzed with |
| 181 // memset to zero, and we use -1 in the first part of the pair to represent | 181 // memset to zero, and we use -1 in the first part of the pair to represent |
| 182 // deleted slots. | 182 // deleted slots. |
| 183 template<> struct HashTraits<blink::PairWithWeakHandling> : blink::WeakHandlingH
ashTraits<blink::PairWithWeakHandling> { | 183 template<> struct HashTraits<blink::PairWithWeakHandling> : blink::WeakHandlingH
ashTraits<blink::PairWithWeakHandling> { |
| (...skipping 326 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 510 | 510 |
| 511 private: | 511 private: |
| 512 virtual void runThread() override | 512 virtual void runThread() override |
| 513 { | 513 { |
| 514 ThreadState::attach(); | 514 ThreadState::attach(); |
| 515 | 515 |
| 516 int gcCount = 0; | 516 int gcCount = 0; |
| 517 while (!done()) { | 517 while (!done()) { |
| 518 ThreadState::current()->safePoint(ThreadState::NoHeapPointersOnStack
); | 518 ThreadState::current()->safePoint(ThreadState::NoHeapPointersOnStack
); |
| 519 { | 519 { |
| 520 Persistent<HeapHashMap<ThreadMarker, WeakMember<IntWrapper> > >
weakMap = new HeapHashMap<ThreadMarker, WeakMember<IntWrapper> >; | 520 Persistent<HeapHashMap<ThreadMarker, WeakMember<IntWrapper>> > w
eakMap = new HeapHashMap<ThreadMarker, WeakMember<IntWrapper>>; |
| 521 PersistentHeapHashMap<ThreadMarker, WeakMember<IntWrapper> > wea
kMap2; | 521 PersistentHeapHashMap<ThreadMarker, WeakMember<IntWrapper>> weak
Map2; |
| 522 | 522 |
| 523 for (int i = 0; i < numberOfAllocations; i++) { | 523 for (int i = 0; i < numberOfAllocations; i++) { |
| 524 weakMap->add(static_cast<unsigned>(i), IntWrapper::create(0)
); | 524 weakMap->add(static_cast<unsigned>(i), IntWrapper::create(0)
); |
| 525 weakMap2.add(static_cast<unsigned>(i), IntWrapper::create(0)
); | 525 weakMap2.add(static_cast<unsigned>(i), IntWrapper::create(0)
); |
| 526 ThreadState::SafePointScope scope(ThreadState::NoHeapPointer
sOnStack); | 526 ThreadState::SafePointScope scope(ThreadState::NoHeapPointer
sOnStack); |
| 527 Platform::current()->yieldCurrentThread(); | 527 Platform::current()->yieldCurrentThread(); |
| 528 } | 528 } |
| 529 | 529 |
| 530 if (gcCount < gcPerThread) { | 530 if (gcCount < gcPerThread) { |
| 531 Heap::collectGarbage(ThreadState::NoHeapPointersOnStack); | 531 Heap::collectGarbage(ThreadState::NoHeapPointersOnStack); |
| (...skipping 615 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1147 : m_wasDestructed(false) | 1147 : m_wasDestructed(false) |
| 1148 { | 1148 { |
| 1149 ThreadState::current()->registerPreFinalizer(*this); | 1149 ThreadState::current()->registerPreFinalizer(*this); |
| 1150 } | 1150 } |
| 1151 | 1151 |
| 1152 bool m_wasDestructed; | 1152 bool m_wasDestructed; |
| 1153 }; | 1153 }; |
| 1154 | 1154 |
| 1155 bool ObservableWithPreFinalizer::s_disposeWasCalled = false; | 1155 bool ObservableWithPreFinalizer::s_disposeWasCalled = false; |
| 1156 | 1156 |
| 1157 template <typename T> class FinalizationObserver : public GarbageCollected<Final
izationObserver<T> > { | 1157 template <typename T> class FinalizationObserver : public GarbageCollected<Final
izationObserver<T>> { |
| 1158 public: | 1158 public: |
| 1159 static FinalizationObserver* create(T* data) { return new FinalizationObserv
er(data); } | 1159 static FinalizationObserver* create(T* data) { return new FinalizationObserv
er(data); } |
| 1160 bool didCallWillFinalize() const { return m_didCallWillFinalize; } | 1160 bool didCallWillFinalize() const { return m_didCallWillFinalize; } |
| 1161 | 1161 |
| 1162 void trace(Visitor* visitor) | 1162 void trace(Visitor* visitor) |
| 1163 { | 1163 { |
| 1164 visitor->registerWeakMembers(this, zapWeakMembers); | 1164 visitor->registerWeakMembers(this, zapWeakMembers); |
| 1165 } | 1165 } |
| 1166 | 1166 |
| 1167 private: | 1167 private: |
| (...skipping 12 matching lines...) Expand all Loading... |
| 1180 o->m_didCallWillFinalize = true; | 1180 o->m_didCallWillFinalize = true; |
| 1181 } | 1181 } |
| 1182 } | 1182 } |
| 1183 | 1183 |
| 1184 WeakMember<T> m_data; | 1184 WeakMember<T> m_data; |
| 1185 bool m_didCallWillFinalize; | 1185 bool m_didCallWillFinalize; |
| 1186 }; | 1186 }; |
| 1187 | 1187 |
| 1188 class FinalizationObserverWithHashMap { | 1188 class FinalizationObserverWithHashMap { |
| 1189 public: | 1189 public: |
| 1190 typedef HeapHashMap<WeakMember<Observable>, OwnPtr<FinalizationObserverWithH
ashMap> > ObserverMap; | 1190 typedef HeapHashMap<WeakMember<Observable>, OwnPtr<FinalizationObserverWithH
ashMap>> ObserverMap; |
| 1191 | 1191 |
| 1192 explicit FinalizationObserverWithHashMap(Observable& target) : m_target(targ
et) { } | 1192 explicit FinalizationObserverWithHashMap(Observable& target) : m_target(targ
et) { } |
| 1193 ~FinalizationObserverWithHashMap() | 1193 ~FinalizationObserverWithHashMap() |
| 1194 { | 1194 { |
| 1195 m_target.willFinalize(); | 1195 m_target.willFinalize(); |
| 1196 s_didCallWillFinalize = true; | 1196 s_didCallWillFinalize = true; |
| 1197 } | 1197 } |
| 1198 | 1198 |
| 1199 static ObserverMap& observe(Observable& target) | 1199 static ObserverMap& observe(Observable& target) |
| 1200 { | 1200 { |
| (...skipping 759 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1960 TEST(HeapTest, HashMapOfMembers) | 1960 TEST(HeapTest, HashMapOfMembers) |
| 1961 { | 1961 { |
| 1962 IntWrapper::s_destructorCalls = 0; | 1962 IntWrapper::s_destructorCalls = 0; |
| 1963 | 1963 |
| 1964 clearOutOldGarbage(); | 1964 clearOutOldGarbage(); |
| 1965 size_t initialObjectPayloadSize = Heap::objectPayloadSizeForTesting(); | 1965 size_t initialObjectPayloadSize = Heap::objectPayloadSizeForTesting(); |
| 1966 { | 1966 { |
| 1967 typedef HeapHashMap< | 1967 typedef HeapHashMap< |
| 1968 Member<IntWrapper>, | 1968 Member<IntWrapper>, |
| 1969 Member<IntWrapper>, | 1969 Member<IntWrapper>, |
| 1970 DefaultHash<Member<IntWrapper> >::Hash, | 1970 DefaultHash<Member<IntWrapper>>::Hash, |
| 1971 HashTraits<Member<IntWrapper> >, | 1971 HashTraits<Member<IntWrapper>>, |
| 1972 HashTraits<Member<IntWrapper> > > HeapObjectIdentityMap; | 1972 HashTraits<Member<IntWrapper>> > HeapObjectIdentityMap; |
| 1973 | 1973 |
| 1974 Persistent<HeapObjectIdentityMap> map = new HeapObjectIdentityMap(); | 1974 Persistent<HeapObjectIdentityMap> map = new HeapObjectIdentityMap(); |
| 1975 | 1975 |
| 1976 map->clear(); | 1976 map->clear(); |
| 1977 size_t afterSetWasCreated = Heap::objectPayloadSizeForTesting(); | 1977 size_t afterSetWasCreated = Heap::objectPayloadSizeForTesting(); |
| 1978 EXPECT_TRUE(afterSetWasCreated > initialObjectPayloadSize); | 1978 EXPECT_TRUE(afterSetWasCreated > initialObjectPayloadSize); |
| 1979 | 1979 |
| 1980 Heap::collectGarbage(ThreadState::NoHeapPointersOnStack); | 1980 Heap::collectGarbage(ThreadState::NoHeapPointersOnStack); |
| 1981 size_t afterGC = Heap::objectPayloadSizeForTesting(); | 1981 size_t afterGC = Heap::objectPayloadSizeForTesting(); |
| 1982 EXPECT_EQ(afterGC, afterSetWasCreated); | 1982 EXPECT_EQ(afterGC, afterSetWasCreated); |
| (...skipping 128 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2111 } | 2111 } |
| 2112 clearOutOldGarbage(); | 2112 clearOutOldGarbage(); |
| 2113 EXPECT_TRUE(initialObjectPayloadSize == Heap::objectPayloadSizeForTesting())
; | 2113 EXPECT_TRUE(initialObjectPayloadSize == Heap::objectPayloadSizeForTesting())
; |
| 2114 EXPECT_TRUE(initialAllocatedSpace == Heap::allocatedSpace()); | 2114 EXPECT_TRUE(initialAllocatedSpace == Heap::allocatedSpace()); |
| 2115 EXPECT_EQ(11, IntWrapper::s_destructorCalls); | 2115 EXPECT_EQ(11, IntWrapper::s_destructorCalls); |
| 2116 EXPECT_EQ(11, LargeHeapObject::s_destructorCalls); | 2116 EXPECT_EQ(11, LargeHeapObject::s_destructorCalls); |
| 2117 Heap::collectGarbage(ThreadState::NoHeapPointersOnStack); | 2117 Heap::collectGarbage(ThreadState::NoHeapPointersOnStack); |
| 2118 } | 2118 } |
| 2119 | 2119 |
| 2120 typedef std::pair<Member<IntWrapper>, int> PairWrappedUnwrapped; | 2120 typedef std::pair<Member<IntWrapper>, int> PairWrappedUnwrapped; |
| 2121 typedef std::pair<int, Member<IntWrapper> > PairUnwrappedWrapped; | 2121 typedef std::pair<int, Member<IntWrapper>> PairUnwrappedWrapped; |
| 2122 typedef std::pair<WeakMember<IntWrapper>, Member<IntWrapper> > PairWeakStrong; | 2122 typedef std::pair<WeakMember<IntWrapper>, Member<IntWrapper>> PairWeakStrong; |
| 2123 typedef std::pair<Member<IntWrapper>, WeakMember<IntWrapper> > PairStrongWeak; | 2123 typedef std::pair<Member<IntWrapper>, WeakMember<IntWrapper>> PairStrongWeak; |
| 2124 typedef std::pair<WeakMember<IntWrapper>, int> PairWeakUnwrapped; | 2124 typedef std::pair<WeakMember<IntWrapper>, int> PairWeakUnwrapped; |
| 2125 typedef std::pair<int, WeakMember<IntWrapper> > PairUnwrappedWeak; | 2125 typedef std::pair<int, WeakMember<IntWrapper>> PairUnwrappedWeak; |
| 2126 | 2126 |
| 2127 class Container : public GarbageCollected<Container> { | 2127 class Container : public GarbageCollected<Container> { |
| 2128 public: | 2128 public: |
| 2129 static Container* create() { return new Container(); } | 2129 static Container* create() { return new Container(); } |
| 2130 HeapHashMap<Member<IntWrapper>, Member<IntWrapper> > map; | 2130 HeapHashMap<Member<IntWrapper>, Member<IntWrapper>> map; |
| 2131 HeapHashSet<Member<IntWrapper> > set; | 2131 HeapHashSet<Member<IntWrapper>> set; |
| 2132 HeapHashSet<Member<IntWrapper> > set2; | 2132 HeapHashSet<Member<IntWrapper>> set2; |
| 2133 HeapHashCountedSet<Member<IntWrapper> > set3; | 2133 HeapHashCountedSet<Member<IntWrapper>> set3; |
| 2134 HeapVector<Member<IntWrapper>, 2> vector; | 2134 HeapVector<Member<IntWrapper>, 2> vector; |
| 2135 HeapVector<PairWrappedUnwrapped, 2> vectorWU; | 2135 HeapVector<PairWrappedUnwrapped, 2> vectorWU; |
| 2136 HeapVector<PairUnwrappedWrapped, 2> vectorUW; | 2136 HeapVector<PairUnwrappedWrapped, 2> vectorUW; |
| 2137 HeapDeque<Member<IntWrapper>, 0> deque; | 2137 HeapDeque<Member<IntWrapper>, 0> deque; |
| 2138 HeapDeque<PairWrappedUnwrapped, 0> dequeWU; | 2138 HeapDeque<PairWrappedUnwrapped, 0> dequeWU; |
| 2139 HeapDeque<PairUnwrappedWrapped, 0> dequeUW; | 2139 HeapDeque<PairUnwrappedWrapped, 0> dequeUW; |
| 2140 void trace(Visitor* visitor) | 2140 void trace(Visitor* visitor) |
| 2141 { | 2141 { |
| 2142 visitor->trace(map); | 2142 visitor->trace(map); |
| 2143 visitor->trace(set); | 2143 visitor->trace(set); |
| (...skipping 63 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2207 | 2207 |
| 2208 class B : public NoBaseWillBeGarbageCollected<B>, public A { | 2208 class B : public NoBaseWillBeGarbageCollected<B>, public A { |
| 2209 WILL_BE_USING_GARBAGE_COLLECTED_MIXIN(B); | 2209 WILL_BE_USING_GARBAGE_COLLECTED_MIXIN(B); |
| 2210 public: | 2210 public: |
| 2211 void trace(Visitor*) { } | 2211 void trace(Visitor*) { } |
| 2212 }; | 2212 }; |
| 2213 | 2213 |
| 2214 TEST(HeapTest, HeapVectorFilledWithValue) | 2214 TEST(HeapTest, HeapVectorFilledWithValue) |
| 2215 { | 2215 { |
| 2216 IntWrapper* val = IntWrapper::create(1); | 2216 IntWrapper* val = IntWrapper::create(1); |
| 2217 HeapVector<Member<IntWrapper> > vector(10, val); | 2217 HeapVector<Member<IntWrapper>> vector(10, val); |
| 2218 EXPECT_EQ(10u, vector.size()); | 2218 EXPECT_EQ(10u, vector.size()); |
| 2219 for (size_t i = 0; i < vector.size(); i++) | 2219 for (size_t i = 0; i < vector.size(); i++) |
| 2220 EXPECT_EQ(val, vector[i]); | 2220 EXPECT_EQ(val, vector[i]); |
| 2221 } | 2221 } |
| 2222 | 2222 |
| 2223 TEST(HeapTest, HeapVectorWithInlineCapacity) | 2223 TEST(HeapTest, HeapVectorWithInlineCapacity) |
| 2224 { | 2224 { |
| 2225 IntWrapper* one = IntWrapper::create(1); | 2225 IntWrapper* one = IntWrapper::create(1); |
| 2226 IntWrapper* two = IntWrapper::create(2); | 2226 IntWrapper* two = IntWrapper::create(2); |
| 2227 IntWrapper* three = IntWrapper::create(3); | 2227 IntWrapper* three = IntWrapper::create(3); |
| (...skipping 113 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2341 if (*it == u) | 2341 if (*it == u) |
| 2342 return true; | 2342 return true; |
| 2343 } | 2343 } |
| 2344 return false; | 2344 return false; |
| 2345 } | 2345 } |
| 2346 | 2346 |
| 2347 TEST(HeapTest, HeapCollectionTypes) | 2347 TEST(HeapTest, HeapCollectionTypes) |
| 2348 { | 2348 { |
| 2349 IntWrapper::s_destructorCalls = 0; | 2349 IntWrapper::s_destructorCalls = 0; |
| 2350 | 2350 |
| 2351 typedef HeapHashMap<Member<IntWrapper>, Member<IntWrapper> > MemberMember; | 2351 typedef HeapHashMap<Member<IntWrapper>, Member<IntWrapper>> MemberMember; |
| 2352 typedef HeapHashMap<Member<IntWrapper>, int> MemberPrimitive; | 2352 typedef HeapHashMap<Member<IntWrapper>, int> MemberPrimitive; |
| 2353 typedef HeapHashMap<int, Member<IntWrapper> > PrimitiveMember; | 2353 typedef HeapHashMap<int, Member<IntWrapper>> PrimitiveMember; |
| 2354 | 2354 |
| 2355 typedef HeapHashSet<Member<IntWrapper> > MemberSet; | 2355 typedef HeapHashSet<Member<IntWrapper>> MemberSet; |
| 2356 typedef HeapHashCountedSet<Member<IntWrapper> > MemberCountedSet; | 2356 typedef HeapHashCountedSet<Member<IntWrapper>> MemberCountedSet; |
| 2357 | 2357 |
| 2358 typedef HeapVector<Member<IntWrapper>, 2> MemberVector; | 2358 typedef HeapVector<Member<IntWrapper>, 2> MemberVector; |
| 2359 typedef HeapDeque<Member<IntWrapper>, 0> MemberDeque; | 2359 typedef HeapDeque<Member<IntWrapper>, 0> MemberDeque; |
| 2360 | 2360 |
| 2361 typedef HeapVector<PairWrappedUnwrapped, 2> VectorWU; | 2361 typedef HeapVector<PairWrappedUnwrapped, 2> VectorWU; |
| 2362 typedef HeapVector<PairUnwrappedWrapped, 2> VectorUW; | 2362 typedef HeapVector<PairUnwrappedWrapped, 2> VectorUW; |
| 2363 typedef HeapDeque<PairWrappedUnwrapped, 0> DequeWU; | 2363 typedef HeapDeque<PairWrappedUnwrapped, 0> DequeWU; |
| 2364 typedef HeapDeque<PairUnwrappedWrapped, 0> DequeUW; | 2364 typedef HeapDeque<PairUnwrappedWrapped, 0> DequeUW; |
| 2365 | 2365 |
| 2366 Persistent<MemberMember> memberMember = new MemberMember(); | 2366 Persistent<MemberMember> memberMember = new MemberMember(); |
| (...skipping 297 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2664 ++it; | 2664 ++it; |
| 2665 } | 2665 } |
| 2666 EXPECT_EQ(expected, found); | 2666 EXPECT_EQ(expected, found); |
| 2667 } | 2667 } |
| 2668 | 2668 |
| 2669 TEST(HeapTest, HeapWeakCollectionSimple) | 2669 TEST(HeapTest, HeapWeakCollectionSimple) |
| 2670 { | 2670 { |
| 2671 clearOutOldGarbage(); | 2671 clearOutOldGarbage(); |
| 2672 IntWrapper::s_destructorCalls = 0; | 2672 IntWrapper::s_destructorCalls = 0; |
| 2673 | 2673 |
| 2674 PersistentHeapVector<Member<IntWrapper> > keepNumbersAlive; | 2674 PersistentHeapVector<Member<IntWrapper>> keepNumbersAlive; |
| 2675 | 2675 |
| 2676 typedef HeapHashMap<WeakMember<IntWrapper>, Member<IntWrapper> > WeakStrong; | 2676 typedef HeapHashMap<WeakMember<IntWrapper>, Member<IntWrapper>> WeakStrong; |
| 2677 typedef HeapHashMap<Member<IntWrapper>, WeakMember<IntWrapper> > StrongWeak; | 2677 typedef HeapHashMap<Member<IntWrapper>, WeakMember<IntWrapper>> StrongWeak; |
| 2678 typedef HeapHashMap<WeakMember<IntWrapper>, WeakMember<IntWrapper> > WeakWea
k; | 2678 typedef HeapHashMap<WeakMember<IntWrapper>, WeakMember<IntWrapper>> WeakWeak
; |
| 2679 typedef HeapHashSet<WeakMember<IntWrapper> > WeakSet; | 2679 typedef HeapHashSet<WeakMember<IntWrapper>> WeakSet; |
| 2680 typedef HeapHashCountedSet<WeakMember<IntWrapper> > WeakCountedSet; | 2680 typedef HeapHashCountedSet<WeakMember<IntWrapper>> WeakCountedSet; |
| 2681 | 2681 |
| 2682 Persistent<WeakStrong> weakStrong = new WeakStrong(); | 2682 Persistent<WeakStrong> weakStrong = new WeakStrong(); |
| 2683 Persistent<StrongWeak> strongWeak = new StrongWeak(); | 2683 Persistent<StrongWeak> strongWeak = new StrongWeak(); |
| 2684 Persistent<WeakWeak> weakWeak = new WeakWeak(); | 2684 Persistent<WeakWeak> weakWeak = new WeakWeak(); |
| 2685 Persistent<WeakSet> weakSet = new WeakSet(); | 2685 Persistent<WeakSet> weakSet = new WeakSet(); |
| 2686 Persistent<WeakCountedSet> weakCountedSet = new WeakCountedSet(); | 2686 Persistent<WeakCountedSet> weakCountedSet = new WeakCountedSet(); |
| 2687 | 2687 |
| 2688 Persistent<IntWrapper> two = IntWrapper::create(2); | 2688 Persistent<IntWrapper> two = IntWrapper::create(2); |
| 2689 | 2689 |
| 2690 keepNumbersAlive.append(IntWrapper::create(103)); | 2690 keepNumbersAlive.append(IntWrapper::create(103)); |
| (...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2725 EXPECT_EQ(2u, weakSet->size()); | 2725 EXPECT_EQ(2u, weakSet->size()); |
| 2726 EXPECT_EQ(2u, weakCountedSet->size()); | 2726 EXPECT_EQ(2u, weakCountedSet->size()); |
| 2727 } | 2727 } |
| 2728 | 2728 |
| 2729 template<typename Set> | 2729 template<typename Set> |
| 2730 void orderedSetHelper(bool strong) | 2730 void orderedSetHelper(bool strong) |
| 2731 { | 2731 { |
| 2732 clearOutOldGarbage(); | 2732 clearOutOldGarbage(); |
| 2733 IntWrapper::s_destructorCalls = 0; | 2733 IntWrapper::s_destructorCalls = 0; |
| 2734 | 2734 |
| 2735 PersistentHeapVector<Member<IntWrapper> > keepNumbersAlive; | 2735 PersistentHeapVector<Member<IntWrapper>> keepNumbersAlive; |
| 2736 | 2736 |
| 2737 Persistent<Set> set1 = new Set(); | 2737 Persistent<Set> set1 = new Set(); |
| 2738 Persistent<Set> set2 = new Set(); | 2738 Persistent<Set> set2 = new Set(); |
| 2739 | 2739 |
| 2740 const Set& constSet = *set1.get(); | 2740 const Set& constSet = *set1.get(); |
| 2741 | 2741 |
| 2742 keepNumbersAlive.append(IntWrapper::create(2)); | 2742 keepNumbersAlive.append(IntWrapper::create(2)); |
| 2743 keepNumbersAlive.append(IntWrapper::create(103)); | 2743 keepNumbersAlive.append(IntWrapper::create(103)); |
| 2744 keepNumbersAlive.append(IntWrapper::create(10)); | 2744 keepNumbersAlive.append(IntWrapper::create(10)); |
| 2745 | 2745 |
| (...skipping 86 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2832 EXPECT_EQ(103, (*i2)->value()); | 2832 EXPECT_EQ(103, (*i2)->value()); |
| 2833 ++i2; | 2833 ++i2; |
| 2834 EXPECT_NE(set1->end(), i2); | 2834 EXPECT_NE(set1->end(), i2); |
| 2835 EXPECT_EQ(10, (*i2)->value()); | 2835 EXPECT_EQ(10, (*i2)->value()); |
| 2836 ++i2; | 2836 ++i2; |
| 2837 EXPECT_EQ(set1->end(), i2); | 2837 EXPECT_EQ(set1->end(), i2); |
| 2838 } | 2838 } |
| 2839 | 2839 |
| 2840 TEST(HeapTest, HeapWeakLinkedHashSet) | 2840 TEST(HeapTest, HeapWeakLinkedHashSet) |
| 2841 { | 2841 { |
| 2842 orderedSetHelper<HeapLinkedHashSet<Member<IntWrapper> > >(true); | 2842 orderedSetHelper<HeapLinkedHashSet<Member<IntWrapper>> >(true); |
| 2843 orderedSetHelper<HeapLinkedHashSet<WeakMember<IntWrapper> > >(false); | 2843 orderedSetHelper<HeapLinkedHashSet<WeakMember<IntWrapper>> >(false); |
| 2844 orderedSetHelper<HeapListHashSet<Member<IntWrapper> > >(true); | 2844 orderedSetHelper<HeapListHashSet<Member<IntWrapper>> >(true); |
| 2845 } | 2845 } |
| 2846 | 2846 |
| 2847 class ThingWithDestructor { | 2847 class ThingWithDestructor { |
| 2848 public: | 2848 public: |
| 2849 ThingWithDestructor() | 2849 ThingWithDestructor() |
| 2850 : m_x(emptyValue) | 2850 : m_x(emptyValue) |
| 2851 { | 2851 { |
| 2852 s_liveThingsWithDestructor++; | 2852 s_liveThingsWithDestructor++; |
| 2853 } | 2853 } |
| 2854 | 2854 |
| (...skipping 29 matching lines...) Expand all Loading... |
| 2884 | 2884 |
| 2885 struct ThingWithDestructorTraits : public HashTraits<ThingWithDestructor> { | 2885 struct ThingWithDestructorTraits : public HashTraits<ThingWithDestructor> { |
| 2886 static const bool needsDestruction = true; | 2886 static const bool needsDestruction = true; |
| 2887 }; | 2887 }; |
| 2888 | 2888 |
| 2889 static void heapMapDestructorHelper(bool clearMaps) | 2889 static void heapMapDestructorHelper(bool clearMaps) |
| 2890 { | 2890 { |
| 2891 clearOutOldGarbage(); | 2891 clearOutOldGarbage(); |
| 2892 ThingWithDestructor::s_liveThingsWithDestructor = 0; | 2892 ThingWithDestructor::s_liveThingsWithDestructor = 0; |
| 2893 | 2893 |
| 2894 typedef HeapHashMap<WeakMember<IntWrapper>, Member<RefCountedAndGarbageColle
cted> > RefMap; | 2894 typedef HeapHashMap<WeakMember<IntWrapper>, Member<RefCountedAndGarbageColle
cted>> RefMap; |
| 2895 | 2895 |
| 2896 typedef HeapHashMap< | 2896 typedef HeapHashMap< |
| 2897 WeakMember<IntWrapper>, | 2897 WeakMember<IntWrapper>, |
| 2898 ThingWithDestructor, | 2898 ThingWithDestructor, |
| 2899 DefaultHash<WeakMember<IntWrapper> >::Hash, | 2899 DefaultHash<WeakMember<IntWrapper>>::Hash, |
| 2900 HashTraits<WeakMember<IntWrapper> >, | 2900 HashTraits<WeakMember<IntWrapper>>, |
| 2901 ThingWithDestructorTraits> Map; | 2901 ThingWithDestructorTraits> Map; |
| 2902 | 2902 |
| 2903 Persistent<Map> map(new Map()); | 2903 Persistent<Map> map(new Map()); |
| 2904 Persistent<RefMap> refMap(new RefMap()); | 2904 Persistent<RefMap> refMap(new RefMap()); |
| 2905 | 2905 |
| 2906 Persistent<IntWrapper> luck(IntWrapper::create(103)); | 2906 Persistent<IntWrapper> luck(IntWrapper::create(103)); |
| 2907 | 2907 |
| 2908 int baseLine, refBaseLine; | 2908 int baseLine, refBaseLine; |
| 2909 | 2909 |
| 2910 { | 2910 { |
| (...skipping 141 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3052 EXPECT_TRUE(strongWeak->contains(PairStrongWeak(&*two, &*two))); | 3052 EXPECT_TRUE(strongWeak->contains(PairStrongWeak(&*two, &*two))); |
| 3053 EXPECT_TRUE(weakUnwrapped->contains(PairWeakUnwrapped(&*two, 2))); | 3053 EXPECT_TRUE(weakUnwrapped->contains(PairWeakUnwrapped(&*two, 2))); |
| 3054 EXPECT_TRUE(unwrappedWeak->contains(PairUnwrappedWeak(2, &*two))); | 3054 EXPECT_TRUE(unwrappedWeak->contains(PairUnwrappedWeak(2, &*two))); |
| 3055 } | 3055 } |
| 3056 | 3056 |
| 3057 template<typename WSSet, typename SWSet, typename WUSet, typename UWSet> | 3057 template<typename WSSet, typename SWSet, typename WUSet, typename UWSet> |
| 3058 void weakPairsHelper() | 3058 void weakPairsHelper() |
| 3059 { | 3059 { |
| 3060 IntWrapper::s_destructorCalls = 0; | 3060 IntWrapper::s_destructorCalls = 0; |
| 3061 | 3061 |
| 3062 PersistentHeapVector<Member<IntWrapper> > keepNumbersAlive; | 3062 PersistentHeapVector<Member<IntWrapper>> keepNumbersAlive; |
| 3063 | 3063 |
| 3064 Persistent<WSSet> weakStrong = new WSSet(); | 3064 Persistent<WSSet> weakStrong = new WSSet(); |
| 3065 Persistent<SWSet> strongWeak = new SWSet(); | 3065 Persistent<SWSet> strongWeak = new SWSet(); |
| 3066 Persistent<WUSet> weakUnwrapped = new WUSet(); | 3066 Persistent<WUSet> weakUnwrapped = new WUSet(); |
| 3067 Persistent<UWSet> unwrappedWeak = new UWSet(); | 3067 Persistent<UWSet> unwrappedWeak = new UWSet(); |
| 3068 | 3068 |
| 3069 Persistent<IntWrapper> two = IntWrapper::create(2); | 3069 Persistent<IntWrapper> two = IntWrapper::create(2); |
| 3070 | 3070 |
| 3071 weakStrong->add(PairWeakStrong(IntWrapper::create(1), &*two)); | 3071 weakStrong->add(PairWeakStrong(IntWrapper::create(1), &*two)); |
| 3072 weakStrong->add(PairWeakStrong(&*two, &*two)); | 3072 weakStrong->add(PairWeakStrong(&*two, &*two)); |
| (...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3107 typedef HeapLinkedHashSet<PairStrongWeak> StrongWeakSet; | 3107 typedef HeapLinkedHashSet<PairStrongWeak> StrongWeakSet; |
| 3108 typedef HeapLinkedHashSet<PairUnwrappedWeak> UnwrappedWeakSet; | 3108 typedef HeapLinkedHashSet<PairUnwrappedWeak> UnwrappedWeakSet; |
| 3109 weakPairsHelper<WeakStrongSet, StrongWeakSet, WeakUnwrappedSet, Unwrappe
dWeakSet>(); | 3109 weakPairsHelper<WeakStrongSet, StrongWeakSet, WeakUnwrappedSet, Unwrappe
dWeakSet>(); |
| 3110 } | 3110 } |
| 3111 } | 3111 } |
| 3112 | 3112 |
| 3113 TEST(HeapTest, HeapWeakCollectionTypes) | 3113 TEST(HeapTest, HeapWeakCollectionTypes) |
| 3114 { | 3114 { |
| 3115 IntWrapper::s_destructorCalls = 0; | 3115 IntWrapper::s_destructorCalls = 0; |
| 3116 | 3116 |
| 3117 typedef HeapHashMap<WeakMember<IntWrapper>, Member<IntWrapper> > WeakStrong; | 3117 typedef HeapHashMap<WeakMember<IntWrapper>, Member<IntWrapper>> WeakStrong; |
| 3118 typedef HeapHashMap<Member<IntWrapper>, WeakMember<IntWrapper> > StrongWeak; | 3118 typedef HeapHashMap<Member<IntWrapper>, WeakMember<IntWrapper>> StrongWeak; |
| 3119 typedef HeapHashMap<WeakMember<IntWrapper>, WeakMember<IntWrapper> > WeakWea
k; | 3119 typedef HeapHashMap<WeakMember<IntWrapper>, WeakMember<IntWrapper>> WeakWeak
; |
| 3120 typedef HeapHashSet<WeakMember<IntWrapper> > WeakSet; | 3120 typedef HeapHashSet<WeakMember<IntWrapper>> WeakSet; |
| 3121 typedef HeapLinkedHashSet<WeakMember<IntWrapper> > WeakOrderedSet; | 3121 typedef HeapLinkedHashSet<WeakMember<IntWrapper>> WeakOrderedSet; |
| 3122 | 3122 |
| 3123 clearOutOldGarbage(); | 3123 clearOutOldGarbage(); |
| 3124 | 3124 |
| 3125 const int weakStrongIndex = 0; | 3125 const int weakStrongIndex = 0; |
| 3126 const int strongWeakIndex = 1; | 3126 const int strongWeakIndex = 1; |
| 3127 const int weakWeakIndex = 2; | 3127 const int weakWeakIndex = 2; |
| 3128 const int numberOfMapIndices = 3; | 3128 const int numberOfMapIndices = 3; |
| 3129 const int weakSetIndex = 3; | 3129 const int weakSetIndex = 3; |
| 3130 const int weakOrderedSetIndex = 4; | 3130 const int weakOrderedSetIndex = 4; |
| 3131 const int numberOfCollections = 5; | 3131 const int numberOfCollections = 5; |
| (...skipping 11 matching lines...) Expand all Loading... |
| 3143 | 3143 |
| 3144 unsigned added = addAfterwards ? 100 : 0; | 3144 unsigned added = addAfterwards ? 100 : 0; |
| 3145 | 3145 |
| 3146 Persistent<WeakStrong> weakStrong = new WeakStrong(); | 3146 Persistent<WeakStrong> weakStrong = new WeakStrong(); |
| 3147 Persistent<StrongWeak> strongWeak = new StrongWeak(); | 3147 Persistent<StrongWeak> strongWeak = new StrongWeak(); |
| 3148 Persistent<WeakWeak> weakWeak = new WeakWeak(); | 3148 Persistent<WeakWeak> weakWeak = new WeakWeak(); |
| 3149 | 3149 |
| 3150 Persistent<WeakSet> weakSet = new WeakSet(); | 3150 Persistent<WeakSet> weakSet = new WeakSet(); |
| 3151 Persistent<WeakOrderedSet> weakOrderedSet = new WeakOrderedSet(); | 3151 Persistent<WeakOrderedSet> weakOrderedSet = new WeakOrderedSet(); |
| 3152 | 3152 |
| 3153 PersistentHeapVector<Member<IntWrapper> > keepNumbersAlive; | 3153 PersistentHeapVector<Member<IntWrapper>> keepNumbersAlive; |
| 3154 for (int i = 0; i < 128; i += 2) { | 3154 for (int i = 0; i < 128; i += 2) { |
| 3155 IntWrapper* wrapped = IntWrapper::create(i); | 3155 IntWrapper* wrapped = IntWrapper::create(i); |
| 3156 IntWrapper* wrapped2 = IntWrapper::create(i + 1); | 3156 IntWrapper* wrapped2 = IntWrapper::create(i + 1); |
| 3157 keepNumbersAlive.append(wrapped); | 3157 keepNumbersAlive.append(wrapped); |
| 3158 keepNumbersAlive.append(wrapped2); | 3158 keepNumbersAlive.append(wrapped2); |
| 3159 weakStrong->add(wrapped, wrapped2); | 3159 weakStrong->add(wrapped, wrapped2); |
| 3160 strongWeak->add(wrapped2, wrapped); | 3160 strongWeak->add(wrapped2, wrapped); |
| 3161 weakWeak->add(wrapped, wrapped2); | 3161 weakWeak->add(wrapped, wrapped2); |
| 3162 weakSet->add(wrapped); | 3162 weakSet->add(wrapped); |
| 3163 weakOrderedSet->add(wrapped); | 3163 weakOrderedSet->add(wrapped); |
| (...skipping 265 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3429 EXPECT_TRUE(h4->strongIsThere()); // h2 is still pointed to from h4. | 3429 EXPECT_TRUE(h4->strongIsThere()); // h2 is still pointed to from h4. |
| 3430 EXPECT_TRUE(h5->strongIsThere()); // h2 is still pointed to from h5. | 3430 EXPECT_TRUE(h5->strongIsThere()); // h2 is still pointed to from h5. |
| 3431 } | 3431 } |
| 3432 // h4 and h5 have gone out of scope now and they were keeping h2 alive. | 3432 // h4 and h5 have gone out of scope now and they were keeping h2 alive. |
| 3433 Heap::collectGarbage(ThreadState::NoHeapPointersOnStack); | 3433 Heap::collectGarbage(ThreadState::NoHeapPointersOnStack); |
| 3434 EXPECT_EQ(0u, Bar::s_live); // All gone. | 3434 EXPECT_EQ(0u, Bar::s_live); // All gone. |
| 3435 } | 3435 } |
| 3436 | 3436 |
| 3437 TEST(HeapTest, FinalizationObserver) | 3437 TEST(HeapTest, FinalizationObserver) |
| 3438 { | 3438 { |
| 3439 Persistent<FinalizationObserver<Observable> > o; | 3439 Persistent<FinalizationObserver<Observable>> o; |
| 3440 { | 3440 { |
| 3441 Observable* foo = Observable::create(Bar::create()); | 3441 Observable* foo = Observable::create(Bar::create()); |
| 3442 // |o| observes |foo|. | 3442 // |o| observes |foo|. |
| 3443 o = FinalizationObserver<Observable>::create(foo); | 3443 o = FinalizationObserver<Observable>::create(foo); |
| 3444 } | 3444 } |
| 3445 // FinalizationObserver doesn't have a strong reference to |foo|. So |foo| | 3445 // FinalizationObserver doesn't have a strong reference to |foo|. So |foo| |
| 3446 // and its member will be collected. | 3446 // and its member will be collected. |
| 3447 Heap::collectGarbage(ThreadState::NoHeapPointersOnStack); | 3447 Heap::collectGarbage(ThreadState::NoHeapPointersOnStack); |
| 3448 EXPECT_EQ(0u, Bar::s_live); | 3448 EXPECT_EQ(0u, Bar::s_live); |
| 3449 EXPECT_TRUE(o->didCallWillFinalize()); | 3449 EXPECT_TRUE(o->didCallWillFinalize()); |
| (...skipping 133 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3583 EXPECT_EQ(0, IntWrapper::s_destructorCalls); | 3583 EXPECT_EQ(0, IntWrapper::s_destructorCalls); |
| 3584 container = nullptr; | 3584 container = nullptr; |
| 3585 Heap::collectGarbage(ThreadState::NoHeapPointersOnStack); | 3585 Heap::collectGarbage(ThreadState::NoHeapPointersOnStack); |
| 3586 EXPECT_EQ(OffHeapContainer::deadWrappers, IntWrapper::s_destructorCalls); | 3586 EXPECT_EQ(OffHeapContainer::deadWrappers, IntWrapper::s_destructorCalls); |
| 3587 } | 3587 } |
| 3588 | 3588 |
| 3589 TEST(HeapTest, PersistentHeapCollectionTypes) | 3589 TEST(HeapTest, PersistentHeapCollectionTypes) |
| 3590 { | 3590 { |
| 3591 IntWrapper::s_destructorCalls = 0; | 3591 IntWrapper::s_destructorCalls = 0; |
| 3592 | 3592 |
| 3593 typedef HeapVector<Member<IntWrapper> > Vec; | 3593 typedef HeapVector<Member<IntWrapper>> Vec; |
| 3594 typedef PersistentHeapVector<Member<IntWrapper> > PVec; | 3594 typedef PersistentHeapVector<Member<IntWrapper>> PVec; |
| 3595 typedef PersistentHeapHashSet<Member<IntWrapper> > PSet; | 3595 typedef PersistentHeapHashSet<Member<IntWrapper>> PSet; |
| 3596 typedef PersistentHeapListHashSet<Member<IntWrapper> > PListSet; | 3596 typedef PersistentHeapListHashSet<Member<IntWrapper>> PListSet; |
| 3597 typedef PersistentHeapLinkedHashSet<Member<IntWrapper> > PLinkedSet; | 3597 typedef PersistentHeapLinkedHashSet<Member<IntWrapper>> PLinkedSet; |
| 3598 typedef PersistentHeapHashMap<Member<IntWrapper>, Member<IntWrapper> > PMap; | 3598 typedef PersistentHeapHashMap<Member<IntWrapper>, Member<IntWrapper>> PMap; |
| 3599 typedef PersistentHeapHashMap<WeakMember<IntWrapper>, Member<IntWrapper> > W
eakPMap; | 3599 typedef PersistentHeapHashMap<WeakMember<IntWrapper>, Member<IntWrapper>> We
akPMap; |
| 3600 typedef PersistentHeapDeque<Member<IntWrapper> > PDeque; | 3600 typedef PersistentHeapDeque<Member<IntWrapper>> PDeque; |
| 3601 | 3601 |
| 3602 clearOutOldGarbage(); | 3602 clearOutOldGarbage(); |
| 3603 { | 3603 { |
| 3604 PVec pVec; | 3604 PVec pVec; |
| 3605 PDeque pDeque; | 3605 PDeque pDeque; |
| 3606 PSet pSet; | 3606 PSet pSet; |
| 3607 PListSet pListSet; | 3607 PListSet pListSet; |
| 3608 PLinkedSet pLinkedSet; | 3608 PLinkedSet pLinkedSet; |
| 3609 PMap pMap; | 3609 PMap pMap; |
| 3610 WeakPMap wpMap; | 3610 WeakPMap wpMap; |
| (...skipping 66 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3677 // Collect previous roots. | 3677 // Collect previous roots. |
| 3678 Heap::collectGarbage(ThreadState::NoHeapPointersOnStack); | 3678 Heap::collectGarbage(ThreadState::NoHeapPointersOnStack); |
| 3679 EXPECT_EQ(11, IntWrapper::s_destructorCalls); | 3679 EXPECT_EQ(11, IntWrapper::s_destructorCalls); |
| 3680 } | 3680 } |
| 3681 | 3681 |
| 3682 TEST(HeapTest, CollectionNesting) | 3682 TEST(HeapTest, CollectionNesting) |
| 3683 { | 3683 { |
| 3684 clearOutOldGarbage(); | 3684 clearOutOldGarbage(); |
| 3685 int* key = &IntWrapper::s_destructorCalls; | 3685 int* key = &IntWrapper::s_destructorCalls; |
| 3686 IntWrapper::s_destructorCalls = 0; | 3686 IntWrapper::s_destructorCalls = 0; |
| 3687 typedef HeapVector<Member<IntWrapper> > IntVector; | 3687 typedef HeapVector<Member<IntWrapper>> IntVector; |
| 3688 typedef HeapDeque<Member<IntWrapper> > IntDeque; | 3688 typedef HeapDeque<Member<IntWrapper>> IntDeque; |
| 3689 HeapHashMap<void*, IntVector>* map = new HeapHashMap<void*, IntVector>(); | 3689 HeapHashMap<void*, IntVector>* map = new HeapHashMap<void*, IntVector>(); |
| 3690 HeapHashMap<void*, IntDeque>* map2 = new HeapHashMap<void*, IntDeque>(); | 3690 HeapHashMap<void*, IntDeque>* map2 = new HeapHashMap<void*, IntDeque>(); |
| 3691 static_assert(WTF::NeedsTracing<IntVector>::value, "Failed to recognize Heap
Vector as NeedsTracing"); | 3691 static_assert(WTF::NeedsTracing<IntVector>::value, "Failed to recognize Heap
Vector as NeedsTracing"); |
| 3692 static_assert(WTF::NeedsTracing<IntDeque>::value, "Failed to recognize HeapD
eque as NeedsTracing"); | 3692 static_assert(WTF::NeedsTracing<IntDeque>::value, "Failed to recognize HeapD
eque as NeedsTracing"); |
| 3693 | 3693 |
| 3694 map->add(key, IntVector()); | 3694 map->add(key, IntVector()); |
| 3695 map2->add(key, IntDeque()); | 3695 map2->add(key, IntDeque()); |
| 3696 | 3696 |
| 3697 HeapHashMap<void*, IntVector>::iterator it = map->find(key); | 3697 HeapHashMap<void*, IntVector>::iterator it = map->find(key); |
| 3698 EXPECT_EQ(0u, map->get(key).size()); | 3698 EXPECT_EQ(0u, map->get(key).size()); |
| 3699 | 3699 |
| 3700 HeapHashMap<void*, IntDeque>::iterator it2 = map2->find(key); | 3700 HeapHashMap<void*, IntDeque>::iterator it2 = map2->find(key); |
| 3701 EXPECT_EQ(0u, map2->get(key).size()); | 3701 EXPECT_EQ(0u, map2->get(key).size()); |
| 3702 | 3702 |
| 3703 it->value.append(IntWrapper::create(42)); | 3703 it->value.append(IntWrapper::create(42)); |
| 3704 EXPECT_EQ(1u, map->get(key).size()); | 3704 EXPECT_EQ(1u, map->get(key).size()); |
| 3705 | 3705 |
| 3706 it2->value.append(IntWrapper::create(42)); | 3706 it2->value.append(IntWrapper::create(42)); |
| 3707 EXPECT_EQ(1u, map2->get(key).size()); | 3707 EXPECT_EQ(1u, map2->get(key).size()); |
| 3708 | 3708 |
| 3709 Persistent<HeapHashMap<void*, IntVector> > keepAlive(map); | 3709 Persistent<HeapHashMap<void*, IntVector>> keepAlive(map); |
| 3710 Persistent<HeapHashMap<void*, IntDeque> > keepAlive2(map2); | 3710 Persistent<HeapHashMap<void*, IntDeque>> keepAlive2(map2); |
| 3711 | 3711 |
| 3712 for (int i = 0; i < 100; i++) { | 3712 for (int i = 0; i < 100; i++) { |
| 3713 map->add(key + 1 + i, IntVector()); | 3713 map->add(key + 1 + i, IntVector()); |
| 3714 map2->add(key + 1 + i, IntDeque()); | 3714 map2->add(key + 1 + i, IntDeque()); |
| 3715 } | 3715 } |
| 3716 | 3716 |
| 3717 Heap::collectGarbage(ThreadState::NoHeapPointersOnStack); | 3717 Heap::collectGarbage(ThreadState::NoHeapPointersOnStack); |
| 3718 | 3718 |
| 3719 EXPECT_EQ(1u, map->get(key).size()); | 3719 EXPECT_EQ(1u, map->get(key).size()); |
| 3720 EXPECT_EQ(1u, map2->get(key).size()); | 3720 EXPECT_EQ(1u, map2->get(key).size()); |
| (...skipping 11 matching lines...) Expand all Loading... |
| 3732 Persistent<UseMixin> usemixin = UseMixin::create(); | 3732 Persistent<UseMixin> usemixin = UseMixin::create(); |
| 3733 EXPECT_EQ(0, UseMixin::s_traceCount); | 3733 EXPECT_EQ(0, UseMixin::s_traceCount); |
| 3734 Heap::collectGarbage(ThreadState::NoHeapPointersOnStack); | 3734 Heap::collectGarbage(ThreadState::NoHeapPointersOnStack); |
| 3735 EXPECT_EQ(1, UseMixin::s_traceCount); | 3735 EXPECT_EQ(1, UseMixin::s_traceCount); |
| 3736 | 3736 |
| 3737 Persistent<Mixin> mixin = usemixin; | 3737 Persistent<Mixin> mixin = usemixin; |
| 3738 usemixin = nullptr; | 3738 usemixin = nullptr; |
| 3739 Heap::collectGarbage(ThreadState::NoHeapPointersOnStack); | 3739 Heap::collectGarbage(ThreadState::NoHeapPointersOnStack); |
| 3740 EXPECT_EQ(2, UseMixin::s_traceCount); | 3740 EXPECT_EQ(2, UseMixin::s_traceCount); |
| 3741 | 3741 |
| 3742 PersistentHeapHashSet<WeakMember<Mixin> > weakMap; | 3742 PersistentHeapHashSet<WeakMember<Mixin>> weakMap; |
| 3743 weakMap.add(UseMixin::create()); | 3743 weakMap.add(UseMixin::create()); |
| 3744 Heap::collectGarbage(ThreadState::NoHeapPointersOnStack); | 3744 Heap::collectGarbage(ThreadState::NoHeapPointersOnStack); |
| 3745 EXPECT_EQ(0u, weakMap.size()); | 3745 EXPECT_EQ(0u, weakMap.size()); |
| 3746 } | 3746 } |
| 3747 | 3747 |
| 3748 TEST(HeapTest, CollectionNesting2) | 3748 TEST(HeapTest, CollectionNesting2) |
| 3749 { | 3749 { |
| 3750 clearOutOldGarbage(); | 3750 clearOutOldGarbage(); |
| 3751 void* key = &IntWrapper::s_destructorCalls; | 3751 void* key = &IntWrapper::s_destructorCalls; |
| 3752 IntWrapper::s_destructorCalls = 0; | 3752 IntWrapper::s_destructorCalls = 0; |
| 3753 typedef HeapHashSet<Member<IntWrapper> > IntSet; | 3753 typedef HeapHashSet<Member<IntWrapper>> IntSet; |
| 3754 HeapHashMap<void*, IntSet>* map = new HeapHashMap<void*, IntSet>(); | 3754 HeapHashMap<void*, IntSet>* map = new HeapHashMap<void*, IntSet>(); |
| 3755 | 3755 |
| 3756 map->add(key, IntSet()); | 3756 map->add(key, IntSet()); |
| 3757 | 3757 |
| 3758 HeapHashMap<void*, IntSet>::iterator it = map->find(key); | 3758 HeapHashMap<void*, IntSet>::iterator it = map->find(key); |
| 3759 EXPECT_EQ(0u, map->get(key).size()); | 3759 EXPECT_EQ(0u, map->get(key).size()); |
| 3760 | 3760 |
| 3761 it->value.add(IntWrapper::create(42)); | 3761 it->value.add(IntWrapper::create(42)); |
| 3762 EXPECT_EQ(1u, map->get(key).size()); | 3762 EXPECT_EQ(1u, map->get(key).size()); |
| 3763 | 3763 |
| 3764 Persistent<HeapHashMap<void*, IntSet> > keepAlive(map); | 3764 Persistent<HeapHashMap<void*, IntSet>> keepAlive(map); |
| 3765 Heap::collectGarbage(ThreadState::NoHeapPointersOnStack); | 3765 Heap::collectGarbage(ThreadState::NoHeapPointersOnStack); |
| 3766 EXPECT_EQ(1u, map->get(key).size()); | 3766 EXPECT_EQ(1u, map->get(key).size()); |
| 3767 EXPECT_EQ(0, IntWrapper::s_destructorCalls); | 3767 EXPECT_EQ(0, IntWrapper::s_destructorCalls); |
| 3768 } | 3768 } |
| 3769 | 3769 |
| 3770 TEST(HeapTest, CollectionNesting3) | 3770 TEST(HeapTest, CollectionNesting3) |
| 3771 { | 3771 { |
| 3772 clearOutOldGarbage(); | 3772 clearOutOldGarbage(); |
| 3773 IntWrapper::s_destructorCalls = 0; | 3773 IntWrapper::s_destructorCalls = 0; |
| 3774 typedef HeapVector<Member<IntWrapper> > IntVector; | 3774 typedef HeapVector<Member<IntWrapper>> IntVector; |
| 3775 typedef HeapDeque<Member<IntWrapper> > IntDeque; | 3775 typedef HeapDeque<Member<IntWrapper>> IntDeque; |
| 3776 HeapVector<IntVector>* vector = new HeapVector<IntVector>(); | 3776 HeapVector<IntVector>* vector = new HeapVector<IntVector>(); |
| 3777 HeapDeque<IntDeque>* deque = new HeapDeque<IntDeque>(); | 3777 HeapDeque<IntDeque>* deque = new HeapDeque<IntDeque>(); |
| 3778 | 3778 |
| 3779 vector->append(IntVector()); | 3779 vector->append(IntVector()); |
| 3780 deque->append(IntDeque()); | 3780 deque->append(IntDeque()); |
| 3781 | 3781 |
| 3782 HeapVector<IntVector>::iterator it = vector->begin(); | 3782 HeapVector<IntVector>::iterator it = vector->begin(); |
| 3783 HeapDeque<IntDeque>::iterator it2 = deque->begin(); | 3783 HeapDeque<IntDeque>::iterator it2 = deque->begin(); |
| 3784 EXPECT_EQ(0u, it->size()); | 3784 EXPECT_EQ(0u, it->size()); |
| 3785 EXPECT_EQ(0u, it2->size()); | 3785 EXPECT_EQ(0u, it2->size()); |
| 3786 | 3786 |
| 3787 it->append(IntWrapper::create(42)); | 3787 it->append(IntWrapper::create(42)); |
| 3788 it2->append(IntWrapper::create(42)); | 3788 it2->append(IntWrapper::create(42)); |
| 3789 EXPECT_EQ(1u, it->size()); | 3789 EXPECT_EQ(1u, it->size()); |
| 3790 EXPECT_EQ(1u, it2->size()); | 3790 EXPECT_EQ(1u, it2->size()); |
| 3791 | 3791 |
| 3792 Persistent<HeapVector<IntVector> > keepAlive(vector); | 3792 Persistent<HeapVector<IntVector>> keepAlive(vector); |
| 3793 Persistent<HeapDeque<IntDeque> > keepAlive2(deque); | 3793 Persistent<HeapDeque<IntDeque>> keepAlive2(deque); |
| 3794 Heap::collectGarbage(ThreadState::NoHeapPointersOnStack); | 3794 Heap::collectGarbage(ThreadState::NoHeapPointersOnStack); |
| 3795 EXPECT_EQ(1u, it->size()); | 3795 EXPECT_EQ(1u, it->size()); |
| 3796 EXPECT_EQ(1u, it2->size()); | 3796 EXPECT_EQ(1u, it2->size()); |
| 3797 EXPECT_EQ(0, IntWrapper::s_destructorCalls); | 3797 EXPECT_EQ(0, IntWrapper::s_destructorCalls); |
| 3798 } | 3798 } |
| 3799 | 3799 |
| 3800 TEST(HeapTest, EmbeddedInVector) | 3800 TEST(HeapTest, EmbeddedInVector) |
| 3801 { | 3801 { |
| 3802 clearOutOldGarbage(); | 3802 clearOutOldGarbage(); |
| 3803 SimpleFinalizedObject::s_destructorCalls = 0; | 3803 SimpleFinalizedObject::s_destructorCalls = 0; |
| (...skipping 79 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3883 set.add(new int(42)); | 3883 set.add(new int(42)); |
| 3884 EXPECT_EQ(2u, set.size()); | 3884 EXPECT_EQ(2u, set.size()); |
| 3885 for (typename Set::iterator it = set.begin(); it != set.end(); ++it) { | 3885 for (typename Set::iterator it = set.begin(); it != set.end(); ++it) { |
| 3886 EXPECT_EQ(42, **it); | 3886 EXPECT_EQ(42, **it); |
| 3887 delete *it; | 3887 delete *it; |
| 3888 } | 3888 } |
| 3889 } | 3889 } |
| 3890 | 3890 |
| 3891 TEST(HeapTest, RawPtrInHash) | 3891 TEST(HeapTest, RawPtrInHash) |
| 3892 { | 3892 { |
| 3893 rawPtrInHashHelper<HashSet<RawPtr<int> > >(); | 3893 rawPtrInHashHelper<HashSet<RawPtr<int>> >(); |
| 3894 rawPtrInHashHelper<ListHashSet<RawPtr<int> > >(); | 3894 rawPtrInHashHelper<ListHashSet<RawPtr<int>> >(); |
| 3895 rawPtrInHashHelper<LinkedHashSet<RawPtr<int> > >(); | 3895 rawPtrInHashHelper<LinkedHashSet<RawPtr<int>> >(); |
| 3896 } | 3896 } |
| 3897 | 3897 |
| 3898 TEST(HeapTest, HeapTerminatedArray) | 3898 TEST(HeapTest, HeapTerminatedArray) |
| 3899 { | 3899 { |
| 3900 clearOutOldGarbage(); | 3900 clearOutOldGarbage(); |
| 3901 IntWrapper::s_destructorCalls = 0; | 3901 IntWrapper::s_destructorCalls = 0; |
| 3902 | 3902 |
| 3903 HeapTerminatedArray<TerminatedArrayItem>* arr = 0; | 3903 HeapTerminatedArray<TerminatedArrayItem>* arr = 0; |
| 3904 | 3904 |
| 3905 const size_t prefixSize = 4; | 3905 const size_t prefixSize = 4; |
| (...skipping 21 matching lines...) Expand all Loading... |
| 3927 arr = builder.release(); | 3927 arr = builder.release(); |
| 3928 } | 3928 } |
| 3929 | 3929 |
| 3930 Heap::collectGarbage(ThreadState::HeapPointersOnStack); | 3930 Heap::collectGarbage(ThreadState::HeapPointersOnStack); |
| 3931 EXPECT_EQ(0, IntWrapper::s_destructorCalls); | 3931 EXPECT_EQ(0, IntWrapper::s_destructorCalls); |
| 3932 EXPECT_EQ(prefixSize + suffixSize, arr->size()); | 3932 EXPECT_EQ(prefixSize + suffixSize, arr->size()); |
| 3933 for (size_t i = 0; i < prefixSize + suffixSize; i++) | 3933 for (size_t i = 0; i < prefixSize + suffixSize; i++) |
| 3934 EXPECT_EQ(i, static_cast<size_t>(arr->at(i).payload()->value())); | 3934 EXPECT_EQ(i, static_cast<size_t>(arr->at(i).payload()->value())); |
| 3935 | 3935 |
| 3936 { | 3936 { |
| 3937 Persistent<HeapTerminatedArray<TerminatedArrayItem> > persistentArr = ar
r; | 3937 Persistent<HeapTerminatedArray<TerminatedArrayItem>> persistentArr = arr
; |
| 3938 arr = 0; | 3938 arr = 0; |
| 3939 Heap::collectGarbage(ThreadState::NoHeapPointersOnStack); | 3939 Heap::collectGarbage(ThreadState::NoHeapPointersOnStack); |
| 3940 arr = persistentArr.get(); | 3940 arr = persistentArr.get(); |
| 3941 EXPECT_EQ(0, IntWrapper::s_destructorCalls); | 3941 EXPECT_EQ(0, IntWrapper::s_destructorCalls); |
| 3942 EXPECT_EQ(prefixSize + suffixSize, arr->size()); | 3942 EXPECT_EQ(prefixSize + suffixSize, arr->size()); |
| 3943 for (size_t i = 0; i < prefixSize + suffixSize; i++) | 3943 for (size_t i = 0; i < prefixSize + suffixSize; i++) |
| 3944 EXPECT_EQ(i, static_cast<size_t>(arr->at(i).payload()->value())); | 3944 EXPECT_EQ(i, static_cast<size_t>(arr->at(i).payload()->value())); |
| 3945 } | 3945 } |
| 3946 | 3946 |
| 3947 arr = 0; | 3947 arr = 0; |
| (...skipping 14 matching lines...) Expand all Loading... |
| 3962 stack->push(TerminatedArrayItem(IntWrapper::create(i))); | 3962 stack->push(TerminatedArrayItem(IntWrapper::create(i))); |
| 3963 | 3963 |
| 3964 Heap::collectGarbage(ThreadState::HeapPointersOnStack); | 3964 Heap::collectGarbage(ThreadState::HeapPointersOnStack); |
| 3965 EXPECT_EQ(0, IntWrapper::s_destructorCalls); | 3965 EXPECT_EQ(0, IntWrapper::s_destructorCalls); |
| 3966 EXPECT_EQ(stackSize, stack->size()); | 3966 EXPECT_EQ(stackSize, stack->size()); |
| 3967 while (!stack->isEmpty()) { | 3967 while (!stack->isEmpty()) { |
| 3968 EXPECT_EQ(stack->size() - 1, static_cast<size_t>(stack->peek().payload()
->value())); | 3968 EXPECT_EQ(stack->size() - 1, static_cast<size_t>(stack->peek().payload()
->value())); |
| 3969 stack->pop(); | 3969 stack->pop(); |
| 3970 } | 3970 } |
| 3971 | 3971 |
| 3972 Persistent<HeapLinkedStack<TerminatedArrayItem> > pStack = stack; | 3972 Persistent<HeapLinkedStack<TerminatedArrayItem>> pStack = stack; |
| 3973 | 3973 |
| 3974 Heap::collectGarbage(ThreadState::NoHeapPointersOnStack); | 3974 Heap::collectGarbage(ThreadState::NoHeapPointersOnStack); |
| 3975 EXPECT_EQ(stackSize, static_cast<size_t>(IntWrapper::s_destructorCalls)); | 3975 EXPECT_EQ(stackSize, static_cast<size_t>(IntWrapper::s_destructorCalls)); |
| 3976 EXPECT_EQ(0u, pStack->size()); | 3976 EXPECT_EQ(0u, pStack->size()); |
| 3977 } | 3977 } |
| 3978 | 3978 |
| 3979 TEST(HeapTest, AllocationDuringFinalization) | 3979 TEST(HeapTest, AllocationDuringFinalization) |
| 3980 { | 3980 { |
| 3981 clearOutOldGarbage(); | 3981 clearOutOldGarbage(); |
| 3982 IntWrapper::s_destructorCalls = 0; | 3982 IntWrapper::s_destructorCalls = 0; |
| (...skipping 85 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 4068 } | 4068 } |
| 4069 } | 4069 } |
| 4070 | 4070 |
| 4071 EXPECT_FALSE(RefCountedWithDestructor::s_wasDestructed); | 4071 EXPECT_FALSE(RefCountedWithDestructor::s_wasDestructed); |
| 4072 set.clear(); | 4072 set.clear(); |
| 4073 EXPECT_TRUE(RefCountedWithDestructor::s_wasDestructed); | 4073 EXPECT_TRUE(RefCountedWithDestructor::s_wasDestructed); |
| 4074 } | 4074 } |
| 4075 | 4075 |
| 4076 TEST(HeapTest, DestructorsCalled) | 4076 TEST(HeapTest, DestructorsCalled) |
| 4077 { | 4077 { |
| 4078 HeapHashMap<SimpleClassWithDestructor*, OwnPtr<SimpleClassWithDestructor> >
map; | 4078 HeapHashMap<SimpleClassWithDestructor*, OwnPtr<SimpleClassWithDestructor>> m
ap; |
| 4079 SimpleClassWithDestructor* hasDestructor = new SimpleClassWithDestructor(); | 4079 SimpleClassWithDestructor* hasDestructor = new SimpleClassWithDestructor(); |
| 4080 map.add(hasDestructor, adoptPtr(hasDestructor)); | 4080 map.add(hasDestructor, adoptPtr(hasDestructor)); |
| 4081 SimpleClassWithDestructor::s_wasDestructed = false; | 4081 SimpleClassWithDestructor::s_wasDestructed = false; |
| 4082 map.clear(); | 4082 map.clear(); |
| 4083 EXPECT_TRUE(SimpleClassWithDestructor::s_wasDestructed); | 4083 EXPECT_TRUE(SimpleClassWithDestructor::s_wasDestructed); |
| 4084 | 4084 |
| 4085 destructorsCalledOnClear<HeapHashSet<RefPtr<RefCountedWithDestructor> > >(fa
lse); | 4085 destructorsCalledOnClear<HeapHashSet<RefPtr<RefCountedWithDestructor>> >(fal
se); |
| 4086 destructorsCalledOnClear<HeapListHashSet<RefPtr<RefCountedWithDestructor> >
>(false); | 4086 destructorsCalledOnClear<HeapListHashSet<RefPtr<RefCountedWithDestructor>> >
(false); |
| 4087 destructorsCalledOnClear<HeapLinkedHashSet<RefPtr<RefCountedWithDestructor>
> >(false); | 4087 destructorsCalledOnClear<HeapLinkedHashSet<RefPtr<RefCountedWithDestructor>>
>(false); |
| 4088 destructorsCalledOnClear<HeapHashSet<RefPtr<RefCountedWithDestructor> > >(tr
ue); | 4088 destructorsCalledOnClear<HeapHashSet<RefPtr<RefCountedWithDestructor>> >(tru
e); |
| 4089 destructorsCalledOnClear<HeapListHashSet<RefPtr<RefCountedWithDestructor> >
>(true); | 4089 destructorsCalledOnClear<HeapListHashSet<RefPtr<RefCountedWithDestructor>> >
(true); |
| 4090 destructorsCalledOnClear<HeapLinkedHashSet<RefPtr<RefCountedWithDestructor>
> >(true); | 4090 destructorsCalledOnClear<HeapLinkedHashSet<RefPtr<RefCountedWithDestructor>>
>(true); |
| 4091 | 4091 |
| 4092 destructorsCalledOnGC<HeapHashSet<RefPtr<RefCountedWithDestructor> > >(false
); | 4092 destructorsCalledOnGC<HeapHashSet<RefPtr<RefCountedWithDestructor>> >(false)
; |
| 4093 destructorsCalledOnGC<HeapListHashSet<RefPtr<RefCountedWithDestructor> > >(f
alse); | 4093 destructorsCalledOnGC<HeapListHashSet<RefPtr<RefCountedWithDestructor>> >(fa
lse); |
| 4094 destructorsCalledOnGC<HeapLinkedHashSet<RefPtr<RefCountedWithDestructor> > >
(false); | 4094 destructorsCalledOnGC<HeapLinkedHashSet<RefPtr<RefCountedWithDestructor>> >(
false); |
| 4095 destructorsCalledOnGC<HeapHashSet<RefPtr<RefCountedWithDestructor> > >(true)
; | 4095 destructorsCalledOnGC<HeapHashSet<RefPtr<RefCountedWithDestructor>> >(true); |
| 4096 destructorsCalledOnGC<HeapListHashSet<RefPtr<RefCountedWithDestructor> > >(t
rue); | 4096 destructorsCalledOnGC<HeapListHashSet<RefPtr<RefCountedWithDestructor>> >(tr
ue); |
| 4097 destructorsCalledOnGC<HeapLinkedHashSet<RefPtr<RefCountedWithDestructor> > >
(true); | 4097 destructorsCalledOnGC<HeapLinkedHashSet<RefPtr<RefCountedWithDestructor>> >(
true); |
| 4098 } | 4098 } |
| 4099 | 4099 |
| 4100 class MixinA : public GarbageCollectedMixin { | 4100 class MixinA : public GarbageCollectedMixin { |
| 4101 public: | 4101 public: |
| 4102 MixinA() : m_obj(IntWrapper::create(100)) { } | 4102 MixinA() : m_obj(IntWrapper::create(100)) { } |
| 4103 virtual void trace(Visitor* visitor) | 4103 virtual void trace(Visitor* visitor) |
| 4104 { | 4104 { |
| 4105 visitor->trace(m_obj); | 4105 visitor->trace(m_obj); |
| 4106 } | 4106 } |
| 4107 Member<IntWrapper> m_obj; | 4107 Member<IntWrapper> m_obj; |
| (...skipping 170 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 4278 Iterator i1 = set1->begin(); | 4278 Iterator i1 = set1->begin(); |
| 4279 EXPECT_TRUE(i1->first->value() == 103 || i1->first == livingInt); | 4279 EXPECT_TRUE(i1->first->value() == 103 || i1->first == livingInt); |
| 4280 EXPECT_EQ(livingInt, i1->second); | 4280 EXPECT_EQ(livingInt, i1->second); |
| 4281 ++i1; | 4281 ++i1; |
| 4282 EXPECT_TRUE(i1->first->value() == 103 || i1->first == livingInt); | 4282 EXPECT_TRUE(i1->first->value() == 103 || i1->first == livingInt); |
| 4283 EXPECT_EQ(livingInt, i1->second); | 4283 EXPECT_EQ(livingInt, i1->second); |
| 4284 } | 4284 } |
| 4285 | 4285 |
| 4286 TEST(HeapTest, SetWithCustomWeaknessHandling) | 4286 TEST(HeapTest, SetWithCustomWeaknessHandling) |
| 4287 { | 4287 { |
| 4288 setWithCustomWeaknessHandling<HeapHashSet<PairWithWeakHandling> >(); | 4288 setWithCustomWeaknessHandling<HeapHashSet<PairWithWeakHandling>>(); |
| 4289 setWithCustomWeaknessHandling<HeapLinkedHashSet<PairWithWeakHandling> >(); | 4289 setWithCustomWeaknessHandling<HeapLinkedHashSet<PairWithWeakHandling>>(); |
| 4290 } | 4290 } |
| 4291 | 4291 |
| 4292 TEST(HeapTest, MapWithCustomWeaknessHandling) | 4292 TEST(HeapTest, MapWithCustomWeaknessHandling) |
| 4293 { | 4293 { |
| 4294 typedef HeapHashMap<PairWithWeakHandling, RefPtr<OffHeapInt> > Map; | 4294 typedef HeapHashMap<PairWithWeakHandling, RefPtr<OffHeapInt>> Map; |
| 4295 typedef Map::iterator Iterator; | 4295 typedef Map::iterator Iterator; |
| 4296 clearOutOldGarbage(); | 4296 clearOutOldGarbage(); |
| 4297 OffHeapInt::s_destructorCalls = 0; | 4297 OffHeapInt::s_destructorCalls = 0; |
| 4298 | 4298 |
| 4299 Persistent<Map> map1(new Map()); | 4299 Persistent<Map> map1(new Map()); |
| 4300 Persistent<IntWrapper> livingInt(IntWrapper::create(42)); | 4300 Persistent<IntWrapper> livingInt(IntWrapper::create(42)); |
| 4301 { | 4301 { |
| 4302 Map map2; | 4302 Map map2; |
| 4303 Map* map3 = new Map(); | 4303 Map* map3 = new Map(); |
| 4304 map2.add(PairWithWeakHandling(IntWrapper::create(0), IntWrapper::create(
1)), OffHeapInt::create(1001)); | 4304 map2.add(PairWithWeakHandling(IntWrapper::create(0), IntWrapper::create(
1)), OffHeapInt::create(1001)); |
| (...skipping 116 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 4421 EXPECT_EQ(2, OffHeapInt::s_destructorCalls); | 4421 EXPECT_EQ(2, OffHeapInt::s_destructorCalls); |
| 4422 EXPECT_EQ(2u, map1->size()); | 4422 EXPECT_EQ(2u, map1->size()); |
| 4423 Iterator i1 = map1->begin(); | 4423 Iterator i1 = map1->begin(); |
| 4424 EXPECT_TRUE(i1->value.first->value() == 103 || i1->value.first == livingInt)
; | 4424 EXPECT_TRUE(i1->value.first->value() == 103 || i1->value.first == livingInt)
; |
| 4425 EXPECT_EQ(livingInt, i1->value.second); | 4425 EXPECT_EQ(livingInt, i1->value.second); |
| 4426 ++i1; | 4426 ++i1; |
| 4427 EXPECT_TRUE(i1->value.first->value() == 103 || i1->value.first == livingInt)
; | 4427 EXPECT_TRUE(i1->value.first->value() == 103 || i1->value.first == livingInt)
; |
| 4428 EXPECT_EQ(livingInt, i1->value.second); | 4428 EXPECT_EQ(livingInt, i1->value.second); |
| 4429 } | 4429 } |
| 4430 | 4430 |
| 4431 static void addElementsToWeakMap(HeapHashMap<int, WeakMember<IntWrapper> >* map) | 4431 static void addElementsToWeakMap(HeapHashMap<int, WeakMember<IntWrapper>>* map) |
| 4432 { | 4432 { |
| 4433 // Key cannot be zero in hashmap. | 4433 // Key cannot be zero in hashmap. |
| 4434 for (int i = 1; i < 11; i++) | 4434 for (int i = 1; i < 11; i++) |
| 4435 map->add(i, IntWrapper::create(i)); | 4435 map->add(i, IntWrapper::create(i)); |
| 4436 } | 4436 } |
| 4437 | 4437 |
| 4438 // crbug.com/402426 | 4438 // crbug.com/402426 |
| 4439 // If it doesn't assert a concurrent modification to the map, then it's passing. | 4439 // If it doesn't assert a concurrent modification to the map, then it's passing. |
| 4440 TEST(HeapTest, RegressNullIsStrongified) | 4440 TEST(HeapTest, RegressNullIsStrongified) |
| 4441 { | 4441 { |
| 4442 Persistent<HeapHashMap<int, WeakMember<IntWrapper> > > map = new HeapHashMap
<int, WeakMember<IntWrapper> >(); | 4442 Persistent<HeapHashMap<int, WeakMember<IntWrapper>> > map = new HeapHashMap<
int, WeakMember<IntWrapper>>(); |
| 4443 addElementsToWeakMap(map); | 4443 addElementsToWeakMap(map); |
| 4444 HeapHashMap<int, WeakMember<IntWrapper> >::AddResult result = map->add(800,
nullptr); | 4444 HeapHashMap<int, WeakMember<IntWrapper>>::AddResult result = map->add(800, n
ullptr); |
| 4445 Heap::collectGarbage(ThreadState::HeapPointersOnStack); | 4445 Heap::collectGarbage(ThreadState::HeapPointersOnStack); |
| 4446 result.storedValue->value = IntWrapper::create(42); | 4446 result.storedValue->value = IntWrapper::create(42); |
| 4447 } | 4447 } |
| 4448 | 4448 |
| 4449 TEST(HeapTest, Bind) | 4449 TEST(HeapTest, Bind) |
| 4450 { | 4450 { |
| 4451 OwnPtr<Closure> closure = bind(&Bar::trace, Bar::create(), static_cast<Visit
or*>(0)); | 4451 OwnPtr<Closure> closure = bind(&Bar::trace, Bar::create(), static_cast<Visit
or*>(0)); |
| 4452 Heap::collectGarbage(ThreadState::NoHeapPointersOnStack); | 4452 Heap::collectGarbage(ThreadState::NoHeapPointersOnStack); |
| 4453 // The closure should have a persistent handle to the Bar. | 4453 // The closure should have a persistent handle to the Bar. |
| 4454 EXPECT_EQ(1u, Bar::s_live); | 4454 EXPECT_EQ(1u, Bar::s_live); |
| 4455 | 4455 |
| 4456 OwnPtr<Closure> closure2 = bind(&Bar::trace, RawPtr<Bar>(Bar::create()), sta
tic_cast<Visitor*>(0)); | 4456 OwnPtr<Closure> closure2 = bind(&Bar::trace, RawPtr<Bar>(Bar::create()), sta
tic_cast<Visitor*>(0)); |
| 4457 Heap::collectGarbage(ThreadState::NoHeapPointersOnStack); | 4457 Heap::collectGarbage(ThreadState::NoHeapPointersOnStack); |
| 4458 // The closure should have a persistent handle to the Bar. | 4458 // The closure should have a persistent handle to the Bar. |
| 4459 EXPECT_EQ(2u, Bar::s_live); | 4459 EXPECT_EQ(2u, Bar::s_live); |
| 4460 // RawPtr<OffHeapInt> should not make Persistent. | 4460 // RawPtr<OffHeapInt> should not make Persistent. |
| 4461 OwnPtr<Closure> closure3 = bind(&OffHeapInt::voidFunction, RawPtr<OffHeapInt
>(OffHeapInt::create(1).get())); | 4461 OwnPtr<Closure> closure3 = bind(&OffHeapInt::voidFunction, RawPtr<OffHeapInt
>(OffHeapInt::create(1).get())); |
| 4462 | 4462 |
| 4463 UseMixin::s_traceCount = 0; | 4463 UseMixin::s_traceCount = 0; |
| 4464 Mixin* mixin = UseMixin::create(); | 4464 Mixin* mixin = UseMixin::create(); |
| 4465 OwnPtr<Closure> mixinClosure = bind(&Mixin::trace, mixin, static_cast<Visito
r*>(0)); | 4465 OwnPtr<Closure> mixinClosure = bind(&Mixin::trace, mixin, static_cast<Visito
r*>(0)); |
| 4466 Heap::collectGarbage(ThreadState::NoHeapPointersOnStack); | 4466 Heap::collectGarbage(ThreadState::NoHeapPointersOnStack); |
| 4467 // The closure should have a persistent handle to the mixin. | 4467 // The closure should have a persistent handle to the mixin. |
| 4468 EXPECT_EQ(1, UseMixin::s_traceCount); | 4468 EXPECT_EQ(1, UseMixin::s_traceCount); |
| 4469 } | 4469 } |
| 4470 | 4470 |
| 4471 typedef HeapHashSet<WeakMember<IntWrapper> > WeakSet; | 4471 typedef HeapHashSet<WeakMember<IntWrapper>> WeakSet; |
| 4472 | 4472 |
| 4473 // These special traits will remove a set from a map when the set is empty. | 4473 // These special traits will remove a set from a map when the set is empty. |
| 4474 struct EmptyClearingHashSetTraits : HashTraits<WeakSet> { | 4474 struct EmptyClearingHashSetTraits : HashTraits<WeakSet> { |
| 4475 static const WTF::WeakHandlingFlag weakHandlingFlag = WTF::WeakHandlingInCol
lections; | 4475 static const WTF::WeakHandlingFlag weakHandlingFlag = WTF::WeakHandlingInCol
lections; |
| 4476 static bool traceInCollection(Visitor* visitor, WeakSet& set, WTF::ShouldWea
kPointersBeMarkedStrongly strongify) | 4476 static bool traceInCollection(Visitor* visitor, WeakSet& set, WTF::ShouldWea
kPointersBeMarkedStrongly strongify) |
| 4477 { | 4477 { |
| 4478 bool liveEntriesFound = false; | 4478 bool liveEntriesFound = false; |
| 4479 WeakSet::iterator end = set.end(); | 4479 WeakSet::iterator end = set.end(); |
| 4480 for (WeakSet::iterator it = set.begin(); it != end; ++it) { | 4480 for (WeakSet::iterator it = set.begin(); it != end; ++it) { |
| 4481 if (visitor->isAlive(*it)) { | 4481 if (visitor->isAlive(*it)) { |
| (...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 4535 EXPECT_EQ(1u, set.size()); | 4535 EXPECT_EQ(1u, set.size()); |
| 4536 } | 4536 } |
| 4537 | 4537 |
| 4538 livingInt.clear(); // The weak set can no longer keep the '42' alive now. | 4538 livingInt.clear(); // The weak set can no longer keep the '42' alive now. |
| 4539 Heap::collectGarbage(ThreadState::NoHeapPointersOnStack); | 4539 Heap::collectGarbage(ThreadState::NoHeapPointersOnStack); |
| 4540 EXPECT_EQ(0u, map->size()); | 4540 EXPECT_EQ(0u, map->size()); |
| 4541 } | 4541 } |
| 4542 | 4542 |
| 4543 TEST(HeapTest, EphemeronsInEphemerons) | 4543 TEST(HeapTest, EphemeronsInEphemerons) |
| 4544 { | 4544 { |
| 4545 typedef HeapHashMap<WeakMember<IntWrapper>, Member<IntWrapper> > InnerMap; | 4545 typedef HeapHashMap<WeakMember<IntWrapper>, Member<IntWrapper>> InnerMap; |
| 4546 typedef HeapHashMap<WeakMember<IntWrapper>, InnerMap> OuterMap; | 4546 typedef HeapHashMap<WeakMember<IntWrapper>, InnerMap> OuterMap; |
| 4547 | 4547 |
| 4548 for (int keepOuterAlive = 0; keepOuterAlive <= 1; keepOuterAlive++) { | 4548 for (int keepOuterAlive = 0; keepOuterAlive <= 1; keepOuterAlive++) { |
| 4549 for (int keepInnerAlive = 0; keepInnerAlive <=1; keepInnerAlive++) { | 4549 for (int keepInnerAlive = 0; keepInnerAlive <=1; keepInnerAlive++) { |
| 4550 Persistent<OuterMap> outer = new OuterMap(); | 4550 Persistent<OuterMap> outer = new OuterMap(); |
| 4551 Persistent<IntWrapper> one = IntWrapper::create(1); | 4551 Persistent<IntWrapper> one = IntWrapper::create(1); |
| 4552 Persistent<IntWrapper> two = IntWrapper::create(2); | 4552 Persistent<IntWrapper> two = IntWrapper::create(2); |
| 4553 outer->add(one, InnerMap()); | 4553 outer->add(one, InnerMap()); |
| 4554 outer->begin()->value.add(two, IntWrapper::create(3)); | 4554 outer->begin()->value.add(two, IntWrapper::create(3)); |
| 4555 EXPECT_EQ(1u, outer->get(one).size()); | 4555 EXPECT_EQ(1u, outer->get(one).size()); |
| (...skipping 11 matching lines...) Expand all Loading... |
| 4567 } else { | 4567 } else { |
| 4568 EXPECT_EQ(0u, inner.size()); | 4568 EXPECT_EQ(0u, inner.size()); |
| 4569 } | 4569 } |
| 4570 } else { | 4570 } else { |
| 4571 EXPECT_EQ(0u, outer->size()); | 4571 EXPECT_EQ(0u, outer->size()); |
| 4572 } | 4572 } |
| 4573 outer->clear(); | 4573 outer->clear(); |
| 4574 Persistent<IntWrapper> deep = IntWrapper::create(42); | 4574 Persistent<IntWrapper> deep = IntWrapper::create(42); |
| 4575 Persistent<IntWrapper> home = IntWrapper::create(103); | 4575 Persistent<IntWrapper> home = IntWrapper::create(103); |
| 4576 Persistent<IntWrapper> composite = IntWrapper::create(91); | 4576 Persistent<IntWrapper> composite = IntWrapper::create(91); |
| 4577 Persistent<HeapVector<Member<IntWrapper> > > keepAlive = new HeapVec
tor<Member<IntWrapper> >(); | 4577 Persistent<HeapVector<Member<IntWrapper>> > keepAlive = new HeapVect
or<Member<IntWrapper>>(); |
| 4578 for (int i = 0; i < 10000; i++) { | 4578 for (int i = 0; i < 10000; i++) { |
| 4579 IntWrapper* value = IntWrapper::create(i); | 4579 IntWrapper* value = IntWrapper::create(i); |
| 4580 keepAlive->append(value); | 4580 keepAlive->append(value); |
| 4581 OuterMap::AddResult newEntry = outer->add(value, InnerMap()); | 4581 OuterMap::AddResult newEntry = outer->add(value, InnerMap()); |
| 4582 newEntry.storedValue->value.add(deep, home); | 4582 newEntry.storedValue->value.add(deep, home); |
| 4583 newEntry.storedValue->value.add(composite, home); | 4583 newEntry.storedValue->value.add(composite, home); |
| 4584 } | 4584 } |
| 4585 composite.clear(); | 4585 composite.clear(); |
| 4586 Heap::collectGarbage(ThreadState::NoHeapPointersOnStack); | 4586 Heap::collectGarbage(ThreadState::NoHeapPointersOnStack); |
| 4587 EXPECT_EQ(10000u, outer->size()); | 4587 EXPECT_EQ(10000u, outer->size()); |
| 4588 for (int i = 0; i < 10000; i++) { | 4588 for (int i = 0; i < 10000; i++) { |
| 4589 IntWrapper* value = keepAlive->at(i); | 4589 IntWrapper* value = keepAlive->at(i); |
| 4590 EXPECT_EQ(1u, outer->get(value).size()); // Other one was delete
d by weak handling. | 4590 EXPECT_EQ(1u, outer->get(value).size()); // Other one was delete
d by weak handling. |
| 4591 if (i & 1) | 4591 if (i & 1) |
| 4592 keepAlive->at(i) = nullptr; | 4592 keepAlive->at(i) = nullptr; |
| 4593 } | 4593 } |
| 4594 Heap::collectGarbage(ThreadState::NoHeapPointersOnStack); | 4594 Heap::collectGarbage(ThreadState::NoHeapPointersOnStack); |
| 4595 EXPECT_EQ(5000u, outer->size()); | 4595 EXPECT_EQ(5000u, outer->size()); |
| 4596 } | 4596 } |
| 4597 } | 4597 } |
| 4598 } | 4598 } |
| 4599 | 4599 |
| 4600 class EphemeronWrapper : public GarbageCollected<EphemeronWrapper> { | 4600 class EphemeronWrapper : public GarbageCollected<EphemeronWrapper> { |
| 4601 public: | 4601 public: |
| 4602 void trace(Visitor* visitor) | 4602 void trace(Visitor* visitor) |
| 4603 { | 4603 { |
| 4604 visitor->trace(m_map); | 4604 visitor->trace(m_map); |
| 4605 } | 4605 } |
| 4606 | 4606 |
| 4607 typedef HeapHashMap<WeakMember<IntWrapper>, Member<EphemeronWrapper> > Map; | 4607 typedef HeapHashMap<WeakMember<IntWrapper>, Member<EphemeronWrapper>> Map; |
| 4608 Map& map() { return m_map; } | 4608 Map& map() { return m_map; } |
| 4609 | 4609 |
| 4610 private: | 4610 private: |
| 4611 Map m_map; | 4611 Map m_map; |
| 4612 }; | 4612 }; |
| 4613 | 4613 |
| 4614 TEST(HeapTest, EphemeronsPointToEphemerons) | 4614 TEST(HeapTest, EphemeronsPointToEphemerons) |
| 4615 { | 4615 { |
| 4616 Persistent<IntWrapper> key = IntWrapper::create(42); | 4616 Persistent<IntWrapper> key = IntWrapper::create(42); |
| 4617 Persistent<IntWrapper> key2 = IntWrapper::create(103); | 4617 Persistent<IntWrapper> key2 = IntWrapper::create(103); |
| (...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 4650 EXPECT_EQ(nullptr, wrapper); | 4650 EXPECT_EQ(nullptr, wrapper); |
| 4651 | 4651 |
| 4652 key.clear(); | 4652 key.clear(); |
| 4653 Heap::collectGarbage(ThreadState::NoHeapPointersOnStack); | 4653 Heap::collectGarbage(ThreadState::NoHeapPointersOnStack); |
| 4654 EXPECT_EQ(0u, chain->map().size()); | 4654 EXPECT_EQ(0u, chain->map().size()); |
| 4655 } | 4655 } |
| 4656 | 4656 |
| 4657 TEST(HeapTest, Ephemeron) | 4657 TEST(HeapTest, Ephemeron) |
| 4658 { | 4658 { |
| 4659 typedef HeapHashMap<WeakMember<IntWrapper>, PairWithWeakHandling> WeakPairM
ap; | 4659 typedef HeapHashMap<WeakMember<IntWrapper>, PairWithWeakHandling> WeakPairM
ap; |
| 4660 typedef HeapHashMap<PairWithWeakHandling, WeakMember<IntWrapper> > PairWeak
Map; | 4660 typedef HeapHashMap<PairWithWeakHandling, WeakMember<IntWrapper>> PairWeakM
ap; |
| 4661 typedef HeapHashSet<WeakMember<IntWrapper> > Set; | 4661 typedef HeapHashSet<WeakMember<IntWrapper>> Set; |
| 4662 | 4662 |
| 4663 Persistent<WeakPairMap> weakPairMap = new WeakPairMap(); | 4663 Persistent<WeakPairMap> weakPairMap = new WeakPairMap(); |
| 4664 Persistent<WeakPairMap> weakPairMap2 = new WeakPairMap(); | 4664 Persistent<WeakPairMap> weakPairMap2 = new WeakPairMap(); |
| 4665 Persistent<WeakPairMap> weakPairMap3 = new WeakPairMap(); | 4665 Persistent<WeakPairMap> weakPairMap3 = new WeakPairMap(); |
| 4666 Persistent<WeakPairMap> weakPairMap4 = new WeakPairMap(); | 4666 Persistent<WeakPairMap> weakPairMap4 = new WeakPairMap(); |
| 4667 | 4667 |
| 4668 Persistent<PairWeakMap> pairWeakMap = new PairWeakMap(); | 4668 Persistent<PairWeakMap> pairWeakMap = new PairWeakMap(); |
| 4669 Persistent<PairWeakMap> pairWeakMap2 = new PairWeakMap(); | 4669 Persistent<PairWeakMap> pairWeakMap2 = new PairWeakMap(); |
| 4670 | 4670 |
| 4671 Persistent<Set> set = new Set(); | 4671 Persistent<Set> set = new Set(); |
| (...skipping 76 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 4748 } | 4748 } |
| 4749 | 4749 |
| 4750 IntWrapper* link() { return m_link; } | 4750 IntWrapper* link() { return m_link; } |
| 4751 | 4751 |
| 4752 private: | 4752 private: |
| 4753 Member<IntWrapper> m_link; | 4753 Member<IntWrapper> m_link; |
| 4754 }; | 4754 }; |
| 4755 | 4755 |
| 4756 TEST(HeapTest, IndirectStrongToWeak) | 4756 TEST(HeapTest, IndirectStrongToWeak) |
| 4757 { | 4757 { |
| 4758 typedef HeapHashMap<WeakMember<IntWrapper>, Member<Link1> > Map; | 4758 typedef HeapHashMap<WeakMember<IntWrapper>, Member<Link1>> Map; |
| 4759 Persistent<Map> map = new Map(); | 4759 Persistent<Map> map = new Map(); |
| 4760 Persistent<IntWrapper> deadObject = IntWrapper::create(100); // Named for "D
rowning by Numbers" (1988). | 4760 Persistent<IntWrapper> deadObject = IntWrapper::create(100); // Named for "D
rowning by Numbers" (1988). |
| 4761 Persistent<IntWrapper> lifeObject = IntWrapper::create(42); | 4761 Persistent<IntWrapper> lifeObject = IntWrapper::create(42); |
| 4762 map->add(deadObject, new Link1(deadObject)); | 4762 map->add(deadObject, new Link1(deadObject)); |
| 4763 map->add(lifeObject, new Link1(lifeObject)); | 4763 map->add(lifeObject, new Link1(lifeObject)); |
| 4764 EXPECT_EQ(2u, map->size()); | 4764 EXPECT_EQ(2u, map->size()); |
| 4765 Heap::collectGarbage(ThreadState::NoHeapPointersOnStack); | 4765 Heap::collectGarbage(ThreadState::NoHeapPointersOnStack); |
| 4766 EXPECT_EQ(2u, map->size()); | 4766 EXPECT_EQ(2u, map->size()); |
| 4767 EXPECT_EQ(deadObject, map->get(deadObject)->link()); | 4767 EXPECT_EQ(deadObject, map->get(deadObject)->link()); |
| 4768 EXPECT_EQ(lifeObject, map->get(lifeObject)->link()); | 4768 EXPECT_EQ(lifeObject, map->get(lifeObject)->link()); |
| (...skipping 185 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 4954 | 4954 |
| 4955 // Wait for the worker thread to sweep its heaps before checking. | 4955 // Wait for the worker thread to sweep its heaps before checking. |
| 4956 { | 4956 { |
| 4957 ThreadState::SafePointScope scope(ThreadState::NoHeapPointersOnStack
); | 4957 ThreadState::SafePointScope scope(ThreadState::NoHeapPointersOnStack
); |
| 4958 parkMainThread(); | 4958 parkMainThread(); |
| 4959 } | 4959 } |
| 4960 } | 4960 } |
| 4961 | 4961 |
| 4962 private: | 4962 private: |
| 4963 | 4963 |
| 4964 static HeapHashSet<WeakMember<IntWrapper> >* allocateCollection() | 4964 static HeapHashSet<WeakMember<IntWrapper>>* allocateCollection() |
| 4965 { | 4965 { |
| 4966 // Create a weak collection that is kept alive by a persistent | 4966 // Create a weak collection that is kept alive by a persistent |
| 4967 // and keep the contents alive with a persistents as | 4967 // and keep the contents alive with a persistents as |
| 4968 // well. | 4968 // well. |
| 4969 Persistent<IntWrapper> wrapper1 = IntWrapper::create(32); | 4969 Persistent<IntWrapper> wrapper1 = IntWrapper::create(32); |
| 4970 Persistent<IntWrapper> wrapper2 = IntWrapper::create(32); | 4970 Persistent<IntWrapper> wrapper2 = IntWrapper::create(32); |
| 4971 Persistent<IntWrapper> wrapper3 = IntWrapper::create(32); | 4971 Persistent<IntWrapper> wrapper3 = IntWrapper::create(32); |
| 4972 Persistent<IntWrapper> wrapper4 = IntWrapper::create(32); | 4972 Persistent<IntWrapper> wrapper4 = IntWrapper::create(32); |
| 4973 Persistent<IntWrapper> wrapper5 = IntWrapper::create(32); | 4973 Persistent<IntWrapper> wrapper5 = IntWrapper::create(32); |
| 4974 Persistent<IntWrapper> wrapper6 = IntWrapper::create(32); | 4974 Persistent<IntWrapper> wrapper6 = IntWrapper::create(32); |
| 4975 Persistent<HeapHashSet<WeakMember<IntWrapper> > > weakCollection = new H
eapHashSet<WeakMember<IntWrapper> >; | 4975 Persistent<HeapHashSet<WeakMember<IntWrapper>> > weakCollection = new He
apHashSet<WeakMember<IntWrapper>>; |
| 4976 weakCollection->add(wrapper1); | 4976 weakCollection->add(wrapper1); |
| 4977 weakCollection->add(wrapper2); | 4977 weakCollection->add(wrapper2); |
| 4978 weakCollection->add(wrapper3); | 4978 weakCollection->add(wrapper3); |
| 4979 weakCollection->add(wrapper4); | 4979 weakCollection->add(wrapper4); |
| 4980 weakCollection->add(wrapper5); | 4980 weakCollection->add(wrapper5); |
| 4981 weakCollection->add(wrapper6); | 4981 weakCollection->add(wrapper6); |
| 4982 | 4982 |
| 4983 // Signal the main thread that the worker is done with its allocation. | 4983 // Signal the main thread that the worker is done with its allocation. |
| 4984 wakeMainThread(); | 4984 wakeMainThread(); |
| 4985 | 4985 |
| (...skipping 11 matching lines...) Expand all Loading... |
| 4997 return weakCollection; | 4997 return weakCollection; |
| 4998 } | 4998 } |
| 4999 | 4999 |
| 5000 static void workerThreadMain() | 5000 static void workerThreadMain() |
| 5001 { | 5001 { |
| 5002 MutexLocker locker(workerThreadMutex()); | 5002 MutexLocker locker(workerThreadMutex()); |
| 5003 | 5003 |
| 5004 ThreadState::attach(); | 5004 ThreadState::attach(); |
| 5005 | 5005 |
| 5006 { | 5006 { |
| 5007 Persistent<HeapHashSet<WeakMember<IntWrapper> > > collection = alloc
ateCollection(); | 5007 Persistent<HeapHashSet<WeakMember<IntWrapper>> > collection = alloca
teCollection(); |
| 5008 { | 5008 { |
| 5009 // Prevent weak processing with an iterator and GC. | 5009 // Prevent weak processing with an iterator and GC. |
| 5010 HeapHashSet<WeakMember<IntWrapper> >::iterator it = collection->
begin(); | 5010 HeapHashSet<WeakMember<IntWrapper>>::iterator it = collection->b
egin(); |
| 5011 Heap::collectGarbage(ThreadState::HeapPointersOnStack); | 5011 Heap::collectGarbage(ThreadState::HeapPointersOnStack); |
| 5012 | 5012 |
| 5013 // The backing should be strongified because of the iterator. | 5013 // The backing should be strongified because of the iterator. |
| 5014 EXPECT_EQ(6u, collection->size()); | 5014 EXPECT_EQ(6u, collection->size()); |
| 5015 EXPECT_EQ(32, (*it)->value()); | 5015 EXPECT_EQ(32, (*it)->value()); |
| 5016 } | 5016 } |
| 5017 | 5017 |
| 5018 // Disregarding the iterator but keeping the collection alive | 5018 // Disregarding the iterator but keeping the collection alive |
| 5019 // with a persistent should lead to weak processing. | 5019 // with a persistent should lead to weak processing. |
| 5020 Heap::collectGarbage(ThreadState::NoHeapPointersOnStack); | 5020 Heap::collectGarbage(ThreadState::NoHeapPointersOnStack); |
| (...skipping 157 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 5178 | 5178 |
| 5179 static volatile IntWrapper* s_workerObjectPointer; | 5179 static volatile IntWrapper* s_workerObjectPointer; |
| 5180 }; | 5180 }; |
| 5181 | 5181 |
| 5182 TEST(HeapTest, RecursiveMutex) | 5182 TEST(HeapTest, RecursiveMutex) |
| 5183 { | 5183 { |
| 5184 RecursiveLockingTester::test(); | 5184 RecursiveLockingTester::test(); |
| 5185 } | 5185 } |
| 5186 | 5186 |
| 5187 template<typename T> | 5187 template<typename T> |
| 5188 class TraceIfNeededTester : public GarbageCollectedFinalized<TraceIfNeededTester
<T> > { | 5188 class TraceIfNeededTester : public GarbageCollectedFinalized<TraceIfNeededTester
<T>> { |
| 5189 public: | 5189 public: |
| 5190 static TraceIfNeededTester<T>* create() { return new TraceIfNeededTester<T>(
); } | 5190 static TraceIfNeededTester<T>* create() { return new TraceIfNeededTester<T>(
); } |
| 5191 static TraceIfNeededTester<T>* create(const T& obj) { return new TraceIfNeed
edTester<T>(obj); } | 5191 static TraceIfNeededTester<T>* create(const T& obj) { return new TraceIfNeed
edTester<T>(obj); } |
| 5192 void trace(Visitor* visitor) { TraceIfNeeded<T>::trace(visitor, &m_obj); } | 5192 void trace(Visitor* visitor) { TraceIfNeeded<T>::trace(visitor, &m_obj); } |
| 5193 T& obj() { return m_obj; } | 5193 T& obj() { return m_obj; } |
| 5194 ~TraceIfNeededTester() { } | 5194 ~TraceIfNeededTester() { } |
| 5195 private: | 5195 private: |
| 5196 TraceIfNeededTester() { } | 5196 TraceIfNeededTester() { } |
| 5197 explicit TraceIfNeededTester(const T& obj) : m_obj(obj) { } | 5197 explicit TraceIfNeededTester(const T& obj) : m_obj(obj) { } |
| 5198 T m_obj; | 5198 T m_obj; |
| 5199 }; | 5199 }; |
| 5200 | 5200 |
| 5201 class PartObject { | 5201 class PartObject { |
| 5202 DISALLOW_ALLOCATION(); | 5202 DISALLOW_ALLOCATION(); |
| 5203 public: | 5203 public: |
| 5204 PartObject() : m_obj(SimpleObject::create()) { } | 5204 PartObject() : m_obj(SimpleObject::create()) { } |
| 5205 void trace(Visitor* visitor) { visitor->trace(m_obj); } | 5205 void trace(Visitor* visitor) { visitor->trace(m_obj); } |
| 5206 private: | 5206 private: |
| 5207 Member<SimpleObject> m_obj; | 5207 Member<SimpleObject> m_obj; |
| 5208 }; | 5208 }; |
| 5209 | 5209 |
| 5210 TEST(HeapTest, TraceIfNeeded) | 5210 TEST(HeapTest, TraceIfNeeded) |
| 5211 { | 5211 { |
| 5212 CountingVisitor visitor; | 5212 CountingVisitor visitor; |
| 5213 | 5213 |
| 5214 { | 5214 { |
| 5215 TraceIfNeededTester<RefPtr<OffHeapInt> >* m_offHeap = TraceIfNeededTeste
r<RefPtr<OffHeapInt> >::create(OffHeapInt::create(42)); | 5215 TraceIfNeededTester<RefPtr<OffHeapInt>>* m_offHeap = TraceIfNeededTester
<RefPtr<OffHeapInt>>::create(OffHeapInt::create(42)); |
| 5216 visitor.reset(); | 5216 visitor.reset(); |
| 5217 m_offHeap->trace(&visitor); | 5217 m_offHeap->trace(&visitor); |
| 5218 EXPECT_EQ(0u, visitor.count()); | 5218 EXPECT_EQ(0u, visitor.count()); |
| 5219 } | 5219 } |
| 5220 | 5220 |
| 5221 { | 5221 { |
| 5222 TraceIfNeededTester<PartObject>* m_part = TraceIfNeededTester<PartObject
>::create(); | 5222 TraceIfNeededTester<PartObject>* m_part = TraceIfNeededTester<PartObject
>::create(); |
| 5223 visitor.reset(); | 5223 visitor.reset(); |
| 5224 m_part->trace(&visitor); | 5224 m_part->trace(&visitor); |
| 5225 EXPECT_EQ(1u, visitor.count()); | 5225 EXPECT_EQ(1u, visitor.count()); |
| 5226 } | 5226 } |
| 5227 | 5227 |
| 5228 { | 5228 { |
| 5229 TraceIfNeededTester<Member<SimpleObject> >* m_obj = TraceIfNeededTester<
Member<SimpleObject> >::create(Member<SimpleObject>(SimpleObject::create())); | 5229 TraceIfNeededTester<Member<SimpleObject>>* m_obj = TraceIfNeededTester<M
ember<SimpleObject>>::create(Member<SimpleObject>(SimpleObject::create())); |
| 5230 visitor.reset(); | 5230 visitor.reset(); |
| 5231 m_obj->trace(&visitor); | 5231 m_obj->trace(&visitor); |
| 5232 EXPECT_EQ(1u, visitor.count()); | 5232 EXPECT_EQ(1u, visitor.count()); |
| 5233 } | 5233 } |
| 5234 | 5234 |
| 5235 { | 5235 { |
| 5236 TraceIfNeededTester<HeapVector<Member<SimpleObject> > >* m_vec = TraceIf
NeededTester<HeapVector<Member<SimpleObject> > >::create(); | 5236 TraceIfNeededTester<HeapVector<Member<SimpleObject>> >* m_vec = TraceIfN
eededTester<HeapVector<Member<SimpleObject>> >::create(); |
| 5237 m_vec->obj().append(SimpleObject::create()); | 5237 m_vec->obj().append(SimpleObject::create()); |
| 5238 visitor.reset(); | 5238 visitor.reset(); |
| 5239 m_vec->trace(&visitor); | 5239 m_vec->trace(&visitor); |
| 5240 EXPECT_EQ(2u, visitor.count()); | 5240 EXPECT_EQ(2u, visitor.count()); |
| 5241 } | 5241 } |
| 5242 } | 5242 } |
| 5243 | 5243 |
| 5244 class AllocatesOnAssignment { | 5244 class AllocatesOnAssignment { |
| 5245 public: | 5245 public: |
| 5246 AllocatesOnAssignment(std::nullptr_t) | 5246 AllocatesOnAssignment(std::nullptr_t) |
| (...skipping 284 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 5531 // re-adjusting both start&end indices in terms of that expanded buffer. | 5531 // re-adjusting both start&end indices in terms of that expanded buffer. |
| 5532 EXPECT_EQ(80u, deque->size()); | 5532 EXPECT_EQ(80u, deque->size()); |
| 5533 i = 0; | 5533 i = 0; |
| 5534 for (const auto& intWrapper : *deque) { | 5534 for (const auto& intWrapper : *deque) { |
| 5535 EXPECT_EQ(i + 50, intWrapper->value()); | 5535 EXPECT_EQ(i + 50, intWrapper->value()); |
| 5536 i++; | 5536 i++; |
| 5537 } | 5537 } |
| 5538 } | 5538 } |
| 5539 | 5539 |
| 5540 } // namespace blink | 5540 } // namespace blink |
| OLD | NEW |