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 |