Chromium Code Reviews| Index: Source/heap/HeapTest.cpp |
| diff --git a/Source/heap/HeapTest.cpp b/Source/heap/HeapTest.cpp |
| index 55c02897339210f1bcf493a0f381655c4be1f686..c3c9b245ccf52f6fe676490fe56c8e3b99a46e43 100644 |
| --- a/Source/heap/HeapTest.cpp |
| +++ b/Source/heap/HeapTest.cpp |
| @@ -932,6 +932,44 @@ private: |
| bool m_didCallWillFinalize; |
| }; |
| +class FinalizationObserverWithHashMap { |
| +public: |
| + typedef HeapHashMap<WeakMember<Observable>, OwnPtr<FinalizationObserverWithHashMap> > ObserverMap; |
| + |
| + FinalizationObserverWithHashMap(Observable& target) : m_target(target) { } |
|
haraken
2014/03/19 08:28:12
Add explicit.
tkent
2014/03/19 08:52:52
Done.
|
| + ~FinalizationObserverWithHashMap() |
| + { |
| + m_target.willFinalize(); |
| + s_didCallWillFinalize = true; |
| + } |
| + |
| + static ObserverMap& observe(Observable& target) |
| + { |
| + ObserverMap& map = observers(); |
| + ObserverMap::AddResult result = map.add(&target, nullptr); |
| + if (result.isNewEntry) |
| + result.storedValue->value = adoptPtr(new FinalizationObserverWithHashMap(target)); |
| + else |
| + ASSERT(result.storedValue->value); |
| + return map; |
| + } |
| + |
| + static bool s_didCallWillFinalize; |
| + |
| +private: |
| + static ObserverMap& observers() |
| + { |
| + DEFINE_STATIC_LOCAL(Persistent<ObserverMap>, observerMap, ()); |
| + if (!observerMap) |
| + observerMap = new ObserverMap(); |
| + return *observerMap; |
| + } |
| + |
| + Observable& m_target; |
| +}; |
| + |
| +bool FinalizationObserverWithHashMap::s_didCallWillFinalize = false; |
| + |
| class SuperClass; |
| class PointsBack : public RefCountedWillBeGarbageCollectedFinalized<PointsBack> { |
| @@ -2631,6 +2669,18 @@ TEST(HeapTest, FinalizationObserver) |
| Heap::collectGarbage(ThreadState::NoHeapPointersOnStack); |
| EXPECT_EQ(0u, Bar::s_live); |
| EXPECT_TRUE(o->didCallWillFinalize()); |
| + |
| + FinalizationObserverWithHashMap::s_didCallWillFinalize = false; |
| + Observable* foo = Observable::create(Bar::create()); |
| + FinalizationObserverWithHashMap::ObserverMap& map = FinalizationObserverWithHashMap::observe(*foo); |
| + EXPECT_EQ(1u, map.size()); |
| + foo = 0; |
| + // FinalizationObserverWithHashMap doesn't have a strong reference to |
| + // |foo|. So |foo| and its member will be collected. |
| + Heap::collectGarbage(ThreadState::NoHeapPointersOnStack); |
| + EXPECT_EQ(0u, Bar::s_live); |
| + EXPECT_EQ(0u, map.size()); |
| + EXPECT_TRUE(FinalizationObserverWithHashMap::s_didCallWillFinalize); |
| } |
| TEST(HeapTest, Comparisons) |