| 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" |
| (...skipping 94 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 105 Isolate* isolate = Isolate::Current(); | 105 Isolate* isolate = Isolate::Current(); |
| 106 Heap* heap = isolate->heap(); | 106 Heap* heap = isolate->heap(); |
| 107 ObjectIdRing* ring = isolate->object_id_ring(); | 107 ObjectIdRing* ring = isolate->object_id_ring(); |
| 108 ObjectIdRing::LookupResult kind = ObjectIdRing::kInvalid; | 108 ObjectIdRing::LookupResult kind = ObjectIdRing::kInvalid; |
| 109 RawObject* raw_obj = Api::UnwrapHandle(result); | 109 RawObject* raw_obj = Api::UnwrapHandle(result); |
| 110 // Located in new heap. | 110 // Located in new heap. |
| 111 EXPECT(raw_obj->IsNewObject()); | 111 EXPECT(raw_obj->IsNewObject()); |
| 112 EXPECT_NE(Object::null(), raw_obj); | 112 EXPECT_NE(Object::null(), raw_obj); |
| 113 intptr_t raw_obj_id1 = ring->GetIdForObject(raw_obj); | 113 intptr_t raw_obj_id1 = ring->GetIdForObject(raw_obj); |
| 114 EXPECT_EQ(0, raw_obj_id1); | 114 EXPECT_EQ(0, raw_obj_id1); |
| 115 // Get id 0 again. |
| 116 EXPECT_EQ(raw_obj_id1, |
| 117 ring->GetIdForObject(raw_obj, ObjectIdRing::kExistingOrNewId)); |
| 118 // Add to ring a second time. |
| 115 intptr_t raw_obj_id2 = ring->GetIdForObject(raw_obj); | 119 intptr_t raw_obj_id2 = ring->GetIdForObject(raw_obj); |
| 116 EXPECT_EQ(1, raw_obj_id2); | 120 EXPECT_EQ(1, raw_obj_id2); |
| 121 // Get id 0 again. |
| 122 EXPECT_EQ(raw_obj_id1, |
| 123 ring->GetIdForObject(raw_obj, ObjectIdRing::kExistingOrNewId)); |
| 117 RawObject* raw_obj1 = ring->GetObjectForId(raw_obj_id1, &kind); | 124 RawObject* raw_obj1 = ring->GetObjectForId(raw_obj_id1, &kind); |
| 118 EXPECT_EQ(ObjectIdRing::kValid, kind); | 125 EXPECT_EQ(ObjectIdRing::kValid, kind); |
| 119 RawObject* raw_obj2 = ring->GetObjectForId(raw_obj_id2, &kind); | 126 RawObject* raw_obj2 = ring->GetObjectForId(raw_obj_id2, &kind); |
| 120 EXPECT_EQ(ObjectIdRing::kValid, kind); | 127 EXPECT_EQ(ObjectIdRing::kValid, kind); |
| 121 EXPECT_NE(Object::null(), raw_obj1); | 128 EXPECT_NE(Object::null(), raw_obj1); |
| 122 EXPECT_NE(Object::null(), raw_obj2); | 129 EXPECT_NE(Object::null(), raw_obj2); |
| 123 EXPECT_EQ(RawObject::ToAddr(raw_obj), RawObject::ToAddr(raw_obj1)); | 130 EXPECT_EQ(RawObject::ToAddr(raw_obj), RawObject::ToAddr(raw_obj1)); |
| 124 EXPECT_EQ(RawObject::ToAddr(raw_obj), RawObject::ToAddr(raw_obj2)); | 131 EXPECT_EQ(RawObject::ToAddr(raw_obj), RawObject::ToAddr(raw_obj2)); |
| 125 // Force a scavenge. | 132 // Force a scavenge. |
| 126 heap->CollectGarbage(Heap::kNew); | 133 heap->CollectGarbage(Heap::kNew); |
| 127 RawObject* raw_object_moved1 = ring->GetObjectForId(raw_obj_id1, &kind); | 134 RawObject* raw_object_moved1 = ring->GetObjectForId(raw_obj_id1, &kind); |
| 128 EXPECT_EQ(ObjectIdRing::kValid, kind); | 135 EXPECT_EQ(ObjectIdRing::kValid, kind); |
| 129 RawObject* raw_object_moved2 = ring->GetObjectForId(raw_obj_id2, &kind); | 136 RawObject* raw_object_moved2 = ring->GetObjectForId(raw_obj_id2, &kind); |
| 130 EXPECT_EQ(ObjectIdRing::kValid, kind); | 137 EXPECT_EQ(ObjectIdRing::kValid, kind); |
| 131 EXPECT_NE(Object::null(), raw_object_moved1); | 138 EXPECT_NE(Object::null(), raw_object_moved1); |
| 132 EXPECT_NE(Object::null(), raw_object_moved2); | 139 EXPECT_NE(Object::null(), raw_object_moved2); |
| 133 EXPECT_EQ(RawObject::ToAddr(raw_object_moved1), | 140 EXPECT_EQ(RawObject::ToAddr(raw_object_moved1), |
| 134 RawObject::ToAddr(raw_object_moved2)); | 141 RawObject::ToAddr(raw_object_moved2)); |
| 135 // Test that objects have moved. | 142 // Test that objects have moved. |
| 136 EXPECT_NE(RawObject::ToAddr(raw_obj1), RawObject::ToAddr(raw_object_moved1)); | 143 EXPECT_NE(RawObject::ToAddr(raw_obj1), RawObject::ToAddr(raw_object_moved1)); |
| 137 EXPECT_NE(RawObject::ToAddr(raw_obj2), RawObject::ToAddr(raw_object_moved2)); | 144 EXPECT_NE(RawObject::ToAddr(raw_obj2), RawObject::ToAddr(raw_object_moved2)); |
| 138 // Test that we still point at the same list. | 145 // Test that we still point at the same list. |
| 139 Dart_Handle moved_handle = Api::NewHandle(isolate, raw_object_moved1); | 146 Dart_Handle moved_handle = Api::NewHandle(isolate, raw_object_moved1); |
| 140 EXPECT_VALID(moved_handle); | 147 EXPECT_VALID(moved_handle); |
| 141 EXPECT(!Dart_IsNull(moved_handle)); | 148 EXPECT(!Dart_IsNull(moved_handle)); |
| 142 EXPECT(Dart_IsList(moved_handle)); | 149 EXPECT(Dart_IsList(moved_handle)); |
| 143 EXPECT_VALID(Dart_ListLength(moved_handle, &list_length)); | 150 EXPECT_VALID(Dart_ListLength(moved_handle, &list_length)); |
| 144 EXPECT_EQ(3, list_length); | 151 EXPECT_EQ(3, list_length); |
| 152 // Test id reuse. |
| 153 EXPECT_EQ(raw_obj_id1, |
| 154 ring->GetIdForObject(raw_object_moved1, ObjectIdRing::kExistingOrNewId)); |
| 145 } | 155 } |
| 146 | 156 |
| 147 | 157 |
| 148 // Test that the ring table is updated with nulls when the old GC collects. | 158 // Test that the ring table is updated with nulls when the old GC collects. |
| 149 TEST_CASE(ObjectIdRingOldGCTest) { | 159 TEST_CASE(ObjectIdRingOldGCTest) { |
| 150 Isolate* isolate = Isolate::Current(); | 160 Isolate* isolate = Isolate::Current(); |
| 151 Heap* heap = isolate->heap(); | 161 Heap* heap = isolate->heap(); |
| 152 ObjectIdRing* ring = isolate->object_id_ring(); | 162 ObjectIdRing* ring = isolate->object_id_ring(); |
| 153 | 163 |
| 154 ObjectIdRing::LookupResult kind = ObjectIdRing::kInvalid; | 164 ObjectIdRing::LookupResult kind = ObjectIdRing::kInvalid; |
| (...skipping 69 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 224 } | 234 } |
| 225 | 235 |
| 226 // Check our first entry reports it has expired. | 236 // Check our first entry reports it has expired. |
| 227 obj_lookup = ring->GetObjectForId(obj_id, &kind); | 237 obj_lookup = ring->GetObjectForId(obj_id, &kind); |
| 228 EXPECT_EQ(ObjectIdRing::kExpired, kind); | 238 EXPECT_EQ(ObjectIdRing::kExpired, kind); |
| 229 EXPECT_NE(obj.raw(), obj_lookup); | 239 EXPECT_NE(obj.raw(), obj_lookup); |
| 230 EXPECT_EQ(Object::null(), obj_lookup); | 240 EXPECT_EQ(Object::null(), obj_lookup); |
| 231 } | 241 } |
| 232 | 242 |
| 233 } // namespace dart | 243 } // namespace dart |
| OLD | NEW |