| OLD | NEW | 
|---|
| 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" | 
| 11 | 11 | 
| 12 namespace dart { | 12 namespace dart { | 
| 13 | 13 | 
| 14 #ifndef PRODUCT | 14 #ifndef PRODUCT | 
| 15 | 15 | 
| 16 class ObjectIdRingTestHelper { | 16 class ObjectIdRingTestHelper { | 
| 17  public: | 17  public: | 
| 18   static void SetCapacityAndMaxSerial(ObjectIdRing* ring, int32_t capacity, | 18   static void SetCapacityAndMaxSerial(ObjectIdRing* ring, | 
|  | 19                                       int32_t capacity, | 
| 19                                       int32_t max_serial) { | 20                                       int32_t max_serial) { | 
| 20     ring->SetCapacityAndMaxSerial(capacity, max_serial); | 21     ring->SetCapacityAndMaxSerial(capacity, max_serial); | 
| 21   } | 22   } | 
| 22 | 23 | 
| 23   static void ExpectIdIsValid(ObjectIdRing* ring, intptr_t id) { | 24   static void ExpectIdIsValid(ObjectIdRing* ring, intptr_t id) { | 
| 24     EXPECT(ring->IsValidId(id)); | 25     EXPECT(ring->IsValidId(id)); | 
| 25   } | 26   } | 
| 26 | 27 | 
| 27   static void ExpectIdIsInvalid(ObjectIdRing* ring, intptr_t id) { | 28   static void ExpectIdIsInvalid(ObjectIdRing* ring, intptr_t id) { | 
| 28     EXPECT(!ring->IsValidId(id)); | 29     EXPECT(!ring->IsValidId(id)); | 
| (...skipping 87 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 116   ObjectIdRingTestHelper::ExpectIdIsValid(ring, 0); | 117   ObjectIdRingTestHelper::ExpectIdIsValid(ring, 0); | 
| 117   ObjectIdRingTestHelper::ExpectIdIsValid(ring, 1); | 118   ObjectIdRingTestHelper::ExpectIdIsValid(ring, 1); | 
| 118   ObjectIdRingTestHelper::ExpectIdIsInvalid(ring, 2); | 119   ObjectIdRingTestHelper::ExpectIdIsInvalid(ring, 2); | 
| 119   ObjectIdRingTestHelper::ExpectIdIsInvalid(ring, 3); | 120   ObjectIdRingTestHelper::ExpectIdIsInvalid(ring, 3); | 
| 120 } | 121 } | 
| 121 | 122 | 
| 122 | 123 | 
| 123 // Test that the ring table is updated when the scavenger moves an object. | 124 // Test that the ring table is updated when the scavenger moves an object. | 
| 124 TEST_CASE(ObjectIdRingScavengeMoveTest) { | 125 TEST_CASE(ObjectIdRingScavengeMoveTest) { | 
| 125   const char* kScriptChars = | 126   const char* kScriptChars = | 
| 126   "main() {\n" | 127       "main() {\n" | 
| 127   "  return [1, 2, 3];\n" | 128       "  return [1, 2, 3];\n" | 
| 128   "}\n"; | 129       "}\n"; | 
| 129   Dart_Handle lib = TestCase::LoadTestScript(kScriptChars, NULL); | 130   Dart_Handle lib = TestCase::LoadTestScript(kScriptChars, NULL); | 
| 130   Dart_Handle result = Dart_Invoke(lib, NewString("main"), 0, NULL); | 131   Dart_Handle result = Dart_Invoke(lib, NewString("main"), 0, NULL); | 
| 131   intptr_t list_length = 0; | 132   intptr_t list_length = 0; | 
| 132   EXPECT_VALID(result); | 133   EXPECT_VALID(result); | 
| 133   EXPECT(!Dart_IsNull(result)); | 134   EXPECT(!Dart_IsNull(result)); | 
| 134   EXPECT(Dart_IsList(result)); | 135   EXPECT(Dart_IsList(result)); | 
| 135   EXPECT_VALID(Dart_ListLength(result, &list_length)); | 136   EXPECT_VALID(Dart_ListLength(result, &list_length)); | 
| 136   EXPECT_EQ(3, list_length); | 137   EXPECT_EQ(3, list_length); | 
| 137   Isolate* isolate = thread->isolate(); | 138   Isolate* isolate = thread->isolate(); | 
| 138   Heap* heap = isolate->heap(); | 139   Heap* heap = isolate->heap(); | 
| 139   ObjectIdRing* ring = isolate->object_id_ring(); | 140   ObjectIdRing* ring = isolate->object_id_ring(); | 
| 140   ObjectIdRing::LookupResult kind = ObjectIdRing::kInvalid; | 141   ObjectIdRing::LookupResult kind = ObjectIdRing::kInvalid; | 
| 141   RawObject* raw_obj = Api::UnwrapHandle(result); | 142   RawObject* raw_obj = Api::UnwrapHandle(result); | 
| 142   // Located in new heap. | 143   // Located in new heap. | 
| 143   EXPECT(raw_obj->IsNewObject()); | 144   EXPECT(raw_obj->IsNewObject()); | 
| 144   EXPECT_NE(Object::null(), raw_obj); | 145   EXPECT_NE(Object::null(), raw_obj); | 
| 145   intptr_t raw_obj_id1 = ring->GetIdForObject(raw_obj); | 146   intptr_t raw_obj_id1 = ring->GetIdForObject(raw_obj); | 
| 146   EXPECT_EQ(0, raw_obj_id1); | 147   EXPECT_EQ(0, raw_obj_id1); | 
| 147   // Get id 0 again. | 148   // Get id 0 again. | 
| 148   EXPECT_EQ(raw_obj_id1, | 149   EXPECT_EQ(raw_obj_id1, ring->GetIdForObject(raw_obj, ObjectIdRing::kReuseId)); | 
| 149       ring->GetIdForObject(raw_obj, ObjectIdRing::kReuseId)); |  | 
| 150   // Add to ring a second time. | 150   // Add to ring a second time. | 
| 151   intptr_t raw_obj_id2 = ring->GetIdForObject(raw_obj); | 151   intptr_t raw_obj_id2 = ring->GetIdForObject(raw_obj); | 
| 152   EXPECT_EQ(1, raw_obj_id2); | 152   EXPECT_EQ(1, raw_obj_id2); | 
| 153   // Get id 0 again. | 153   // Get id 0 again. | 
| 154   EXPECT_EQ(raw_obj_id1, | 154   EXPECT_EQ(raw_obj_id1, ring->GetIdForObject(raw_obj, ObjectIdRing::kReuseId)); | 
| 155       ring->GetIdForObject(raw_obj, ObjectIdRing::kReuseId)); |  | 
| 156   RawObject* raw_obj1 = ring->GetObjectForId(raw_obj_id1, &kind); | 155   RawObject* raw_obj1 = ring->GetObjectForId(raw_obj_id1, &kind); | 
| 157   EXPECT_EQ(ObjectIdRing::kValid, kind); | 156   EXPECT_EQ(ObjectIdRing::kValid, kind); | 
| 158   RawObject* raw_obj2 = ring->GetObjectForId(raw_obj_id2, &kind); | 157   RawObject* raw_obj2 = ring->GetObjectForId(raw_obj_id2, &kind); | 
| 159   EXPECT_EQ(ObjectIdRing::kValid, kind); | 158   EXPECT_EQ(ObjectIdRing::kValid, kind); | 
| 160   EXPECT_NE(Object::null(), raw_obj1); | 159   EXPECT_NE(Object::null(), raw_obj1); | 
| 161   EXPECT_NE(Object::null(), raw_obj2); | 160   EXPECT_NE(Object::null(), raw_obj2); | 
| 162   EXPECT_EQ(RawObject::ToAddr(raw_obj), RawObject::ToAddr(raw_obj1)); | 161   EXPECT_EQ(RawObject::ToAddr(raw_obj), RawObject::ToAddr(raw_obj1)); | 
| 163   EXPECT_EQ(RawObject::ToAddr(raw_obj), RawObject::ToAddr(raw_obj2)); | 162   EXPECT_EQ(RawObject::ToAddr(raw_obj), RawObject::ToAddr(raw_obj2)); | 
| 164   { | 163   { | 
| 165     TransitionNativeToVM transition(thread); | 164     TransitionNativeToVM transition(thread); | 
| (...skipping 13 matching lines...) Expand all  Loading... | 
| 179   EXPECT_NE(RawObject::ToAddr(raw_obj2), RawObject::ToAddr(raw_object_moved2)); | 178   EXPECT_NE(RawObject::ToAddr(raw_obj2), RawObject::ToAddr(raw_object_moved2)); | 
| 180   // Test that we still point at the same list. | 179   // Test that we still point at the same list. | 
| 181   Dart_Handle moved_handle = Api::NewHandle(thread, raw_object_moved1); | 180   Dart_Handle moved_handle = Api::NewHandle(thread, raw_object_moved1); | 
| 182   EXPECT_VALID(moved_handle); | 181   EXPECT_VALID(moved_handle); | 
| 183   EXPECT(!Dart_IsNull(moved_handle)); | 182   EXPECT(!Dart_IsNull(moved_handle)); | 
| 184   EXPECT(Dart_IsList(moved_handle)); | 183   EXPECT(Dart_IsList(moved_handle)); | 
| 185   EXPECT_VALID(Dart_ListLength(moved_handle, &list_length)); | 184   EXPECT_VALID(Dart_ListLength(moved_handle, &list_length)); | 
| 186   EXPECT_EQ(3, list_length); | 185   EXPECT_EQ(3, list_length); | 
| 187   // Test id reuse. | 186   // Test id reuse. | 
| 188   EXPECT_EQ(raw_obj_id1, | 187   EXPECT_EQ(raw_obj_id1, | 
| 189       ring->GetIdForObject(raw_object_moved1, ObjectIdRing::kReuseId)); | 188             ring->GetIdForObject(raw_object_moved1, ObjectIdRing::kReuseId)); | 
| 190 } | 189 } | 
| 191 | 190 | 
| 192 | 191 | 
| 193 // Test that the ring table is updated with nulls when the old GC collects. | 192 // Test that the ring table is updated with nulls when the old GC collects. | 
| 194 VM_TEST_CASE(ObjectIdRingOldGCTest) { | 193 VM_TEST_CASE(ObjectIdRingOldGCTest) { | 
| 195   Isolate* isolate = thread->isolate(); | 194   Isolate* isolate = thread->isolate(); | 
| 196   Heap* heap = isolate->heap(); | 195   Heap* heap = isolate->heap(); | 
| 197   ObjectIdRing* ring = isolate->object_id_ring(); | 196   ObjectIdRing* ring = isolate->object_id_ring(); | 
| 198 | 197 | 
| 199   ObjectIdRing::LookupResult kind = ObjectIdRing::kInvalid; | 198   ObjectIdRing::LookupResult kind = ObjectIdRing::kInvalid; | 
| (...skipping 71 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 271   // Check our first entry reports it has expired. | 270   // Check our first entry reports it has expired. | 
| 272   obj_lookup = ring->GetObjectForId(obj_id, &kind); | 271   obj_lookup = ring->GetObjectForId(obj_id, &kind); | 
| 273   EXPECT_EQ(ObjectIdRing::kExpired, kind); | 272   EXPECT_EQ(ObjectIdRing::kExpired, kind); | 
| 274   EXPECT_NE(obj.raw(), obj_lookup); | 273   EXPECT_NE(obj.raw(), obj_lookup); | 
| 275   EXPECT_EQ(Object::null(), obj_lookup); | 274   EXPECT_EQ(Object::null(), obj_lookup); | 
| 276 } | 275 } | 
| 277 | 276 | 
| 278 #endif  // !PRODUCT | 277 #endif  // !PRODUCT | 
| 279 | 278 | 
| 280 }  // namespace dart | 279 }  // namespace dart | 
| OLD | NEW | 
|---|