| Index: runtime/vm/heap_test.cc
|
| diff --git a/runtime/vm/heap_test.cc b/runtime/vm/heap_test.cc
|
| index 79c0ca983c6993aabf096fe84ee23ef0ce3e719e..1d55a1308b44ae0af26a1ab049ea845243975ff1 100644
|
| --- a/runtime/vm/heap_test.cc
|
| +++ b/runtime/vm/heap_test.cc
|
| @@ -5,6 +5,7 @@
|
| #include "platform/globals.h"
|
|
|
| #include "platform/assert.h"
|
| +#include "vm/become.h"
|
| #include "vm/dart_api_impl.h"
|
| #include "vm/globals.h"
|
| #include "vm/heap.h"
|
| @@ -287,4 +288,80 @@ TEST_CASE(IterateReadOnly) {
|
| EXPECT(heap->Contains(RawObject::ToAddr(obj.raw())));
|
| }
|
|
|
| -} // namespace dart.
|
| +
|
| +void TestBecomeForward(Heap::Space before_space, Heap::Space after_space) {
|
| + Isolate* isolate = Isolate::Current();
|
| + Heap* heap = isolate->heap();
|
| +
|
| + const String& before_obj = String::Handle(String::New("old", before_space));
|
| + const String& after_obj = String::Handle(String::New("new", after_space));
|
| +
|
| + EXPECT(before_obj.raw() != after_obj.raw());
|
| +
|
| + // Allocate the arrays in old space to test the remembered set.
|
| + const Array& before = Array::Handle(Array::New(1, Heap::kOld));
|
| + before.SetAt(0, before_obj);
|
| + const Array& after = Array::Handle(Array::New(1, Heap::kOld));
|
| + after.SetAt(0, after_obj);
|
| +
|
| + Become::ElementsForwardIdentity(before, after);
|
| +
|
| + EXPECT(before_obj.raw() == after_obj.raw());
|
| +
|
| + heap->CollectAllGarbage();
|
| +
|
| + EXPECT(before_obj.raw() == after_obj.raw());
|
| +}
|
| +
|
| +
|
| +VM_TEST_CASE(BecomeFowardOldToOld) {
|
| + TestBecomeForward(Heap::kOld, Heap::kOld);
|
| +}
|
| +
|
| +
|
| +VM_TEST_CASE(BecomeFowardNewToNew) {
|
| + TestBecomeForward(Heap::kNew, Heap::kNew);
|
| +}
|
| +
|
| +
|
| +VM_TEST_CASE(BecomeFowardOldToNew) {
|
| + TestBecomeForward(Heap::kOld, Heap::kNew);
|
| +}
|
| +
|
| +
|
| +VM_TEST_CASE(BecomeFowardNewToOld) {
|
| + TestBecomeForward(Heap::kNew, Heap::kOld);
|
| +}
|
| +
|
| +
|
| +VM_TEST_CASE(BecomeForwardRememberedObject) {
|
| + Isolate* isolate = Isolate::Current();
|
| + Heap* heap = isolate->heap();
|
| +
|
| + const String& new_element = String::Handle(String::New("new", Heap::kNew));
|
| + const String& old_element = String::Handle(String::New("old", Heap::kOld));
|
| + const Array& before_obj = Array::Handle(Array::New(1, Heap::kOld));
|
| + const Array& after_obj = Array::Handle(Array::New(1, Heap::kOld));
|
| + before_obj.SetAt(0, new_element);
|
| + after_obj.SetAt(0, old_element);
|
| + EXPECT(before_obj.raw()->IsRemembered());
|
| + EXPECT(!after_obj.raw()->IsRemembered());
|
| +
|
| + EXPECT(before_obj.raw() != after_obj.raw());
|
| +
|
| + const Array& before = Array::Handle(Array::New(1, Heap::kOld));
|
| + before.SetAt(0, before_obj);
|
| + const Array& after = Array::Handle(Array::New(1, Heap::kOld));
|
| + after.SetAt(0, after_obj);
|
| +
|
| + Become::ElementsForwardIdentity(before, after);
|
| +
|
| + EXPECT(before_obj.raw() == after_obj.raw());
|
| + EXPECT(!after_obj.raw()->IsRemembered());
|
| +
|
| + heap->CollectAllGarbage();
|
| +
|
| + EXPECT(before_obj.raw() == after_obj.raw());
|
| +}
|
| +
|
| +} // namespace dart
|
|
|