Chromium Code Reviews| Index: runtime/vm/dart_api_impl_test.cc |
| diff --git a/runtime/vm/dart_api_impl_test.cc b/runtime/vm/dart_api_impl_test.cc |
| index 0097b67a2a2312ba4faacd578edbfc5856745c17..e409c934573c0c1693a0f371fadfa868095d177a 100644 |
| --- a/runtime/vm/dart_api_impl_test.cc |
| +++ b/runtime/vm/dart_api_impl_test.cc |
| @@ -6532,6 +6532,335 @@ TEST_CASE(NewString_Null) { |
| } |
| +// Allocates an object in new space and assigns it a peer. Removes |
| +// the peer and check that the count of peer objects is decremented by |
|
siva
2012/09/14 00:03:46
checks
cshapiro
2012/09/15 01:23:41
Done.
|
| +// one. |
| +TEST_CASE(OneNewSpacePeer) { |
| + Isolate* isolate = Isolate::Current(); |
| + Dart_Handle str = Dart_NewString("a string"); |
| + EXPECT_VALID(str); |
| + EXPECT(Dart_IsString(str)); |
| + EXPECT(!Dart_HasPeer(str)); |
| + EXPECT_EQ(0, isolate->heap()->PeerCount()); |
| + void* out = &out; |
| + EXPECT(Dart_IsError(Dart_GetPeer(str, &out))); |
| + EXPECT(out == NULL); |
| + int peer = 1234; |
| + EXPECT_VALID(Dart_SetPeer(str, &peer)); |
| + EXPECT(Dart_HasPeer(str)); |
| + EXPECT_EQ(1, isolate->heap()->PeerCount()); |
| + EXPECT_VALID(Dart_GetPeer(str, &out)); |
| + EXPECT(out == reinterpret_cast<void*>(&peer)); |
| + EXPECT_VALID(Dart_SetPeer(str, NULL)); |
| + EXPECT(!Dart_HasPeer(str)); |
| + EXPECT_EQ(0, isolate->heap()->PeerCount()); |
| +} |
| + |
| + |
| +// Allocates an object in old space and assigns it a peer. Allow the |
|
siva
2012/09/14 00:03:46
in new space
cshapiro
2012/09/15 01:23:41
Done.
|
| +// peer referent to be garbage collected and check that the count of |
| +// peer objects is decremented by one. |
| +TEST_CASE(CollectOneNewSpacePeer) { |
| + Isolate* isolate = Isolate::Current(); |
| + Dart_EnterScope(); |
| + { |
| + DARTSCOPE_NOCHECKS(isolate); |
| + Dart_Handle str = Dart_NewString("a string"); |
| + EXPECT_VALID(str); |
| + EXPECT(Dart_IsString(str)); |
| + EXPECT(!Dart_HasPeer(str)); |
| + EXPECT_EQ(0, isolate->heap()->PeerCount()); |
| + void* out = &out; |
| + EXPECT(Dart_IsError(Dart_GetPeer(str, &out))); |
| + EXPECT(out == NULL); |
| + int peer = 1234; |
| + EXPECT_VALID(Dart_SetPeer(str, &peer)); |
| + EXPECT(Dart_HasPeer(str)); |
| + EXPECT_EQ(1, isolate->heap()->PeerCount()); |
| + EXPECT_VALID(Dart_GetPeer(str, &out)); |
| + EXPECT(out == reinterpret_cast<void*>(&peer)); |
| + isolate->heap()->CollectGarbage(Heap::kNew); |
| + EXPECT(Dart_HasPeer(str)); |
| + EXPECT_EQ(1, isolate->heap()->PeerCount()); |
| + EXPECT_VALID(Dart_GetPeer(str, &out)); |
| + EXPECT(out == reinterpret_cast<void*>(&peer)); |
| + } |
| + Dart_ExitScope(); |
| + isolate->heap()->CollectGarbage(Heap::kNew); |
| + EXPECT_EQ(0, isolate->heap()->PeerCount()); |
| +} |
| + |
| + |
| +// Allocates two objects in old space and assigns them peers. Removes |
|
siva
2012/09/14 00:03:46
in new space
cshapiro
2012/09/15 01:23:41
Done.
|
| +// the peers and check that the count of peer objects is decremented |
| +// by two. |
| +TEST_CASE(TwoNewSpacePeers) { |
| + Isolate* isolate = Isolate::Current(); |
| + Dart_Handle s1 = Dart_NewString("s1"); |
| + EXPECT_VALID(s1); |
| + EXPECT(Dart_IsString(s1)); |
| + EXPECT(!Dart_HasPeer(s1)); |
| + EXPECT_EQ(0, isolate->heap()->PeerCount()); |
| + void* o1 = &o1; |
| + EXPECT(Dart_IsError(Dart_GetPeer(s1, &o1))); |
| + EXPECT(o1 == NULL); |
| + int p1 = 1234; |
| + EXPECT_VALID(Dart_SetPeer(s1, &p1)); |
| + EXPECT(Dart_HasPeer(s1)); |
| + EXPECT_EQ(1, isolate->heap()->PeerCount()); |
| + EXPECT_VALID(Dart_GetPeer(s1, &o1)); |
| + EXPECT(o1 == reinterpret_cast<void*>(&p1)); |
| + Dart_Handle s2 = Dart_NewString("a string"); |
| + EXPECT_VALID(s2); |
| + EXPECT(Dart_IsString(s2)); |
| + EXPECT(!Dart_HasPeer(s2)); |
| + EXPECT_EQ(1, isolate->heap()->PeerCount()); |
| + void* o2 = &o2; |
| + EXPECT(Dart_IsError(Dart_GetPeer(s2, &o2))); |
| + EXPECT(o2 == NULL); |
| + int p2 = 5678; |
| + EXPECT_VALID(Dart_SetPeer(s2, &p2)); |
| + EXPECT(Dart_HasPeer(s2)); |
| + EXPECT_EQ(2, isolate->heap()->PeerCount()); |
| + EXPECT_VALID(Dart_GetPeer(s2, &o2)); |
| + EXPECT(o2 == reinterpret_cast<void*>(&p2)); |
| + EXPECT_VALID(Dart_SetPeer(s1, NULL)); |
| + EXPECT(!Dart_HasPeer(s1)); |
| + EXPECT_EQ(1, isolate->heap()->PeerCount()); |
| + EXPECT(Dart_IsError(Dart_GetPeer(s1, &o1))); |
| + EXPECT_VALID(Dart_SetPeer(s2, NULL)); |
| + EXPECT(!Dart_HasPeer(s2)); |
| + EXPECT_EQ(0, isolate->heap()->PeerCount()); |
| + EXPECT(Dart_IsError(Dart_GetPeer(s2, &o2))); |
| +} |
| + |
| + |
| +// Allocates two objects in new space and assigns them a peer. Allow |
| +// the peer referents to be garbage collected and check that the count |
| +// of peer objects is decremented by two. |
| +TEST_CASE(CollectTwoNewSpacePeers) { |
| + Isolate* isolate = Isolate::Current(); |
| + Dart_EnterScope(); |
| + { |
| + DARTSCOPE_NOCHECKS(isolate); |
| + Dart_Handle s1 = Dart_NewString("s1"); |
| + EXPECT_VALID(s1); |
| + EXPECT(Dart_IsString(s1)); |
| + EXPECT(!Dart_HasPeer(s1)); |
| + EXPECT_EQ(0, isolate->heap()->PeerCount()); |
| + void* o1 = &o1; |
| + EXPECT(Dart_IsError(Dart_GetPeer(s1, &o1))); |
| + EXPECT(o1 == NULL); |
| + int p1 = 1234; |
| + EXPECT_VALID(Dart_SetPeer(s1, &p1)); |
| + EXPECT(Dart_HasPeer(s1)); |
| + EXPECT_EQ(1, isolate->heap()->PeerCount()); |
| + EXPECT_VALID(Dart_GetPeer(s1, &o1)); |
| + EXPECT(o1 == reinterpret_cast<void*>(&p1)); |
| + Dart_Handle s2 = Dart_NewString("s2"); |
| + EXPECT_VALID(s2); |
| + EXPECT(Dart_IsString(s2)); |
| + EXPECT(!Dart_HasPeer(s2)); |
| + EXPECT_EQ(1, isolate->heap()->PeerCount()); |
| + void* o2 = &o2; |
| + EXPECT(Dart_IsError(Dart_GetPeer(s2, &o2))); |
| + EXPECT(o2 == NULL); |
| + int p2 = 5678; |
| + EXPECT_VALID(Dart_SetPeer(s2, &p2)); |
| + EXPECT(Dart_HasPeer(s2)); |
| + EXPECT_EQ(2, isolate->heap()->PeerCount()); |
| + EXPECT_VALID(Dart_GetPeer(s2, &o2)); |
| + EXPECT(o2 == reinterpret_cast<void*>(&p2)); |
| + } |
| + Dart_ExitScope(); |
| + isolate->heap()->CollectGarbage(Heap::kNew); |
| + EXPECT_EQ(0, isolate->heap()->PeerCount()); |
| +} |
| + |
|
siva
2012/09/14 00:03:46
I think we also need a test case where the object
cshapiro
2012/09/15 01:23:41
Good idea. Done.
|
| + |
| +// Allocates an object in new space and assigns it a peer. Promotes |
| +// the peer to old space. Removes the peer and check that the count |
| +// of peer objects is decremented by one. |
| +TEST_CASE(OnePromotedPeer) { |
| + Isolate* isolate = Isolate::Current(); |
| + Dart_Handle str = Dart_NewString("a string"); |
| + EXPECT_VALID(str); |
| + EXPECT(Dart_IsString(str)); |
| + EXPECT(!Dart_HasPeer(str)); |
| + EXPECT_EQ(0, isolate->heap()->PeerCount()); |
| + void* out = &out; |
| + EXPECT(Dart_IsError(Dart_GetPeer(str, &out))); |
| + EXPECT(out == NULL); |
| + int peer = 1234; |
| + EXPECT_VALID(Dart_SetPeer(str, &peer)); |
| + EXPECT(Dart_HasPeer(str)); |
| + EXPECT_EQ(1, isolate->heap()->PeerCount()); |
| + isolate->heap()->CollectGarbage(Heap::kNew); |
| + isolate->heap()->CollectGarbage(Heap::kNew); |
| + { |
| + DARTSCOPE_NOCHECKS(isolate); |
| + String& handle = String::Handle(); |
| + handle ^= Api::UnwrapHandle(str); |
| + EXPECT(handle.IsOld()); |
| + } |
| + EXPECT_VALID(Dart_GetPeer(str, &out)); |
| + EXPECT(out == reinterpret_cast<void*>(&peer)); |
|
siva
2012/09/14 00:03:46
EXPECT_EQ(1, isolate->heap()->PeerCount());
To ch
cshapiro
2012/09/15 01:23:41
Good idea. Done.
|
| + EXPECT_VALID(Dart_SetPeer(str, NULL)); |
| + EXPECT(!Dart_HasPeer(str)); |
| + EXPECT_EQ(0, isolate->heap()->PeerCount()); |
| +} |
| + |
| + |
| +// Allocates an object in old space and assigns it a peer. Removes |
| +// the peer and check that the count of peer objects is decremented by |
| +// one. |
| +TEST_CASE(OneOldSpacePeer) { |
|
siva
2012/09/14 00:03:46
The code below is identical to the one in OneNewSp
cshapiro
2012/09/15 01:23:41
We could. But, I expect this to acquire space-spe
|
| + Isolate* isolate = Isolate::Current(); |
| + Dart_Handle str = Api::NewHandle(isolate, String::New("str", Heap::kOld)); |
| + EXPECT_VALID(str); |
| + EXPECT(Dart_IsString(str)); |
| + EXPECT(!Dart_HasPeer(str)); |
| + EXPECT_EQ(0, isolate->heap()->PeerCount()); |
| + void* out = &out; |
| + EXPECT(Dart_IsError(Dart_GetPeer(str, &out))); |
| + EXPECT(out == NULL); |
| + int peer = 1234; |
| + EXPECT_VALID(Dart_SetPeer(str, &peer)); |
| + EXPECT(Dart_HasPeer(str)); |
| + EXPECT_EQ(1, isolate->heap()->PeerCount()); |
| + EXPECT_VALID(Dart_GetPeer(str, &out)); |
| + EXPECT(out == reinterpret_cast<void*>(&peer)); |
| + isolate->heap()->CollectGarbage(Heap::kOld); |
| + EXPECT(Dart_HasPeer(str)); |
| + EXPECT_EQ(1, isolate->heap()->PeerCount()); |
| + EXPECT_VALID(Dart_GetPeer(str, &out)); |
| + EXPECT(out == reinterpret_cast<void*>(&peer)); |
| + EXPECT_VALID(Dart_SetPeer(str, NULL)); |
| + EXPECT(!Dart_HasPeer(str)); |
| + EXPECT_EQ(0, isolate->heap()->PeerCount()); |
| +} |
| + |
| + |
| +// Allocates an object in old space and assigns it a peer. Allow the |
| +// peer referent to be garbage collected and check that the count of |
| +// peer objects is decremented by one. |
| +TEST_CASE(CollectOneOldSpacePeer) { |
|
siva
2012/09/14 00:03:46
Ditto comment about sharing with CollectOneNewSpac
|
| + Isolate* isolate = Isolate::Current(); |
| + Dart_EnterScope(); |
| + { |
| + DARTSCOPE_NOCHECKS(isolate); |
| + Dart_Handle str = Api::NewHandle(isolate, String::New("str", Heap::kOld)); |
| + EXPECT_VALID(str); |
| + EXPECT(Dart_IsString(str)); |
| + EXPECT(!Dart_HasPeer(str)); |
| + EXPECT_EQ(0, isolate->heap()->PeerCount()); |
| + void* out = &out; |
| + EXPECT(Dart_IsError(Dart_GetPeer(str, &out))); |
| + EXPECT(out == NULL); |
| + int peer = 1234; |
| + EXPECT_VALID(Dart_SetPeer(str, &peer)); |
| + EXPECT(Dart_HasPeer(str)); |
| + EXPECT_EQ(1, isolate->heap()->PeerCount()); |
| + EXPECT_VALID(Dart_GetPeer(str, &out)); |
| + EXPECT(out == reinterpret_cast<void*>(&peer)); |
| + isolate->heap()->CollectGarbage(Heap::kOld); |
| + EXPECT(Dart_HasPeer(str)); |
| + EXPECT_EQ(1, isolate->heap()->PeerCount()); |
| + EXPECT_VALID(Dart_GetPeer(str, &out)); |
| + EXPECT(out == reinterpret_cast<void*>(&peer)); |
| + } |
| + Dart_ExitScope(); |
| + isolate->heap()->CollectGarbage(Heap::kOld); |
| + EXPECT_EQ(0, isolate->heap()->PeerCount()); |
| +} |
| + |
| + |
| +// Allocates two objects in old space and assigns them peers. Removes |
| +// the peers and check that the count of peer objects is decremented |
| +// by two. |
| +TEST_CASE(TwoOldSpacePeers) { |
|
siva
2012/09/14 00:03:46
Ditto comment.
cshapiro
2012/09/15 01:23:41
Done.
|
| + Isolate* isolate = Isolate::Current(); |
| + Dart_Handle s1 = Api::NewHandle(isolate, String::New("s1", Heap::kOld)); |
| + EXPECT_VALID(s1); |
| + EXPECT(Dart_IsString(s1)); |
| + EXPECT(!Dart_HasPeer(s1)); |
| + EXPECT_EQ(0, isolate->heap()->PeerCount()); |
| + void* o1 = &o1; |
| + EXPECT(Dart_IsError(Dart_GetPeer(s1, &o1))); |
| + EXPECT(o1 == NULL); |
| + int p1 = 1234; |
| + EXPECT_VALID(Dart_SetPeer(s1, &p1)); |
| + EXPECT(Dart_HasPeer(s1)); |
| + EXPECT_EQ(1, isolate->heap()->PeerCount()); |
| + EXPECT_VALID(Dart_GetPeer(s1, &o1)); |
| + EXPECT(o1 == reinterpret_cast<void*>(&p1)); |
| + Dart_Handle s2 = Api::NewHandle(isolate, String::New("s2", Heap::kOld)); |
| + EXPECT_VALID(s2); |
| + EXPECT(Dart_IsString(s2)); |
| + EXPECT(!Dart_HasPeer(s2)); |
| + EXPECT_EQ(1, isolate->heap()->PeerCount()); |
| + void* o2 = &o2; |
| + EXPECT(Dart_IsError(Dart_GetPeer(s2, &o2))); |
| + EXPECT(o2 == NULL); |
| + int p2 = 5678; |
| + EXPECT_VALID(Dart_SetPeer(s2, &p2)); |
| + EXPECT(Dart_HasPeer(s2)); |
| + EXPECT_EQ(2, isolate->heap()->PeerCount()); |
| + EXPECT_VALID(Dart_GetPeer(s2, &o2)); |
| + EXPECT(o2 == reinterpret_cast<void*>(&p2)); |
| + EXPECT_VALID(Dart_SetPeer(s1, NULL)); |
| + EXPECT(!Dart_HasPeer(s1)); |
| + EXPECT_EQ(1, isolate->heap()->PeerCount()); |
| + EXPECT(Dart_IsError(Dart_GetPeer(s1, &o1))); |
| + EXPECT_VALID(Dart_SetPeer(s2, NULL)); |
| + EXPECT(!Dart_HasPeer(s2)); |
| + EXPECT_EQ(0, isolate->heap()->PeerCount()); |
| + EXPECT(Dart_IsError(Dart_GetPeer(s2, &o2))); |
| +} |
| + |
| + |
| +// Allocates two objects in old space and assigns them a peer. Allow |
| +// the peer referents to be garbage collected and check that the count |
| +// of peer objects is decremented by two. |
| +TEST_CASE(CollectTwoOldSpacePeers) { |
|
siva
2012/09/14 00:03:46
Ditto comment.
cshapiro
2012/09/15 01:23:41
Done.
|
| + Isolate* isolate = Isolate::Current(); |
| + Dart_EnterScope(); |
| + { |
| + DARTSCOPE_NOCHECKS(isolate); |
| + Dart_Handle s1 = Api::NewHandle(isolate, String::New("s1", Heap::kOld)); |
| + EXPECT_VALID(s1); |
| + EXPECT(Dart_IsString(s1)); |
| + EXPECT(!Dart_HasPeer(s1)); |
| + EXPECT_EQ(0, isolate->heap()->PeerCount()); |
| + void* o1 = &o1; |
| + EXPECT(Dart_IsError(Dart_GetPeer(s1, &o1))); |
| + EXPECT(o1 == NULL); |
| + int p1 = 1234; |
| + EXPECT_VALID(Dart_SetPeer(s1, &p1)); |
| + EXPECT(Dart_HasPeer(s1)); |
| + EXPECT_EQ(1, isolate->heap()->PeerCount()); |
| + EXPECT_VALID(Dart_GetPeer(s1, &o1)); |
| + EXPECT(o1 == reinterpret_cast<void*>(&p1)); |
| + Dart_Handle s2 = Api::NewHandle(isolate, String::New("s2", Heap::kOld)); |
| + EXPECT_VALID(s2); |
| + EXPECT(Dart_IsString(s2)); |
| + EXPECT(!Dart_HasPeer(s2)); |
| + EXPECT_EQ(1, isolate->heap()->PeerCount()); |
| + void* o2 = &o2; |
| + EXPECT(Dart_IsError(Dart_GetPeer(s2, &o2))); |
| + EXPECT(o2 == NULL); |
| + int p2 = 5678; |
| + EXPECT_VALID(Dart_SetPeer(s2, &p2)); |
| + EXPECT(Dart_HasPeer(s2)); |
| + EXPECT_EQ(2, isolate->heap()->PeerCount()); |
| + EXPECT_VALID(Dart_GetPeer(s2, &o2)); |
| + EXPECT(o2 == reinterpret_cast<void*>(&p2)); |
| + } |
| + Dart_ExitScope(); |
| + isolate->heap()->CollectGarbage(Heap::kOld); |
| + EXPECT_EQ(0, isolate->heap()->PeerCount()); |
| +} |
| + |
| #endif // defined(TARGET_ARCH_IA32) || defined(TARGET_ARCH_X64). |
| } // namespace dart |