Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(545)

Unified Diff: runtime/vm/dart_api_impl_test.cc

Issue 10905251: Lazy peer API. (Closed) Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge/dart
Patch Set: Created 8 years, 3 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
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

Powered by Google App Engine
This is Rietveld 408576698