Index: third_party/WebKit/Source/platform/heap/HeapTest.cpp |
diff --git a/third_party/WebKit/Source/platform/heap/HeapTest.cpp b/third_party/WebKit/Source/platform/heap/HeapTest.cpp |
index 37e9aaef365e79ab770e66f8da9db5098621eab5..5916802ec5c1e3dfab0b0a7cb9302b8bdd2fcdfe 100644 |
--- a/third_party/WebKit/Source/platform/heap/HeapTest.cpp |
+++ b/third_party/WebKit/Source/platform/heap/HeapTest.cpp |
@@ -1499,6 +1499,117 @@ class PreFinalizationAllocator |
Persistent<IntWrapper>* wrapper_; |
}; |
+class PreFinalizerBackingShrinkForbidden |
+ : public GarbageCollectedFinalized<PreFinalizerBackingShrinkForbidden> { |
+ USING_PRE_FINALIZER(PreFinalizerBackingShrinkForbidden, Dispose); |
+ |
+ public: |
+ PreFinalizerBackingShrinkForbidden() { |
+ for (int i = 0; i < 32; ++i) { |
+ vector_.push_back(new IntWrapper(i)); |
+ } |
+ EXPECT_LT(31ul, vector_.Capacity()); |
+ |
+ for (int i = 0; i < 32; ++i) { |
+ map_.insert(i + 1, new IntWrapper(i + 1)); |
+ } |
+ EXPECT_LT(31ul, map_.Capacity()); |
+ } |
+ |
+ void Dispose() { |
+ // Remove elemets so that vector_ will try to shrink. |
+ for (int i = 0; i < 32; ++i) { |
+ vector_.pop_back(); |
+ } |
+ // Check that vector_ hasn't shrunk. |
+ EXPECT_LT(31ul, map_.Capacity()); |
+ |
+ // Remove elemets so that map_ will try to shrink. |
+ for (int i = 0; i < 32; ++i) { |
+ map_.erase(i + 1); |
+ } |
+ // Check that map_ hasn't shrunk. |
+ EXPECT_LT(31ul, map_.Capacity()); |
+ // Just releasing the backing is allowed. |
+ map_.Clear(); |
+ EXPECT_EQ(0ul, map_.Capacity()); |
+ } |
+ |
+ DEFINE_INLINE_TRACE() { |
+ visitor->Trace(vector_); |
+ visitor->Trace(map_); |
+ } |
+ |
+ private: |
+ HeapVector<Member<IntWrapper>> vector_; |
+ HeapHashMap<int, Member<IntWrapper>> map_; |
+}; |
+ |
+TEST(HeapTest, PreFinalizerBackingShrinkForbidden) { |
+ new PreFinalizerBackingShrinkForbidden(); |
+ PreciselyCollectGarbage(); |
+} |
+ |
+class PreFinalizerVectorBackingExpandForbidden |
+ : public GarbageCollectedFinalized< |
+ PreFinalizerVectorBackingExpandForbidden> { |
+ USING_PRE_FINALIZER(PreFinalizerVectorBackingExpandForbidden, Dispose); |
+ |
+ public: |
+ PreFinalizerVectorBackingExpandForbidden() { |
+ vector_.push_back(new IntWrapper(1)); |
+ } |
+ |
+ void Dispose() { EXPECT_DEATH(Test(), ""); } |
+ |
+ void Test() { |
+ // vector_'s backing will need to expand. |
+ for (int i = 0; i < 32; ++i) { |
+ vector_.push_back(nullptr); |
+ } |
+ } |
+ |
+ DEFINE_INLINE_TRACE() { visitor->Trace(vector_); } |
+ |
+ private: |
+ HeapVector<Member<IntWrapper>> vector_; |
+}; |
+ |
+TEST(HeapDeathTest, PreFinalizerVectorBackingExpandForbidden) { |
+ new PreFinalizerVectorBackingExpandForbidden(); |
+ PreciselyCollectGarbage(); |
+} |
+ |
+class PreFinalizerHashTableBackingExpandForbidden |
+ : public GarbageCollectedFinalized< |
+ PreFinalizerHashTableBackingExpandForbidden> { |
+ USING_PRE_FINALIZER(PreFinalizerHashTableBackingExpandForbidden, Dispose); |
+ |
+ public: |
+ PreFinalizerHashTableBackingExpandForbidden() { |
+ map_.insert(123, new IntWrapper(123)); |
+ } |
+ |
+ void Dispose() { EXPECT_DEATH(Test(), ""); } |
+ |
+ void Test() { |
+ // map_'s backing will need to expand. |
+ for (int i = 1; i < 32; ++i) { |
+ map_.insert(i, nullptr); |
+ } |
+ } |
+ |
+ DEFINE_INLINE_TRACE() { visitor->Trace(map_); } |
+ |
+ private: |
+ HeapHashMap<int, Member<IntWrapper>> map_; |
+}; |
+ |
+TEST(HeapDeathTest, PreFinalizerHashTableBackingExpandForbidden) { |
+ new PreFinalizerHashTableBackingExpandForbidden(); |
+ PreciselyCollectGarbage(); |
+} |
+ |
TEST(HeapTest, Transition) { |
{ |
RefCountedAndGarbageCollected::destructor_calls_ = 0; |