| Index: runtime/vm/heap_test.cc
|
| diff --git a/runtime/vm/heap_test.cc b/runtime/vm/heap_test.cc
|
| index b594807cf850a2517afe6b10f50ed664c22c5e3d..8c616d3f01fb35552cdc0e09937eb90ee4dc286c 100644
|
| --- a/runtime/vm/heap_test.cc
|
| +++ b/runtime/vm/heap_test.cc
|
| @@ -363,4 +363,212 @@ ISOLATE_UNIT_TEST_CASE(BecomeForwardRememberedObject) {
|
| EXPECT(before_obj.raw() == after_obj.raw());
|
| }
|
|
|
| +
|
| +ISOLATE_UNIT_TEST_CASE(CollectAllGarbage_DeadOldToNew) {
|
| + Isolate* isolate = Isolate::Current();
|
| + Heap* heap = isolate->heap();
|
| +
|
| + heap->CollectAllGarbage();
|
| + intptr_t size_before =
|
| + heap->new_space()->UsedInWords() + heap->old_space()->UsedInWords();
|
| +
|
| + Array& old = Array::Handle(Array::New(1, Heap::kOld));
|
| + Array& neu = Array::Handle(Array::New(1, Heap::kNew));
|
| + old.SetAt(0, neu);
|
| + old = Array::null();
|
| + neu = Array::null();
|
| +
|
| + heap->CollectAllGarbage();
|
| +
|
| + intptr_t size_after =
|
| + heap->new_space()->UsedInWords() + heap->old_space()->UsedInWords();
|
| +
|
| + EXPECT(size_before == size_after);
|
| +}
|
| +
|
| +
|
| +ISOLATE_UNIT_TEST_CASE(CollectAllGarbage_DeadNewToOld) {
|
| + Isolate* isolate = Isolate::Current();
|
| + Heap* heap = isolate->heap();
|
| +
|
| + heap->CollectAllGarbage();
|
| + intptr_t size_before =
|
| + heap->new_space()->UsedInWords() + heap->old_space()->UsedInWords();
|
| +
|
| + Array& old = Array::Handle(Array::New(1, Heap::kOld));
|
| + Array& neu = Array::Handle(Array::New(1, Heap::kNew));
|
| + neu.SetAt(0, old);
|
| + old = Array::null();
|
| + neu = Array::null();
|
| +
|
| + heap->CollectAllGarbage();
|
| +
|
| + intptr_t size_after =
|
| + heap->new_space()->UsedInWords() + heap->old_space()->UsedInWords();
|
| +
|
| + EXPECT(size_before == size_after);
|
| +}
|
| +
|
| +
|
| +ISOLATE_UNIT_TEST_CASE(CollectAllGarbage_DeadGenCycle) {
|
| + Isolate* isolate = Isolate::Current();
|
| + Heap* heap = isolate->heap();
|
| +
|
| + heap->CollectAllGarbage();
|
| + intptr_t size_before =
|
| + heap->new_space()->UsedInWords() + heap->old_space()->UsedInWords();
|
| +
|
| + Array& old = Array::Handle(Array::New(1, Heap::kOld));
|
| + Array& neu = Array::Handle(Array::New(1, Heap::kNew));
|
| + neu.SetAt(0, old);
|
| + old.SetAt(0, neu);
|
| + old = Array::null();
|
| + neu = Array::null();
|
| +
|
| + heap->CollectAllGarbage();
|
| +
|
| + intptr_t size_after =
|
| + heap->new_space()->UsedInWords() + heap->old_space()->UsedInWords();
|
| +
|
| + EXPECT(size_before == size_after);
|
| +}
|
| +
|
| +
|
| +ISOLATE_UNIT_TEST_CASE(CollectAllGarbage_LiveNewToOld) {
|
| + Isolate* isolate = Isolate::Current();
|
| + Heap* heap = isolate->heap();
|
| +
|
| + heap->CollectAllGarbage();
|
| + intptr_t size_before =
|
| + heap->new_space()->UsedInWords() + heap->old_space()->UsedInWords();
|
| +
|
| + Array& old = Array::Handle(Array::New(1, Heap::kOld));
|
| + Array& neu = Array::Handle(Array::New(1, Heap::kNew));
|
| + neu.SetAt(0, old);
|
| + old = Array::null();
|
| +
|
| + heap->CollectAllGarbage();
|
| +
|
| + intptr_t size_after =
|
| + heap->new_space()->UsedInWords() + heap->old_space()->UsedInWords();
|
| +
|
| + EXPECT(size_before < size_after);
|
| +}
|
| +
|
| +
|
| +ISOLATE_UNIT_TEST_CASE(CollectAllGarbage_LiveOldToNew) {
|
| + Isolate* isolate = Isolate::Current();
|
| + Heap* heap = isolate->heap();
|
| +
|
| + heap->CollectAllGarbage();
|
| + intptr_t size_before =
|
| + heap->new_space()->UsedInWords() + heap->old_space()->UsedInWords();
|
| +
|
| + Array& old = Array::Handle(Array::New(1, Heap::kOld));
|
| + Array& neu = Array::Handle(Array::New(1, Heap::kNew));
|
| + old.SetAt(0, neu);
|
| + neu = Array::null();
|
| +
|
| + heap->CollectAllGarbage();
|
| +
|
| + intptr_t size_after =
|
| + heap->new_space()->UsedInWords() + heap->old_space()->UsedInWords();
|
| +
|
| + EXPECT(size_before < size_after);
|
| +}
|
| +
|
| +
|
| +ISOLATE_UNIT_TEST_CASE(CollectAllGarbage_LiveOldDeadNew) {
|
| + Isolate* isolate = Isolate::Current();
|
| + Heap* heap = isolate->heap();
|
| +
|
| + heap->CollectAllGarbage();
|
| + intptr_t size_before =
|
| + heap->new_space()->UsedInWords() + heap->old_space()->UsedInWords();
|
| +
|
| + Array& old = Array::Handle(Array::New(1, Heap::kOld));
|
| + Array& neu = Array::Handle(Array::New(1, Heap::kNew));
|
| + neu = Array::null();
|
| + old.SetAt(0, old);
|
| +
|
| + heap->CollectAllGarbage();
|
| +
|
| + intptr_t size_after =
|
| + heap->new_space()->UsedInWords() + heap->old_space()->UsedInWords();
|
| +
|
| + EXPECT(size_before < size_after);
|
| +}
|
| +
|
| +
|
| +ISOLATE_UNIT_TEST_CASE(CollectAllGarbage_LiveNewDeadOld) {
|
| + Isolate* isolate = Isolate::Current();
|
| + Heap* heap = isolate->heap();
|
| +
|
| + heap->CollectAllGarbage();
|
| + intptr_t size_before =
|
| + heap->new_space()->UsedInWords() + heap->old_space()->UsedInWords();
|
| +
|
| + Array& old = Array::Handle(Array::New(1, Heap::kOld));
|
| + Array& neu = Array::Handle(Array::New(1, Heap::kNew));
|
| + old = Array::null();
|
| + neu.SetAt(0, neu);
|
| +
|
| + heap->CollectAllGarbage();
|
| +
|
| + intptr_t size_after =
|
| + heap->new_space()->UsedInWords() + heap->old_space()->UsedInWords();
|
| +
|
| + EXPECT(size_before < size_after);
|
| +}
|
| +
|
| +
|
| +ISOLATE_UNIT_TEST_CASE(CollectAllGarbage_LiveNewToOldChain) {
|
| + Isolate* isolate = Isolate::Current();
|
| + Heap* heap = isolate->heap();
|
| +
|
| + heap->CollectAllGarbage();
|
| + intptr_t size_before =
|
| + heap->new_space()->UsedInWords() + heap->old_space()->UsedInWords();
|
| +
|
| + Array& old = Array::Handle(Array::New(1, Heap::kOld));
|
| + Array& old2 = Array::Handle(Array::New(1, Heap::kOld));
|
| + Array& neu = Array::Handle(Array::New(1, Heap::kNew));
|
| + old.SetAt(0, old2);
|
| + neu.SetAt(0, old);
|
| + old = Array::null();
|
| + old2 = Array::null();
|
| +
|
| + heap->CollectAllGarbage();
|
| +
|
| + intptr_t size_after =
|
| + heap->new_space()->UsedInWords() + heap->old_space()->UsedInWords();
|
| +
|
| + EXPECT(size_before < size_after);
|
| +}
|
| +
|
| +
|
| +ISOLATE_UNIT_TEST_CASE(CollectAllGarbage_LiveOldToNewChain) {
|
| + Isolate* isolate = Isolate::Current();
|
| + Heap* heap = isolate->heap();
|
| +
|
| + heap->CollectAllGarbage();
|
| + intptr_t size_before =
|
| + heap->new_space()->UsedInWords() + heap->old_space()->UsedInWords();
|
| +
|
| + Array& old = Array::Handle(Array::New(1, Heap::kOld));
|
| + Array& neu = Array::Handle(Array::New(1, Heap::kNew));
|
| + Array& neu2 = Array::Handle(Array::New(1, Heap::kOld));
|
| + neu.SetAt(0, neu2);
|
| + old.SetAt(0, neu);
|
| + neu = Array::null();
|
| + neu2 = Array::null();
|
| +
|
| + heap->CollectAllGarbage();
|
| +
|
| + intptr_t size_after =
|
| + heap->new_space()->UsedInWords() + heap->old_space()->UsedInWords();
|
| +
|
| + EXPECT(size_before < size_after);
|
| +}
|
| +
|
| } // namespace dart
|
|
|