OLD | NEW |
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 "platform/globals.h" | 5 #include "platform/globals.h" |
6 | 6 |
7 #include "platform/assert.h" | 7 #include "platform/assert.h" |
| 8 #include "vm/become.h" |
8 #include "vm/dart_api_impl.h" | 9 #include "vm/dart_api_impl.h" |
9 #include "vm/globals.h" | 10 #include "vm/globals.h" |
10 #include "vm/heap.h" | 11 #include "vm/heap.h" |
11 #include "vm/unit_test.h" | 12 #include "vm/unit_test.h" |
12 | 13 |
13 namespace dart { | 14 namespace dart { |
14 | 15 |
15 TEST_CASE(OldGC) { | 16 TEST_CASE(OldGC) { |
16 const char* kScriptChars = | 17 const char* kScriptChars = |
17 "main() {\n" | 18 "main() {\n" |
(...skipping 262 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
280 TEST_CASE(IterateReadOnly) { | 281 TEST_CASE(IterateReadOnly) { |
281 const String& obj = String::Handle(String::New("x", Heap::kOld)); | 282 const String& obj = String::Handle(String::New("x", Heap::kOld)); |
282 Heap* heap = Thread::Current()->isolate()->heap(); | 283 Heap* heap = Thread::Current()->isolate()->heap(); |
283 EXPECT(heap->Contains(RawObject::ToAddr(obj.raw()))); | 284 EXPECT(heap->Contains(RawObject::ToAddr(obj.raw()))); |
284 heap->WriteProtect(true); | 285 heap->WriteProtect(true); |
285 EXPECT(heap->Contains(RawObject::ToAddr(obj.raw()))); | 286 EXPECT(heap->Contains(RawObject::ToAddr(obj.raw()))); |
286 heap->WriteProtect(false); | 287 heap->WriteProtect(false); |
287 EXPECT(heap->Contains(RawObject::ToAddr(obj.raw()))); | 288 EXPECT(heap->Contains(RawObject::ToAddr(obj.raw()))); |
288 } | 289 } |
289 | 290 |
290 } // namespace dart. | 291 |
| 292 void TestBecomeForward(Heap::Space before_space, Heap::Space after_space) { |
| 293 Isolate* isolate = Isolate::Current(); |
| 294 Heap* heap = isolate->heap(); |
| 295 |
| 296 const String& before_obj = String::Handle(String::New("old", before_space)); |
| 297 const String& after_obj = String::Handle(String::New("new", after_space)); |
| 298 |
| 299 EXPECT(before_obj.raw() != after_obj.raw()); |
| 300 |
| 301 // Allocate the arrays in old space to test the remembered set. |
| 302 const Array& before = Array::Handle(Array::New(1, Heap::kOld)); |
| 303 before.SetAt(0, before_obj); |
| 304 const Array& after = Array::Handle(Array::New(1, Heap::kOld)); |
| 305 after.SetAt(0, after_obj); |
| 306 |
| 307 Become::ElementsForwardIdentity(before, after); |
| 308 |
| 309 EXPECT(before_obj.raw() == after_obj.raw()); |
| 310 |
| 311 heap->CollectAllGarbage(); |
| 312 |
| 313 EXPECT(before_obj.raw() == after_obj.raw()); |
| 314 } |
| 315 |
| 316 |
| 317 VM_TEST_CASE(BecomeFowardOldToOld) { |
| 318 TestBecomeForward(Heap::kOld, Heap::kOld); |
| 319 } |
| 320 |
| 321 |
| 322 VM_TEST_CASE(BecomeFowardNewToNew) { |
| 323 TestBecomeForward(Heap::kNew, Heap::kNew); |
| 324 } |
| 325 |
| 326 |
| 327 VM_TEST_CASE(BecomeFowardOldToNew) { |
| 328 TestBecomeForward(Heap::kOld, Heap::kNew); |
| 329 } |
| 330 |
| 331 |
| 332 VM_TEST_CASE(BecomeFowardNewToOld) { |
| 333 TestBecomeForward(Heap::kNew, Heap::kOld); |
| 334 } |
| 335 |
| 336 |
| 337 VM_TEST_CASE(BecomeForwardRememberedObject) { |
| 338 Isolate* isolate = Isolate::Current(); |
| 339 Heap* heap = isolate->heap(); |
| 340 |
| 341 const String& new_element = String::Handle(String::New("new", Heap::kNew)); |
| 342 const String& old_element = String::Handle(String::New("old", Heap::kOld)); |
| 343 const Array& before_obj = Array::Handle(Array::New(1, Heap::kOld)); |
| 344 const Array& after_obj = Array::Handle(Array::New(1, Heap::kOld)); |
| 345 before_obj.SetAt(0, new_element); |
| 346 after_obj.SetAt(0, old_element); |
| 347 EXPECT(before_obj.raw()->IsRemembered()); |
| 348 EXPECT(!after_obj.raw()->IsRemembered()); |
| 349 |
| 350 EXPECT(before_obj.raw() != after_obj.raw()); |
| 351 |
| 352 const Array& before = Array::Handle(Array::New(1, Heap::kOld)); |
| 353 before.SetAt(0, before_obj); |
| 354 const Array& after = Array::Handle(Array::New(1, Heap::kOld)); |
| 355 after.SetAt(0, after_obj); |
| 356 |
| 357 Become::ElementsForwardIdentity(before, after); |
| 358 |
| 359 EXPECT(before_obj.raw() == after_obj.raw()); |
| 360 EXPECT(!after_obj.raw()->IsRemembered()); |
| 361 |
| 362 heap->CollectAllGarbage(); |
| 363 |
| 364 EXPECT(before_obj.raw() == after_obj.raw()); |
| 365 } |
| 366 |
| 367 } // namespace dart |
OLD | NEW |