Commit 7a99c782 authored by Michael Lippautz's avatar Michael Lippautz Committed by Chromium LUCI CQ

heap: Avoid dynamic allocation of HeapVector

Bug: 1154667
Change-Id: I421ba6c9d6513dae3a66bddfd50a2de67e4046eb
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2571283
Commit-Queue: Michael Lippautz <mlippautz@chromium.org>
Commit-Queue: Anton Bikineev <bikineev@chromium.org>
Auto-Submit: Michael Lippautz <mlippautz@chromium.org>
Reviewed-by: default avatarAnton Bikineev <bikineev@chromium.org>
Cr-Commit-Position: refs/heads/master@{#833291}
parent 185138a3
...@@ -504,79 +504,77 @@ class NonGarbageCollectedContainerRoot { ...@@ -504,79 +504,77 @@ class NonGarbageCollectedContainerRoot {
TEST_F(IncrementalMarkingTest, HeapVectorPushBackMember) { TEST_F(IncrementalMarkingTest, HeapVectorPushBackMember) {
auto* obj = MakeGarbageCollected<Object>(); auto* obj = MakeGarbageCollected<Object>();
auto* vec = MakeGarbageCollected<HeapVector<Member<Object>>>(); HeapVector<Member<Object>> vec;
{ {
ExpectWriteBarrierFires scope(ThreadState::Current(), {obj}); ExpectWriteBarrierFires scope(ThreadState::Current(), {obj});
vec->push_back(obj); vec.push_back(obj);
} }
} }
TEST_F(IncrementalMarkingTest, HeapVectorPushBackNonGCedContainer) { TEST_F(IncrementalMarkingTest, HeapVectorPushBackNonGCedContainer) {
auto* obj = MakeGarbageCollected<Object>(); auto* obj = MakeGarbageCollected<Object>();
auto* vec = MakeGarbageCollected<HeapVector<NonGarbageCollectedContainer>>(); HeapVector<NonGarbageCollectedContainer> vec;
{ {
ExpectWriteBarrierFires scope(ThreadState::Current(), {obj}); ExpectWriteBarrierFires scope(ThreadState::Current(), {obj});
vec->push_back(NonGarbageCollectedContainer(obj, 1)); vec.push_back(NonGarbageCollectedContainer(obj, 1));
} }
} }
TEST_F(IncrementalMarkingTest, HeapVectorPushBackStdPair) { TEST_F(IncrementalMarkingTest, HeapVectorPushBackStdPair) {
auto* obj1 = MakeGarbageCollected<Object>(); auto* obj1 = MakeGarbageCollected<Object>();
auto* obj2 = MakeGarbageCollected<Object>(); auto* obj2 = MakeGarbageCollected<Object>();
auto* vec = MakeGarbageCollected< HeapVector<std::pair<Member<Object>, Member<Object>>> vec;
HeapVector<std::pair<Member<Object>, Member<Object>>>>();
{ {
ExpectWriteBarrierFires scope(ThreadState::Current(), {obj1, obj2}); ExpectWriteBarrierFires scope(ThreadState::Current(), {obj1, obj2});
vec->push_back(std::make_pair(Member<Object>(obj1), Member<Object>(obj2))); vec.push_back(std::make_pair(Member<Object>(obj1), Member<Object>(obj2)));
} }
} }
TEST_F(IncrementalMarkingTest, HeapVectorEmplaceBackMember) { TEST_F(IncrementalMarkingTest, HeapVectorEmplaceBackMember) {
auto* obj = MakeGarbageCollected<Object>(); auto* obj = MakeGarbageCollected<Object>();
auto* vec = MakeGarbageCollected<HeapVector<Member<Object>>>(); HeapVector<Member<Object>> vec;
{ {
ExpectWriteBarrierFires scope(ThreadState::Current(), {obj}); ExpectWriteBarrierFires scope(ThreadState::Current(), {obj});
vec->emplace_back(obj); vec.emplace_back(obj);
} }
} }
TEST_F(IncrementalMarkingTest, HeapVectorEmplaceBackNonGCedContainer) { TEST_F(IncrementalMarkingTest, HeapVectorEmplaceBackNonGCedContainer) {
auto* obj = MakeGarbageCollected<Object>(); auto* obj = MakeGarbageCollected<Object>();
auto* vec = MakeGarbageCollected<HeapVector<NonGarbageCollectedContainer>>(); HeapVector<NonGarbageCollectedContainer> vec;
{ {
ExpectWriteBarrierFires scope(ThreadState::Current(), {obj}); ExpectWriteBarrierFires scope(ThreadState::Current(), {obj});
vec->emplace_back(obj, 1); vec.emplace_back(obj, 1);
} }
} }
TEST_F(IncrementalMarkingTest, HeapVectorEmplaceBackStdPair) { TEST_F(IncrementalMarkingTest, HeapVectorEmplaceBackStdPair) {
auto* obj1 = MakeGarbageCollected<Object>(); auto* obj1 = MakeGarbageCollected<Object>();
auto* obj2 = MakeGarbageCollected<Object>(); auto* obj2 = MakeGarbageCollected<Object>();
auto* vec = MakeGarbageCollected< HeapVector<std::pair<Member<Object>, Member<Object>>> vec;
HeapVector<std::pair<Member<Object>, Member<Object>>>>();
{ {
ExpectWriteBarrierFires scope(ThreadState::Current(), {obj1, obj2}); ExpectWriteBarrierFires scope(ThreadState::Current(), {obj1, obj2});
vec->emplace_back(obj1, obj2); vec.emplace_back(obj1, obj2);
} }
} }
TEST_F(IncrementalMarkingTest, HeapVectorCopyMember) { TEST_F(IncrementalMarkingTest, HeapVectorCopyMember) {
auto* object = MakeGarbageCollected<Object>(); auto* object = MakeGarbageCollected<Object>();
auto* vec1 = MakeGarbageCollected<HeapVector<Member<Object>>>(); HeapVector<Member<Object>> vec1;
vec1->push_back(object); vec1.push_back(object);
{ {
ExpectWriteBarrierFires scope(ThreadState::Current(), {object}); ExpectWriteBarrierFires scope(ThreadState::Current(), {object});
MakeGarbageCollected<HeapVector<Member<Object>>>(*vec1); HeapVector<Member<Object>> vec2(vec1);
} }
} }
TEST_F(IncrementalMarkingTest, HeapVectorCopyNonGCedContainer) { TEST_F(IncrementalMarkingTest, HeapVectorCopyNonGCedContainer) {
auto* obj = MakeGarbageCollected<Object>(); auto* obj = MakeGarbageCollected<Object>();
auto* vec1 = MakeGarbageCollected<HeapVector<NonGarbageCollectedContainer>>(); HeapVector<NonGarbageCollectedContainer> vec1;
vec1->emplace_back(obj, 1); vec1.emplace_back(obj, 1);
{ {
ExpectWriteBarrierFires scope(ThreadState::Current(), {obj}); ExpectWriteBarrierFires scope(ThreadState::Current(), {obj});
MakeGarbageCollected<HeapVector<NonGarbageCollectedContainer>>(*vec1); HeapVector<NonGarbageCollectedContainer> vec2(vec1);
} }
} }
...@@ -584,32 +582,31 @@ TEST_F(IncrementalMarkingTest, HeapVectorCopyStdPair) { ...@@ -584,32 +582,31 @@ TEST_F(IncrementalMarkingTest, HeapVectorCopyStdPair) {
using ValueType = std::pair<Member<Object>, Member<Object>>; using ValueType = std::pair<Member<Object>, Member<Object>>;
auto* obj1 = MakeGarbageCollected<Object>(); auto* obj1 = MakeGarbageCollected<Object>();
auto* obj2 = MakeGarbageCollected<Object>(); auto* obj2 = MakeGarbageCollected<Object>();
auto* vec1 = MakeGarbageCollected<HeapVector<ValueType>>(); HeapVector<ValueType> vec1;
vec1->emplace_back(obj1, obj2); vec1.emplace_back(obj1, obj2);
{ {
ExpectWriteBarrierFires scope(ThreadState::Current(), {obj1, obj2}); ExpectWriteBarrierFires scope(ThreadState::Current(), {obj1, obj2});
MakeGarbageCollected<HeapVector<ValueType>>(*vec1); HeapVector<ValueType> vec2(vec1);
} }
} }
TEST_F(IncrementalMarkingTest, HeapVectorMoveMember) { TEST_F(IncrementalMarkingTest, HeapVectorMoveMember) {
auto* obj = MakeGarbageCollected<Object>(); auto* obj = MakeGarbageCollected<Object>();
auto* vec1 = MakeGarbageCollected<HeapVector<Member<Object>>>(); HeapVector<Member<Object>> vec1;
vec1->push_back(obj); vec1.push_back(obj);
{ {
ExpectWriteBarrierFires scope(ThreadState::Current(), {obj}); ExpectWriteBarrierFires scope(ThreadState::Current(), {obj});
MakeGarbageCollected<HeapVector<Member<Object>>>(std::move(*vec1)); HeapVector<Member<Object>> vec2(std::move(vec1));
} }
} }
TEST_F(IncrementalMarkingTest, HeapVectorMoveNonGCedContainer) { TEST_F(IncrementalMarkingTest, HeapVectorMoveNonGCedContainer) {
auto* obj = MakeGarbageCollected<Object>(); auto* obj = MakeGarbageCollected<Object>();
auto* vec1 = MakeGarbageCollected<HeapVector<NonGarbageCollectedContainer>>(); HeapVector<NonGarbageCollectedContainer> vec1;
vec1->emplace_back(obj, 1); vec1.emplace_back(obj, 1);
{ {
ExpectWriteBarrierFires scope(ThreadState::Current(), {obj}); ExpectWriteBarrierFires scope(ThreadState::Current(), {obj});
MakeGarbageCollected<HeapVector<NonGarbageCollectedContainer>>( HeapVector<NonGarbageCollectedContainer> vec2(std::move(vec1));
std::move(*vec1));
} }
} }
...@@ -1750,8 +1747,7 @@ TEST_F(IncrementalMarkingTest, HeapCompactWithStaleSlotInNestedContainer) { ...@@ -1750,8 +1747,7 @@ TEST_F(IncrementalMarkingTest, HeapCompactWithStaleSlotInNestedContainer) {
using Nested = HeapVector<HeapVector<Member<Object>>>; using Nested = HeapVector<HeapVector<Member<Object>>>;
// Allocate dummy storage so that other vector backings are actually moved. // Allocate dummy storage so that other vector backings are actually moved.
MakeGarbageCollected<HeapVector<Member<Object>>>()->push_back( HeapVector<Member<Object>> unused{MakeGarbageCollected<Object>()};
MakeGarbageCollected<Object>());
IncrementalMarkingTestDriver driver(ThreadState::Current()); IncrementalMarkingTestDriver driver(ThreadState::Current());
ThreadState::Current()->EnableCompactionForNextGCForTesting(); ThreadState::Current()->EnableCompactionForNextGCForTesting();
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment