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

Side by Side 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: rebased 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 unified diff | Download patch | Annotate | Revision Log
OLDNEW
1 // Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file 1 // Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file
2 // for details. All rights reserved. Use of this source code is governed by a 2 // for details. All rights reserved. Use of this source code is governed by a
3 // BSD-style license that can be found in the LICENSE file. 3 // BSD-style license that can be found in the LICENSE file.
4 4
5 #include "include/dart_api.h" 5 #include "include/dart_api.h"
6 #include "platform/assert.h" 6 #include "platform/assert.h"
7 #include "platform/json.h" 7 #include "platform/json.h"
8 #include "platform/utils.h" 8 #include "platform/utils.h"
9 #include "vm/class_finalizer.h" 9 #include "vm/class_finalizer.h"
10 #include "vm/dart_api_impl.h" 10 #include "vm/dart_api_impl.h"
(...skipping 6715 matching lines...) Expand 10 before | Expand all | Expand 10 after
6726 6726
6727 str = Dart_NewString32(NULL, 0); 6727 str = Dart_NewString32(NULL, 0);
6728 EXPECT_VALID(str); 6728 EXPECT_VALID(str);
6729 EXPECT(Dart_IsString(str)); 6729 EXPECT(Dart_IsString(str));
6730 len = -1; 6730 len = -1;
6731 EXPECT_VALID(Dart_StringLength(str, &len)); 6731 EXPECT_VALID(Dart_StringLength(str, &len));
6732 EXPECT_EQ(0, len); 6732 EXPECT_EQ(0, len);
6733 } 6733 }
6734 6734
6735 6735
6736 // Try to allocate a peer with a handles to objects of prohibited
6737 // subtypes.
6738 TEST_CASE(InvalidGetSetPeer) {
6739 void* out = &out;
6740 EXPECT(Dart_IsError(Dart_GetPeer(Dart_Null(), &out)));
6741 EXPECT(out == &out);
6742 EXPECT(Dart_IsError(Dart_SetPeer(Dart_Null(), &out)));
6743 out = &out;
6744 EXPECT(Dart_IsError(Dart_GetPeer(Dart_True(), &out)));
6745 EXPECT(out == &out);
6746 EXPECT(Dart_IsError(Dart_SetPeer(Dart_True(), &out)));
6747 out = &out;
6748 EXPECT(Dart_IsError(Dart_GetPeer(Dart_False(), &out)));
6749 EXPECT(out == &out);
6750 EXPECT(Dart_IsError(Dart_SetPeer(Dart_False(), &out)));
6751 out = &out;
6752 Dart_Handle smi = Dart_NewInteger(0);
6753 EXPECT(Dart_IsError(Dart_GetPeer(smi, &out)));
6754 EXPECT(out == &out);
6755 EXPECT(Dart_IsError(Dart_SetPeer(smi, &out)));
6756 out = &out;
6757 Dart_Handle big = Dart_NewIntegerFromHexCString("0x10000000000000000");
6758 EXPECT(Dart_IsError(Dart_GetPeer(big, &out)));
6759 EXPECT(out == &out);
6760 EXPECT(Dart_IsError(Dart_SetPeer(big, &out)));
6761 Dart_Handle dbl = Dart_NewDouble(0.0);
6762 EXPECT(Dart_IsError(Dart_GetPeer(dbl, &out)));
6763 EXPECT(out == &out);
6764 EXPECT(Dart_IsError(Dart_SetPeer(dbl, &out)));
6765 }
6766
6767
6768 // Allocates an object in new space and assigns it a peer. Removes
6769 // the peer and checks that the count of peer objects is decremented
6770 // by one.
6771 TEST_CASE(OneNewSpacePeer) {
6772 Isolate* isolate = Isolate::Current();
6773 Dart_Handle str = Dart_NewString("a string");
6774 EXPECT_VALID(str);
6775 EXPECT(Dart_IsString(str));
6776 EXPECT_EQ(0, isolate->heap()->PeerCount());
6777 void* out = &out;
6778 EXPECT_VALID(Dart_GetPeer(str, &out));
6779 EXPECT(out == NULL);
6780 int peer = 1234;
6781 EXPECT_VALID(Dart_SetPeer(str, &peer));
6782 EXPECT_EQ(1, isolate->heap()->PeerCount());
6783 out = &out;
6784 EXPECT_VALID(Dart_GetPeer(str, &out));
6785 EXPECT(out == reinterpret_cast<void*>(&peer));
6786 EXPECT_VALID(Dart_SetPeer(str, NULL));
6787 out = &out;
6788 EXPECT_VALID(Dart_GetPeer(str, &out));
6789 EXPECT(out == NULL);
6790 EXPECT_EQ(0, isolate->heap()->PeerCount());
6791 }
6792
6793
6794 // Allocates an object in new space and assigns it a peer. Allows the
6795 // peer referent to be garbage collected and checks that the count of
6796 // peer objects is decremented by one.
6797 TEST_CASE(CollectOneNewSpacePeer) {
6798 Isolate* isolate = Isolate::Current();
6799 Dart_EnterScope();
6800 {
6801 DARTSCOPE_NOCHECKS(isolate);
6802 Dart_Handle str = Dart_NewString("a string");
6803 EXPECT_VALID(str);
6804 EXPECT(Dart_IsString(str));
6805 EXPECT_EQ(0, isolate->heap()->PeerCount());
6806 void* out = &out;
6807 EXPECT_VALID(Dart_GetPeer(str, &out));
6808 EXPECT(out == NULL);
6809 int peer = 1234;
6810 EXPECT_VALID(Dart_SetPeer(str, &peer));
6811 EXPECT_EQ(1, isolate->heap()->PeerCount());
6812 out = &out;
6813 EXPECT_VALID(Dart_GetPeer(str, &out));
6814 EXPECT(out == reinterpret_cast<void*>(&peer));
6815 isolate->heap()->CollectGarbage(Heap::kNew);
6816 EXPECT_EQ(1, isolate->heap()->PeerCount());
6817 out = &out;
6818 EXPECT_VALID(Dart_GetPeer(str, &out));
6819 EXPECT(out == reinterpret_cast<void*>(&peer));
6820 }
6821 Dart_ExitScope();
6822 isolate->heap()->CollectGarbage(Heap::kNew);
6823 EXPECT_EQ(0, isolate->heap()->PeerCount());
6824 }
6825
6826
6827 // Allocates two objects in new space and assigns them peers. Removes
6828 // the peers and checks that the count of peer objects is decremented
6829 // by two.
6830 TEST_CASE(TwoNewSpacePeers) {
6831 Isolate* isolate = Isolate::Current();
6832 Dart_Handle s1 = Dart_NewString("s1");
6833 EXPECT_VALID(s1);
6834 EXPECT(Dart_IsString(s1));
6835 void* o1 = &o1;
6836 EXPECT_VALID(Dart_GetPeer(s1, &o1));
6837 EXPECT(o1 == NULL);
6838 EXPECT_EQ(0, isolate->heap()->PeerCount());
6839 int p1 = 1234;
6840 EXPECT_VALID(Dart_SetPeer(s1, &p1));
6841 EXPECT_EQ(1, isolate->heap()->PeerCount());
6842 EXPECT_VALID(Dart_GetPeer(s1, &o1));
6843 EXPECT(o1 == reinterpret_cast<void*>(&p1));
6844 Dart_Handle s2 = Dart_NewString("a string");
6845 EXPECT_VALID(s2);
6846 EXPECT(Dart_IsString(s2));
6847 EXPECT_EQ(1, isolate->heap()->PeerCount());
6848 void* o2 = &o2;
6849 EXPECT(Dart_GetPeer(s2, &o2));
6850 EXPECT(o2 == NULL);
6851 int p2 = 5678;
6852 EXPECT_VALID(Dart_SetPeer(s2, &p2));
6853 EXPECT_EQ(2, isolate->heap()->PeerCount());
6854 EXPECT_VALID(Dart_GetPeer(s2, &o2));
6855 EXPECT(o2 == reinterpret_cast<void*>(&p2));
6856 EXPECT_VALID(Dart_SetPeer(s1, NULL));
6857 EXPECT_EQ(1, isolate->heap()->PeerCount());
6858 EXPECT(Dart_GetPeer(s1, &o1));
6859 EXPECT(o1 == NULL);
6860 EXPECT_VALID(Dart_SetPeer(s2, NULL));
6861 EXPECT_EQ(0, isolate->heap()->PeerCount());
6862 EXPECT(Dart_GetPeer(s2, &o2));
6863 EXPECT(o2 == NULL);
6864 }
6865
6866
6867 // Allocates two objects in new space and assigns them a peer. Allow
6868 // the peer referents to be garbage collected and check that the count
6869 // of peer objects is decremented by two.
6870 TEST_CASE(CollectTwoNewSpacePeers) {
6871 Isolate* isolate = Isolate::Current();
6872 Dart_EnterScope();
6873 {
6874 DARTSCOPE_NOCHECKS(isolate);
6875 Dart_Handle s1 = Dart_NewString("s1");
6876 EXPECT_VALID(s1);
6877 EXPECT(Dart_IsString(s1));
6878 EXPECT_EQ(0, isolate->heap()->PeerCount());
6879 void* o1 = &o1;
6880 EXPECT(Dart_GetPeer(s1, &o1));
6881 EXPECT(o1 == NULL);
6882 int p1 = 1234;
6883 EXPECT_VALID(Dart_SetPeer(s1, &p1));
6884 EXPECT_EQ(1, isolate->heap()->PeerCount());
6885 EXPECT_VALID(Dart_GetPeer(s1, &o1));
6886 EXPECT(o1 == reinterpret_cast<void*>(&p1));
6887 Dart_Handle s2 = Dart_NewString("s2");
6888 EXPECT_VALID(s2);
6889 EXPECT(Dart_IsString(s2));
6890 EXPECT_EQ(1, isolate->heap()->PeerCount());
6891 void* o2 = &o2;
6892 EXPECT(Dart_GetPeer(s2, &o2));
6893 EXPECT(o2 == NULL);
6894 int p2 = 5678;
6895 EXPECT_VALID(Dart_SetPeer(s2, &p2));
6896 EXPECT_EQ(2, isolate->heap()->PeerCount());
6897 EXPECT_VALID(Dart_GetPeer(s2, &o2));
6898 EXPECT(o2 == reinterpret_cast<void*>(&p2));
6899 }
6900 Dart_ExitScope();
6901 isolate->heap()->CollectGarbage(Heap::kNew);
6902 EXPECT_EQ(0, isolate->heap()->PeerCount());
6903 }
6904
6905
6906 // Allocates several objects in new space. Performs successive
6907 // garbage collections and checks that the peer count is stable.
6908 TEST_CASE(CopyNewSpacePeers) {
6909 const int kPeerCount = 10;
6910 Isolate* isolate = Isolate::Current();
6911 Dart_Handle s[kPeerCount];
6912 for (int i = 0; i < kPeerCount; ++i) {
6913 s[i] = Dart_NewString("a string");
6914 EXPECT_VALID(s[i]);
6915 EXPECT(Dart_IsString(s[i]));
6916 void* o = &o;
6917 EXPECT_VALID(Dart_GetPeer(s[i], &o));
6918 EXPECT(o == NULL);
6919 }
6920 EXPECT_EQ(0, isolate->heap()->PeerCount());
6921 int p[kPeerCount];
6922 for (int i = 0; i < kPeerCount; ++i) {
6923 EXPECT_VALID(Dart_SetPeer(s[i], &p[i]));
6924 EXPECT_EQ(i + 1, isolate->heap()->PeerCount());
6925 void* o = &o;
6926 EXPECT_VALID(Dart_GetPeer(s[i], &o));
6927 EXPECT(o == reinterpret_cast<void*>(&p[i]));
6928 }
6929 EXPECT_EQ(kPeerCount, isolate->heap()->PeerCount());
6930 isolate->heap()->CollectGarbage(Heap::kNew);
6931 EXPECT_EQ(kPeerCount, isolate->heap()->PeerCount());
6932 isolate->heap()->CollectGarbage(Heap::kNew);
6933 EXPECT_EQ(kPeerCount, isolate->heap()->PeerCount());
6934 }
6935
6936
6937 // Allocates an object in new space and assigns it a peer. Promotes
6938 // the peer to old space. Removes the peer and check that the count
6939 // of peer objects is decremented by one.
6940 TEST_CASE(OnePromotedPeer) {
6941 Isolate* isolate = Isolate::Current();
6942 Dart_Handle str = Dart_NewString("a string");
6943 EXPECT_VALID(str);
6944 EXPECT(Dart_IsString(str));
6945 EXPECT_EQ(0, isolate->heap()->PeerCount());
6946 void* out = &out;
6947 EXPECT(Dart_GetPeer(str, &out));
6948 EXPECT(out == NULL);
6949 int peer = 1234;
6950 EXPECT_VALID(Dart_SetPeer(str, &peer));
6951 out = &out;
6952 EXPECT(Dart_GetPeer(str, &out));
6953 EXPECT(out == reinterpret_cast<void*>(&peer));
6954 EXPECT_EQ(1, isolate->heap()->PeerCount());
6955 isolate->heap()->CollectGarbage(Heap::kNew);
6956 isolate->heap()->CollectGarbage(Heap::kNew);
6957 {
6958 DARTSCOPE_NOCHECKS(isolate);
6959 String& handle = String::Handle();
6960 handle ^= Api::UnwrapHandle(str);
6961 EXPECT(handle.IsOld());
6962 }
6963 EXPECT_VALID(Dart_GetPeer(str, &out));
6964 EXPECT(out == reinterpret_cast<void*>(&peer));
6965 EXPECT_EQ(1, isolate->heap()->PeerCount());
6966 EXPECT_VALID(Dart_SetPeer(str, NULL));
6967 out = &out;
6968 EXPECT_VALID(Dart_GetPeer(str, &out));
6969 EXPECT(out == NULL);
6970 EXPECT_EQ(0, isolate->heap()->PeerCount());
6971 }
6972
6973
6974 // Allocates an object in old space and assigns it a peer. Removes
6975 // the peer and checks that the count of peer objects is decremented
6976 // by one.
6977 TEST_CASE(OneOldSpacePeer) {
6978 Isolate* isolate = Isolate::Current();
6979 Dart_Handle str = Api::NewHandle(isolate, String::New("str", Heap::kOld));
6980 EXPECT_VALID(str);
6981 EXPECT(Dart_IsString(str));
6982 EXPECT_EQ(0, isolate->heap()->PeerCount());
6983 void* out = &out;
6984 EXPECT(Dart_GetPeer(str, &out));
6985 EXPECT(out == NULL);
6986 int peer = 1234;
6987 EXPECT_VALID(Dart_SetPeer(str, &peer));
6988 EXPECT_EQ(1, isolate->heap()->PeerCount());
6989 out = &out;
6990 EXPECT_VALID(Dart_GetPeer(str, &out));
6991 EXPECT(out == reinterpret_cast<void*>(&peer));
6992 isolate->heap()->CollectGarbage(Heap::kOld);
6993 EXPECT_EQ(1, isolate->heap()->PeerCount());
6994 EXPECT_VALID(Dart_GetPeer(str, &out));
6995 EXPECT(out == reinterpret_cast<void*>(&peer));
6996 EXPECT_VALID(Dart_SetPeer(str, NULL));
6997 out = &out;
6998 EXPECT_VALID(Dart_GetPeer(str, &out));
6999 EXPECT(out == NULL);
7000 EXPECT_EQ(0, isolate->heap()->PeerCount());
7001 }
7002
7003
7004 // Allocates an object in old space and assigns it a peer. Allow the
7005 // peer referent to be garbage collected and check that the count of
7006 // peer objects is decremented by one.
7007 TEST_CASE(CollectOneOldSpacePeer) {
7008 Isolate* isolate = Isolate::Current();
7009 Dart_EnterScope();
7010 {
7011 DARTSCOPE_NOCHECKS(isolate);
7012 Dart_Handle str = Api::NewHandle(isolate, String::New("str", Heap::kOld));
7013 EXPECT_VALID(str);
7014 EXPECT(Dart_IsString(str));
7015 EXPECT_EQ(0, isolate->heap()->PeerCount());
7016 void* out = &out;
7017 EXPECT(Dart_GetPeer(str, &out));
7018 EXPECT(out == NULL);
7019 int peer = 1234;
7020 EXPECT_VALID(Dart_SetPeer(str, &peer));
7021 EXPECT_EQ(1, isolate->heap()->PeerCount());
7022 out = &out;
7023 EXPECT_VALID(Dart_GetPeer(str, &out));
7024 EXPECT(out == reinterpret_cast<void*>(&peer));
7025 isolate->heap()->CollectGarbage(Heap::kOld);
7026 EXPECT_EQ(1, isolate->heap()->PeerCount());
7027 EXPECT_VALID(Dart_GetPeer(str, &out));
7028 EXPECT(out == reinterpret_cast<void*>(&peer));
7029 }
7030 Dart_ExitScope();
7031 isolate->heap()->CollectGarbage(Heap::kOld);
7032 EXPECT_EQ(0, isolate->heap()->PeerCount());
7033 }
7034
7035
7036 // Allocates two objects in old space and assigns them peers. Removes
7037 // the peers and checks that the count of peer objects is decremented
7038 // by two.
7039 TEST_CASE(TwoOldSpacePeers) {
7040 Isolate* isolate = Isolate::Current();
7041 Dart_Handle s1 = Api::NewHandle(isolate, String::New("s1", Heap::kOld));
7042 EXPECT_VALID(s1);
7043 EXPECT(Dart_IsString(s1));
7044 EXPECT_EQ(0, isolate->heap()->PeerCount());
7045 void* o1 = &o1;
7046 EXPECT(Dart_GetPeer(s1, &o1));
7047 EXPECT(o1 == NULL);
7048 int p1 = 1234;
7049 EXPECT_VALID(Dart_SetPeer(s1, &p1));
7050 EXPECT_EQ(1, isolate->heap()->PeerCount());
7051 o1 = &o1;
7052 EXPECT_VALID(Dart_GetPeer(s1, &o1));
7053 EXPECT(o1 == reinterpret_cast<void*>(&p1));
7054 Dart_Handle s2 = Api::NewHandle(isolate, String::New("s2", Heap::kOld));
7055 EXPECT_VALID(s2);
7056 EXPECT(Dart_IsString(s2));
7057 EXPECT_EQ(1, isolate->heap()->PeerCount());
7058 void* o2 = &o2;
7059 EXPECT(Dart_GetPeer(s2, &o2));
7060 EXPECT(o2 == NULL);
7061 int p2 = 5678;
7062 EXPECT_VALID(Dart_SetPeer(s2, &p2));
7063 EXPECT_EQ(2, isolate->heap()->PeerCount());
7064 o2 = &o2;
7065 EXPECT_VALID(Dart_GetPeer(s2, &o2));
7066 EXPECT(o2 == reinterpret_cast<void*>(&p2));
7067 EXPECT_VALID(Dart_SetPeer(s1, NULL));
7068 EXPECT_EQ(1, isolate->heap()->PeerCount());
7069 o1 = &o1;
7070 EXPECT(Dart_GetPeer(s1, &o1));
7071 EXPECT(o1 == NULL);
7072 EXPECT_VALID(Dart_SetPeer(s2, NULL));
7073 EXPECT_EQ(0, isolate->heap()->PeerCount());
7074 o2 = &o2;
7075 EXPECT_VALID(Dart_GetPeer(s2, &o2));
7076 EXPECT(o2 == NULL);
7077 }
7078
7079
7080 // Allocates two objects in old space and assigns them a peer. Allows
7081 // the peer referents to be garbage collected and checks that the
7082 // count of peer objects is decremented by two.
7083 TEST_CASE(CollectTwoOldSpacePeers) {
7084 Isolate* isolate = Isolate::Current();
7085 Dart_EnterScope();
7086 {
7087 DARTSCOPE_NOCHECKS(isolate);
7088 Dart_Handle s1 = Api::NewHandle(isolate, String::New("s1", Heap::kOld));
7089 EXPECT_VALID(s1);
7090 EXPECT(Dart_IsString(s1));
7091 EXPECT_EQ(0, isolate->heap()->PeerCount());
7092 void* o1 = &o1;
7093 EXPECT(Dart_GetPeer(s1, &o1));
7094 EXPECT(o1 == NULL);
7095 int p1 = 1234;
7096 EXPECT_VALID(Dart_SetPeer(s1, &p1));
7097 EXPECT_EQ(1, isolate->heap()->PeerCount());
7098 o1 = &o1;
7099 EXPECT_VALID(Dart_GetPeer(s1, &o1));
7100 EXPECT(o1 == reinterpret_cast<void*>(&p1));
7101 Dart_Handle s2 = Api::NewHandle(isolate, String::New("s2", Heap::kOld));
7102 EXPECT_VALID(s2);
7103 EXPECT(Dart_IsString(s2));
7104 EXPECT_EQ(1, isolate->heap()->PeerCount());
7105 void* o2 = &o2;
7106 EXPECT(Dart_GetPeer(s2, &o2));
7107 EXPECT(o2 == NULL);
7108 int p2 = 5678;
7109 EXPECT_VALID(Dart_SetPeer(s2, &p2));
7110 EXPECT_EQ(2, isolate->heap()->PeerCount());
7111 o2 = &o2;
7112 EXPECT_VALID(Dart_GetPeer(s2, &o2));
7113 EXPECT(o2 == reinterpret_cast<void*>(&p2));
7114 }
7115 Dart_ExitScope();
7116 isolate->heap()->CollectGarbage(Heap::kOld);
7117 EXPECT_EQ(0, isolate->heap()->PeerCount());
7118 }
7119
6736 #endif // defined(TARGET_ARCH_IA32) || defined(TARGET_ARCH_X64). 7120 #endif // defined(TARGET_ARCH_IA32) || defined(TARGET_ARCH_X64).
6737 7121
6738 } // namespace dart 7122 } // namespace dart
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698