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

Side by Side Diff: runtime/vm/object_id_ring_test.cc

Issue 501583007: Treat null like the object it is in the Observatory and Service. (Closed) Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge/dart
Patch Set: Created 6 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) 2013, the Dart project authors. Please see the AUTHORS file 1 // Copyright (c) 2013, 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 "platform/assert.h" 5 #include "platform/assert.h"
6 #include "vm/globals.h" 6 #include "vm/globals.h"
7 #include "vm/object_id_ring.h" 7 #include "vm/object_id_ring.h"
8 #include "vm/unit_test.h" 8 #include "vm/unit_test.h"
9 #include "vm/dart_api_impl.h" 9 #include "vm/dart_api_impl.h"
10 #include "vm/dart_api_state.h" 10 #include "vm/dart_api_state.h"
(...skipping 27 matching lines...) Expand all
38 } 38 }
39 }; 39 };
40 40
41 41
42 // Test that serial number wrapping works. 42 // Test that serial number wrapping works.
43 TEST_CASE(ObjectIdRingSerialWrapTest) { 43 TEST_CASE(ObjectIdRingSerialWrapTest) {
44 Isolate* isolate = Isolate::Current(); 44 Isolate* isolate = Isolate::Current();
45 ObjectIdRing* ring = isolate->object_id_ring(); 45 ObjectIdRing* ring = isolate->object_id_ring();
46 ObjectIdRingTestHelper::SetCapacityAndMaxSerial(ring, 2, 4); 46 ObjectIdRingTestHelper::SetCapacityAndMaxSerial(ring, 2, 4);
47 intptr_t id; 47 intptr_t id;
48 ObjectIdRing::LookupResult kind;
48 id = ring->GetIdForObject(ObjectIdRingTestHelper::MakeString("0")); 49 id = ring->GetIdForObject(ObjectIdRingTestHelper::MakeString("0"));
49 EXPECT_EQ(0, id); 50 EXPECT_EQ(0, id);
50 id = ring->GetIdForObject(ObjectIdRingTestHelper::MakeString("1")); 51 id = ring->GetIdForObject(ObjectIdRingTestHelper::MakeString("1"));
51 EXPECT_EQ(1, id); 52 EXPECT_EQ(1, id);
52 // Test that id 1 gives us the "1" string. 53 // Test that id 1 gives us the "1" string.
53 ObjectIdRingTestHelper::ExpectString(ring->GetObjectForId(id), "1"); 54 ObjectIdRingTestHelper::ExpectString(ring->GetObjectForId(id, &kind), "1");
turnidge 2014/08/27 16:13:56 Can you add checks that kind is the right value?
rmacnak 2014/08/27 18:09:59 Added
54 ObjectIdRingTestHelper::ExpectIdIsValid(ring, 0); 55 ObjectIdRingTestHelper::ExpectIdIsValid(ring, 0);
55 ObjectIdRingTestHelper::ExpectIdIsValid(ring, 1); 56 ObjectIdRingTestHelper::ExpectIdIsValid(ring, 1);
56 ObjectIdRingTestHelper::ExpectIdIsInvalid(ring, 2); 57 ObjectIdRingTestHelper::ExpectIdIsInvalid(ring, 2);
57 ObjectIdRingTestHelper::ExpectIdIsInvalid(ring, 3); 58 ObjectIdRingTestHelper::ExpectIdIsInvalid(ring, 3);
58 id = ring->GetIdForObject(ObjectIdRingTestHelper::MakeString("2")); 59 id = ring->GetIdForObject(ObjectIdRingTestHelper::MakeString("2"));
59 EXPECT_EQ(2, id); 60 EXPECT_EQ(2, id);
60 ObjectIdRingTestHelper::ExpectIdIsInvalid(ring, 0); 61 ObjectIdRingTestHelper::ExpectIdIsInvalid(ring, 0);
61 ObjectIdRingTestHelper::ExpectIdIsValid(ring, 1); 62 ObjectIdRingTestHelper::ExpectIdIsValid(ring, 1);
62 ObjectIdRingTestHelper::ExpectIdIsValid(ring, 2); 63 ObjectIdRingTestHelper::ExpectIdIsValid(ring, 2);
63 ObjectIdRingTestHelper::ExpectIdIsInvalid(ring, 3); 64 ObjectIdRingTestHelper::ExpectIdIsInvalid(ring, 3);
64 id = ring->GetIdForObject(ObjectIdRingTestHelper::MakeString("3")); 65 id = ring->GetIdForObject(ObjectIdRingTestHelper::MakeString("3"));
65 EXPECT_EQ(3, id); 66 EXPECT_EQ(3, id);
66 ObjectIdRingTestHelper::ExpectIdIsInvalid(ring, 0); 67 ObjectIdRingTestHelper::ExpectIdIsInvalid(ring, 0);
67 ObjectIdRingTestHelper::ExpectIdIsInvalid(ring, 1); 68 ObjectIdRingTestHelper::ExpectIdIsInvalid(ring, 1);
68 ObjectIdRingTestHelper::ExpectIdIsValid(ring, 2); 69 ObjectIdRingTestHelper::ExpectIdIsValid(ring, 2);
69 ObjectIdRingTestHelper::ExpectIdIsValid(ring, 3); 70 ObjectIdRingTestHelper::ExpectIdIsValid(ring, 3);
70 id = ring->GetIdForObject(ObjectIdRingTestHelper::MakeString("4")); 71 id = ring->GetIdForObject(ObjectIdRingTestHelper::MakeString("4"));
71 EXPECT_EQ(0, id); 72 EXPECT_EQ(0, id);
72 ObjectIdRingTestHelper::ExpectString(ring->GetObjectForId(id), "4"); 73 ObjectIdRingTestHelper::ExpectString(ring->GetObjectForId(id, &kind), "4");
73 ObjectIdRingTestHelper::ExpectIdIsValid(ring, 0); 74 ObjectIdRingTestHelper::ExpectIdIsValid(ring, 0);
74 ObjectIdRingTestHelper::ExpectIdIsInvalid(ring, 1); 75 ObjectIdRingTestHelper::ExpectIdIsInvalid(ring, 1);
75 ObjectIdRingTestHelper::ExpectIdIsInvalid(ring, 2); 76 ObjectIdRingTestHelper::ExpectIdIsInvalid(ring, 2);
76 ObjectIdRingTestHelper::ExpectIdIsValid(ring, 3); 77 ObjectIdRingTestHelper::ExpectIdIsValid(ring, 3);
77 id = ring->GetIdForObject(ObjectIdRingTestHelper::MakeString("5")); 78 id = ring->GetIdForObject(ObjectIdRingTestHelper::MakeString("5"));
78 EXPECT_EQ(1, id); 79 EXPECT_EQ(1, id);
79 ObjectIdRingTestHelper::ExpectString(ring->GetObjectForId(id), "5"); 80 ObjectIdRingTestHelper::ExpectString(ring->GetObjectForId(id, &kind), "5");
80 ObjectIdRingTestHelper::ExpectIdIsValid(ring, 0); 81 ObjectIdRingTestHelper::ExpectIdIsValid(ring, 0);
81 ObjectIdRingTestHelper::ExpectIdIsValid(ring, 1); 82 ObjectIdRingTestHelper::ExpectIdIsValid(ring, 1);
82 ObjectIdRingTestHelper::ExpectIdIsInvalid(ring, 2); 83 ObjectIdRingTestHelper::ExpectIdIsInvalid(ring, 2);
83 ObjectIdRingTestHelper::ExpectIdIsInvalid(ring, 3); 84 ObjectIdRingTestHelper::ExpectIdIsInvalid(ring, 3);
84 } 85 }
85 86
86 87
87 // Test that the ring table is updated when the scavenger moves an object. 88 // Test that the ring table is updated when the scavenger moves an object.
88 TEST_CASE(ObjectIdRingScavengeMoveTest) { 89 TEST_CASE(ObjectIdRingScavengeMoveTest) {
89 const char* kScriptChars = 90 const char* kScriptChars =
90 "main() {\n" 91 "main() {\n"
91 " return [1, 2, 3];\n" 92 " return [1, 2, 3];\n"
92 "}\n"; 93 "}\n";
93 Dart_Handle lib = TestCase::LoadTestScript(kScriptChars, NULL); 94 Dart_Handle lib = TestCase::LoadTestScript(kScriptChars, NULL);
94 Dart_Handle result = Dart_Invoke(lib, NewString("main"), 0, NULL); 95 Dart_Handle result = Dart_Invoke(lib, NewString("main"), 0, NULL);
95 intptr_t list_length = 0; 96 intptr_t list_length = 0;
96 EXPECT_VALID(result); 97 EXPECT_VALID(result);
97 EXPECT(!Dart_IsNull(result)); 98 EXPECT(!Dart_IsNull(result));
98 EXPECT(Dart_IsList(result)); 99 EXPECT(Dart_IsList(result));
99 EXPECT_VALID(Dart_ListLength(result, &list_length)); 100 EXPECT_VALID(Dart_ListLength(result, &list_length));
100 EXPECT_EQ(3, list_length); 101 EXPECT_EQ(3, list_length);
101 Isolate* isolate = Isolate::Current(); 102 Isolate* isolate = Isolate::Current();
102 Heap* heap = isolate->heap(); 103 Heap* heap = isolate->heap();
103 ObjectIdRing* ring = isolate->object_id_ring(); 104 ObjectIdRing* ring = isolate->object_id_ring();
105 ObjectIdRing::LookupResult kind;
104 RawObject* raw_obj = Api::UnwrapHandle(result); 106 RawObject* raw_obj = Api::UnwrapHandle(result);
105 // Located in new heap. 107 // Located in new heap.
106 EXPECT(raw_obj->IsNewObject()); 108 EXPECT(raw_obj->IsNewObject());
107 EXPECT_NE(Object::null(), raw_obj); 109 EXPECT_NE(Object::null(), raw_obj);
108 intptr_t raw_obj_id1 = ring->GetIdForObject(raw_obj); 110 intptr_t raw_obj_id1 = ring->GetIdForObject(raw_obj);
109 EXPECT_EQ(0, raw_obj_id1); 111 EXPECT_EQ(0, raw_obj_id1);
110 intptr_t raw_obj_id2 = ring->GetIdForObject(raw_obj); 112 intptr_t raw_obj_id2 = ring->GetIdForObject(raw_obj);
111 EXPECT_EQ(1, raw_obj_id2); 113 EXPECT_EQ(1, raw_obj_id2);
112 intptr_t raw_obj_id3 = ring->GetIdForObject(Object::null()); 114 intptr_t raw_obj_id3 = ring->GetIdForObject(Object::null());
113 RawObject* raw_obj1 = ring->GetObjectForId(raw_obj_id1); 115 RawObject* raw_obj1 = ring->GetObjectForId(raw_obj_id1, &kind);
114 RawObject* raw_obj2 = ring->GetObjectForId(raw_obj_id2); 116 RawObject* raw_obj2 = ring->GetObjectForId(raw_obj_id2, &kind);
115 RawObject* raw_obj3 = ring->GetObjectForId(raw_obj_id3); 117 RawObject* raw_obj3 = ring->GetObjectForId(raw_obj_id3, &kind);
116 EXPECT_NE(Object::null(), raw_obj1); 118 EXPECT_NE(Object::null(), raw_obj1);
117 EXPECT_NE(Object::null(), raw_obj2); 119 EXPECT_NE(Object::null(), raw_obj2);
118 EXPECT_EQ(Object::null(), raw_obj3); 120 EXPECT_EQ(Object::null(), raw_obj3);
119 EXPECT_EQ(RawObject::ToAddr(raw_obj), RawObject::ToAddr(raw_obj1)); 121 EXPECT_EQ(RawObject::ToAddr(raw_obj), RawObject::ToAddr(raw_obj1));
120 EXPECT_EQ(RawObject::ToAddr(raw_obj), RawObject::ToAddr(raw_obj2)); 122 EXPECT_EQ(RawObject::ToAddr(raw_obj), RawObject::ToAddr(raw_obj2));
121 // Force a scavenge. 123 // Force a scavenge.
122 heap->CollectGarbage(Heap::kNew); 124 heap->CollectGarbage(Heap::kNew);
123 RawObject* raw_object_moved1 = ring->GetObjectForId(raw_obj_id1); 125 RawObject* raw_object_moved1 = ring->GetObjectForId(raw_obj_id1, &kind);
124 RawObject* raw_object_moved2 = ring->GetObjectForId(raw_obj_id2); 126 RawObject* raw_object_moved2 = ring->GetObjectForId(raw_obj_id2, &kind);
125 RawObject* raw_object_moved3 = ring->GetObjectForId(raw_obj_id3); 127 RawObject* raw_object_moved3 = ring->GetObjectForId(raw_obj_id3, &kind);
126 EXPECT_NE(Object::null(), raw_object_moved1); 128 EXPECT_NE(Object::null(), raw_object_moved1);
127 EXPECT_NE(Object::null(), raw_object_moved2); 129 EXPECT_NE(Object::null(), raw_object_moved2);
128 EXPECT_EQ(Object::null(), raw_object_moved3); 130 EXPECT_EQ(Object::null(), raw_object_moved3);
129 EXPECT_EQ(RawObject::ToAddr(raw_object_moved1), 131 EXPECT_EQ(RawObject::ToAddr(raw_object_moved1),
130 RawObject::ToAddr(raw_object_moved2)); 132 RawObject::ToAddr(raw_object_moved2));
131 // Test that objects have moved. 133 // Test that objects have moved.
132 EXPECT_NE(RawObject::ToAddr(raw_obj1), RawObject::ToAddr(raw_object_moved1)); 134 EXPECT_NE(RawObject::ToAddr(raw_obj1), RawObject::ToAddr(raw_object_moved1));
133 EXPECT_NE(RawObject::ToAddr(raw_obj2), RawObject::ToAddr(raw_object_moved2)); 135 EXPECT_NE(RawObject::ToAddr(raw_obj2), RawObject::ToAddr(raw_object_moved2));
134 // Test that we still point at the same list. 136 // Test that we still point at the same list.
135 Dart_Handle moved_handle = Api::NewHandle(isolate, raw_object_moved1); 137 Dart_Handle moved_handle = Api::NewHandle(isolate, raw_object_moved1);
136 EXPECT_VALID(moved_handle); 138 EXPECT_VALID(moved_handle);
137 EXPECT(!Dart_IsNull(moved_handle)); 139 EXPECT(!Dart_IsNull(moved_handle));
138 EXPECT(Dart_IsList(moved_handle)); 140 EXPECT(Dart_IsList(moved_handle));
139 EXPECT_VALID(Dart_ListLength(moved_handle, &list_length)); 141 EXPECT_VALID(Dart_ListLength(moved_handle, &list_length));
140 EXPECT_EQ(3, list_length); 142 EXPECT_EQ(3, list_length);
141 } 143 }
142 144
143 145
144 // Test that the ring table is updated with nulls when the old GC collects. 146 // Test that the ring table is updated with nulls when the old GC collects.
145 TEST_CASE(ObjectIdRingOldGCTest) { 147 TEST_CASE(ObjectIdRingOldGCTest) {
146 Isolate* isolate = Isolate::Current(); 148 Isolate* isolate = Isolate::Current();
147 Heap* heap = isolate->heap(); 149 Heap* heap = isolate->heap();
148 ObjectIdRing* ring = isolate->object_id_ring(); 150 ObjectIdRing* ring = isolate->object_id_ring();
149 151
152 ObjectIdRing::LookupResult kind;
150 intptr_t raw_obj_id1 = -1; 153 intptr_t raw_obj_id1 = -1;
151 intptr_t raw_obj_id2 = -1; 154 intptr_t raw_obj_id2 = -1;
152 { 155 {
153 Dart_EnterScope(); 156 Dart_EnterScope();
154 Dart_Handle result; 157 Dart_Handle result;
155 // Create a string in the old heap. 158 // Create a string in the old heap.
156 result = Api::NewHandle(isolate, String::New("old", Heap::kOld)); 159 result = Api::NewHandle(isolate, String::New("old", Heap::kOld));
157 EXPECT_VALID(result); 160 EXPECT_VALID(result);
158 intptr_t string_length = 0; 161 intptr_t string_length = 0;
159 // Inspect string. 162 // Inspect string.
160 EXPECT(!Dart_IsNull(result)); 163 EXPECT(!Dart_IsNull(result));
161 EXPECT(Dart_IsString(result)); 164 EXPECT(Dart_IsString(result));
162 EXPECT_VALID(Dart_StringLength(result, &string_length)); 165 EXPECT_VALID(Dart_StringLength(result, &string_length));
163 EXPECT_EQ(3, string_length); 166 EXPECT_EQ(3, string_length);
164 RawObject* raw_obj = Api::UnwrapHandle(result); 167 RawObject* raw_obj = Api::UnwrapHandle(result);
165 // Verify that it is located in old heap. 168 // Verify that it is located in old heap.
166 EXPECT(raw_obj->IsOldObject()); 169 EXPECT(raw_obj->IsOldObject());
167 EXPECT_NE(Object::null(), raw_obj); 170 EXPECT_NE(Object::null(), raw_obj);
168 raw_obj_id1 = ring->GetIdForObject(raw_obj); 171 raw_obj_id1 = ring->GetIdForObject(raw_obj);
169 EXPECT_EQ(0, raw_obj_id1); 172 EXPECT_EQ(0, raw_obj_id1);
170 raw_obj_id2 = ring->GetIdForObject(raw_obj); 173 raw_obj_id2 = ring->GetIdForObject(raw_obj);
171 EXPECT_EQ(1, raw_obj_id2); 174 EXPECT_EQ(1, raw_obj_id2);
172 RawObject* raw_obj1 = ring->GetObjectForId(raw_obj_id1); 175 RawObject* raw_obj1 = ring->GetObjectForId(raw_obj_id1, &kind);
173 RawObject* raw_obj2 = ring->GetObjectForId(raw_obj_id2); 176 RawObject* raw_obj2 = ring->GetObjectForId(raw_obj_id2, &kind);
174 EXPECT_NE(Object::null(), raw_obj1); 177 EXPECT_NE(Object::null(), raw_obj1);
175 EXPECT_NE(Object::null(), raw_obj2); 178 EXPECT_NE(Object::null(), raw_obj2);
176 EXPECT_EQ(RawObject::ToAddr(raw_obj), RawObject::ToAddr(raw_obj1)); 179 EXPECT_EQ(RawObject::ToAddr(raw_obj), RawObject::ToAddr(raw_obj1));
177 EXPECT_EQ(RawObject::ToAddr(raw_obj), RawObject::ToAddr(raw_obj2)); 180 EXPECT_EQ(RawObject::ToAddr(raw_obj), RawObject::ToAddr(raw_obj2));
178 // Exit scope. Freeing result handle. 181 // Exit scope. Freeing result handle.
179 Dart_ExitScope(); 182 Dart_ExitScope();
180 } 183 }
181 // Force a GC. No reference exist to the old string anymore. It should be 184 // Force a GC. No reference exist to the old string anymore. It should be
182 // collected and the object id ring will now return the null object for 185 // collected and the object id ring will now return the null object for
183 // those ids. 186 // those ids.
184 heap->CollectGarbage(Heap::kOld); 187 heap->CollectGarbage(Heap::kOld);
185 RawObject* raw_object_moved1 = ring->GetObjectForId(raw_obj_id1); 188 RawObject* raw_object_moved1 = ring->GetObjectForId(raw_obj_id1, &kind);
186 RawObject* raw_object_moved2 = ring->GetObjectForId(raw_obj_id2); 189 RawObject* raw_object_moved2 = ring->GetObjectForId(raw_obj_id2, &kind);
187 // Objects should now be null. 190 // Objects should now be null.
188 EXPECT_EQ(Object::null(), raw_object_moved1); 191 EXPECT_EQ(Object::null(), raw_object_moved1);
189 EXPECT_EQ(Object::null(), raw_object_moved2); 192 EXPECT_EQ(Object::null(), raw_object_moved2);
190 } 193 }
191 194
192 } // namespace dart 195 } // namespace dart
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698