| 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/become.h" |
| 9 #include "vm/dart_api_impl.h" | 9 #include "vm/dart_api_impl.h" |
| 10 #include "vm/globals.h" | 10 #include "vm/globals.h" |
| (...skipping 55 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 66 EXPECT(!Dart_IsNull(result)); | 66 EXPECT(!Dart_IsNull(result)); |
| 67 EXPECT(Dart_IsList(result)); | 67 EXPECT(Dart_IsList(result)); |
| 68 TransitionNativeToVM transition(thread); | 68 TransitionNativeToVM transition(thread); |
| 69 Isolate* isolate = Isolate::Current(); | 69 Isolate* isolate = Isolate::Current(); |
| 70 Heap* heap = isolate->heap(); | 70 Heap* heap = isolate->heap(); |
| 71 heap->CollectGarbage(Heap::kOld); | 71 heap->CollectGarbage(Heap::kOld); |
| 72 Dart_ExitScope(); | 72 Dart_ExitScope(); |
| 73 heap->CollectGarbage(Heap::kOld); | 73 heap->CollectGarbage(Heap::kOld); |
| 74 } | 74 } |
| 75 | 75 |
| 76 | |
| 77 #ifndef PRODUCT | 76 #ifndef PRODUCT |
| 78 class ClassHeapStatsTestHelper { | 77 class ClassHeapStatsTestHelper { |
| 79 public: | 78 public: |
| 80 static ClassHeapStats* GetHeapStatsForCid(ClassTable* class_table, | 79 static ClassHeapStats* GetHeapStatsForCid(ClassTable* class_table, |
| 81 intptr_t cid) { | 80 intptr_t cid) { |
| 82 return class_table->PreliminaryStatsAt(cid); | 81 return class_table->PreliminaryStatsAt(cid); |
| 83 } | 82 } |
| 84 | 83 |
| 85 static void DumpClassHeapStats(ClassHeapStats* stats) { | 84 static void DumpClassHeapStats(ClassHeapStats* stats) { |
| 86 OS::Print("%" Pd " ", stats->recent.new_count); | 85 OS::Print("%" Pd " ", stats->recent.new_count); |
| 87 OS::Print("%" Pd " ", stats->post_gc.new_count); | 86 OS::Print("%" Pd " ", stats->post_gc.new_count); |
| 88 OS::Print("%" Pd " ", stats->pre_gc.new_count); | 87 OS::Print("%" Pd " ", stats->pre_gc.new_count); |
| 89 OS::Print("\n"); | 88 OS::Print("\n"); |
| 90 } | 89 } |
| 91 }; | 90 }; |
| 92 | 91 |
| 93 | |
| 94 static RawClass* GetClass(const Library& lib, const char* name) { | 92 static RawClass* GetClass(const Library& lib, const char* name) { |
| 95 const Class& cls = Class::Handle( | 93 const Class& cls = Class::Handle( |
| 96 lib.LookupClass(String::Handle(Symbols::New(Thread::Current(), name)))); | 94 lib.LookupClass(String::Handle(Symbols::New(Thread::Current(), name)))); |
| 97 EXPECT(!cls.IsNull()); // No ambiguity error expected. | 95 EXPECT(!cls.IsNull()); // No ambiguity error expected. |
| 98 return cls.raw(); | 96 return cls.raw(); |
| 99 } | 97 } |
| 100 | 98 |
| 101 | |
| 102 TEST_CASE(ClassHeapStats) { | 99 TEST_CASE(ClassHeapStats) { |
| 103 const char* kScriptChars = | 100 const char* kScriptChars = |
| 104 "class A {\n" | 101 "class A {\n" |
| 105 " var a;\n" | 102 " var a;\n" |
| 106 " var b;\n" | 103 " var b;\n" |
| 107 "}\n" | 104 "}\n" |
| 108 "" | 105 "" |
| 109 "main() {\n" | 106 "main() {\n" |
| 110 " var x = new A();\n" | 107 " var x = new A();\n" |
| 111 " return new A();\n" | 108 " return new A();\n" |
| (...skipping 73 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 185 EXPECT_EQ(1, class_stats->pre_gc.old_count); | 182 EXPECT_EQ(1, class_stats->pre_gc.old_count); |
| 186 EXPECT_EQ(0, class_stats->post_gc.old_count); | 183 EXPECT_EQ(0, class_stats->post_gc.old_count); |
| 187 EXPECT_EQ(0, class_stats->recent.old_count); | 184 EXPECT_EQ(0, class_stats->recent.old_count); |
| 188 // Perform GC. | 185 // Perform GC. |
| 189 heap->CollectGarbage(Heap::kOld); | 186 heap->CollectGarbage(Heap::kOld); |
| 190 EXPECT_EQ(0, class_stats->pre_gc.old_count); | 187 EXPECT_EQ(0, class_stats->pre_gc.old_count); |
| 191 EXPECT_EQ(0, class_stats->post_gc.old_count); | 188 EXPECT_EQ(0, class_stats->post_gc.old_count); |
| 192 EXPECT_EQ(0, class_stats->recent.old_count); | 189 EXPECT_EQ(0, class_stats->recent.old_count); |
| 193 } | 190 } |
| 194 | 191 |
| 195 | |
| 196 TEST_CASE(ArrayHeapStats) { | 192 TEST_CASE(ArrayHeapStats) { |
| 197 const char* kScriptChars = | 193 const char* kScriptChars = |
| 198 "List f(int len) {\n" | 194 "List f(int len) {\n" |
| 199 " return new List(len);\n" | 195 " return new List(len);\n" |
| 200 "}\n" | 196 "}\n" |
| 201 "" | 197 "" |
| 202 "main() {\n" | 198 "main() {\n" |
| 203 " return f(1234);\n" | 199 " return f(1234);\n" |
| 204 "}\n"; | 200 "}\n"; |
| 205 Dart_Handle h_lib = TestCase::LoadTestScript(kScriptChars, NULL); | 201 Dart_Handle h_lib = TestCase::LoadTestScript(kScriptChars, NULL); |
| (...skipping 19 matching lines...) Expand all Loading... |
| 225 const intptr_t expected_size = Array::InstanceSize(1234); | 221 const intptr_t expected_size = Array::InstanceSize(1234); |
| 226 // Invoking the method might involve some additional tiny array allocations, | 222 // Invoking the method might involve some additional tiny array allocations, |
| 227 // so we allow slightly more than expected. | 223 // so we allow slightly more than expected. |
| 228 static const intptr_t kTolerance = 10 * kWordSize; | 224 static const intptr_t kTolerance = 10 * kWordSize; |
| 229 EXPECT_LE(expected_size, after - before); | 225 EXPECT_LE(expected_size, after - before); |
| 230 EXPECT_GT(expected_size + kTolerance, after - before); | 226 EXPECT_GT(expected_size + kTolerance, after - before); |
| 231 Dart_ExitScope(); | 227 Dart_ExitScope(); |
| 232 } | 228 } |
| 233 #endif // !PRODUCT | 229 #endif // !PRODUCT |
| 234 | 230 |
| 235 | |
| 236 class FindOnly : public FindObjectVisitor { | 231 class FindOnly : public FindObjectVisitor { |
| 237 public: | 232 public: |
| 238 explicit FindOnly(RawObject* target) : target_(target) { | 233 explicit FindOnly(RawObject* target) : target_(target) { |
| 239 #if defined(DEBUG) | 234 #if defined(DEBUG) |
| 240 EXPECT_GT(Thread::Current()->no_safepoint_scope_depth(), 0); | 235 EXPECT_GT(Thread::Current()->no_safepoint_scope_depth(), 0); |
| 241 #endif | 236 #endif |
| 242 } | 237 } |
| 243 virtual ~FindOnly() {} | 238 virtual ~FindOnly() {} |
| 244 | 239 |
| 245 virtual bool FindObject(RawObject* obj) const { return obj == target_; } | 240 virtual bool FindObject(RawObject* obj) const { return obj == target_; } |
| 246 | 241 |
| 247 private: | 242 private: |
| 248 RawObject* target_; | 243 RawObject* target_; |
| 249 }; | 244 }; |
| 250 | 245 |
| 251 | |
| 252 class FindNothing : public FindObjectVisitor { | 246 class FindNothing : public FindObjectVisitor { |
| 253 public: | 247 public: |
| 254 FindNothing() {} | 248 FindNothing() {} |
| 255 virtual ~FindNothing() {} | 249 virtual ~FindNothing() {} |
| 256 virtual bool FindObject(RawObject* obj) const { return false; } | 250 virtual bool FindObject(RawObject* obj) const { return false; } |
| 257 }; | 251 }; |
| 258 | 252 |
| 259 | |
| 260 TEST_CASE(FindObject) { | 253 TEST_CASE(FindObject) { |
| 261 Isolate* isolate = Isolate::Current(); | 254 Isolate* isolate = Isolate::Current(); |
| 262 Heap* heap = isolate->heap(); | 255 Heap* heap = isolate->heap(); |
| 263 Heap::Space spaces[2] = {Heap::kOld, Heap::kNew}; | 256 Heap::Space spaces[2] = {Heap::kOld, Heap::kNew}; |
| 264 for (size_t space = 0; space < ARRAY_SIZE(spaces); ++space) { | 257 for (size_t space = 0; space < ARRAY_SIZE(spaces); ++space) { |
| 265 const String& obj = String::Handle(String::New("x", spaces[space])); | 258 const String& obj = String::Handle(String::New("x", spaces[space])); |
| 266 { | 259 { |
| 267 NoSafepointScope no_safepoint; | 260 NoSafepointScope no_safepoint; |
| 268 FindOnly find_only(obj.raw()); | 261 FindOnly find_only(obj.raw()); |
| 269 EXPECT(obj.raw() == heap->FindObject(&find_only)); | 262 EXPECT(obj.raw() == heap->FindObject(&find_only)); |
| 270 } | 263 } |
| 271 } | 264 } |
| 272 { | 265 { |
| 273 NoSafepointScope no_safepoint; | 266 NoSafepointScope no_safepoint; |
| 274 FindNothing find_nothing; | 267 FindNothing find_nothing; |
| 275 EXPECT(Object::null() == heap->FindObject(&find_nothing)); | 268 EXPECT(Object::null() == heap->FindObject(&find_nothing)); |
| 276 } | 269 } |
| 277 } | 270 } |
| 278 | 271 |
| 279 | |
| 280 TEST_CASE(IterateReadOnly) { | 272 TEST_CASE(IterateReadOnly) { |
| 281 const String& obj = String::Handle(String::New("x", Heap::kOld)); | 273 const String& obj = String::Handle(String::New("x", Heap::kOld)); |
| 282 Heap* heap = Thread::Current()->isolate()->heap(); | 274 Heap* heap = Thread::Current()->isolate()->heap(); |
| 283 EXPECT(heap->Contains(RawObject::ToAddr(obj.raw()))); | 275 EXPECT(heap->Contains(RawObject::ToAddr(obj.raw()))); |
| 284 heap->WriteProtect(true); | 276 heap->WriteProtect(true); |
| 285 EXPECT(heap->Contains(RawObject::ToAddr(obj.raw()))); | 277 EXPECT(heap->Contains(RawObject::ToAddr(obj.raw()))); |
| 286 heap->WriteProtect(false); | 278 heap->WriteProtect(false); |
| 287 EXPECT(heap->Contains(RawObject::ToAddr(obj.raw()))); | 279 EXPECT(heap->Contains(RawObject::ToAddr(obj.raw()))); |
| 288 } | 280 } |
| 289 | 281 |
| 290 | |
| 291 void TestBecomeForward(Heap::Space before_space, Heap::Space after_space) { | 282 void TestBecomeForward(Heap::Space before_space, Heap::Space after_space) { |
| 292 Isolate* isolate = Isolate::Current(); | 283 Isolate* isolate = Isolate::Current(); |
| 293 Heap* heap = isolate->heap(); | 284 Heap* heap = isolate->heap(); |
| 294 | 285 |
| 295 const String& before_obj = String::Handle(String::New("old", before_space)); | 286 const String& before_obj = String::Handle(String::New("old", before_space)); |
| 296 const String& after_obj = String::Handle(String::New("new", after_space)); | 287 const String& after_obj = String::Handle(String::New("new", after_space)); |
| 297 | 288 |
| 298 EXPECT(before_obj.raw() != after_obj.raw()); | 289 EXPECT(before_obj.raw() != after_obj.raw()); |
| 299 | 290 |
| 300 // Allocate the arrays in old space to test the remembered set. | 291 // Allocate the arrays in old space to test the remembered set. |
| 301 const Array& before = Array::Handle(Array::New(1, Heap::kOld)); | 292 const Array& before = Array::Handle(Array::New(1, Heap::kOld)); |
| 302 before.SetAt(0, before_obj); | 293 before.SetAt(0, before_obj); |
| 303 const Array& after = Array::Handle(Array::New(1, Heap::kOld)); | 294 const Array& after = Array::Handle(Array::New(1, Heap::kOld)); |
| 304 after.SetAt(0, after_obj); | 295 after.SetAt(0, after_obj); |
| 305 | 296 |
| 306 Become::ElementsForwardIdentity(before, after); | 297 Become::ElementsForwardIdentity(before, after); |
| 307 | 298 |
| 308 EXPECT(before_obj.raw() == after_obj.raw()); | 299 EXPECT(before_obj.raw() == after_obj.raw()); |
| 309 | 300 |
| 310 heap->CollectAllGarbage(); | 301 heap->CollectAllGarbage(); |
| 311 | 302 |
| 312 EXPECT(before_obj.raw() == after_obj.raw()); | 303 EXPECT(before_obj.raw() == after_obj.raw()); |
| 313 } | 304 } |
| 314 | 305 |
| 315 | |
| 316 ISOLATE_UNIT_TEST_CASE(BecomeFowardOldToOld) { | 306 ISOLATE_UNIT_TEST_CASE(BecomeFowardOldToOld) { |
| 317 TestBecomeForward(Heap::kOld, Heap::kOld); | 307 TestBecomeForward(Heap::kOld, Heap::kOld); |
| 318 } | 308 } |
| 319 | 309 |
| 320 | |
| 321 ISOLATE_UNIT_TEST_CASE(BecomeFowardNewToNew) { | 310 ISOLATE_UNIT_TEST_CASE(BecomeFowardNewToNew) { |
| 322 TestBecomeForward(Heap::kNew, Heap::kNew); | 311 TestBecomeForward(Heap::kNew, Heap::kNew); |
| 323 } | 312 } |
| 324 | 313 |
| 325 | |
| 326 ISOLATE_UNIT_TEST_CASE(BecomeFowardOldToNew) { | 314 ISOLATE_UNIT_TEST_CASE(BecomeFowardOldToNew) { |
| 327 TestBecomeForward(Heap::kOld, Heap::kNew); | 315 TestBecomeForward(Heap::kOld, Heap::kNew); |
| 328 } | 316 } |
| 329 | 317 |
| 330 | |
| 331 ISOLATE_UNIT_TEST_CASE(BecomeFowardNewToOld) { | 318 ISOLATE_UNIT_TEST_CASE(BecomeFowardNewToOld) { |
| 332 TestBecomeForward(Heap::kNew, Heap::kOld); | 319 TestBecomeForward(Heap::kNew, Heap::kOld); |
| 333 } | 320 } |
| 334 | 321 |
| 335 | |
| 336 ISOLATE_UNIT_TEST_CASE(BecomeForwardRememberedObject) { | 322 ISOLATE_UNIT_TEST_CASE(BecomeForwardRememberedObject) { |
| 337 Isolate* isolate = Isolate::Current(); | 323 Isolate* isolate = Isolate::Current(); |
| 338 Heap* heap = isolate->heap(); | 324 Heap* heap = isolate->heap(); |
| 339 | 325 |
| 340 const String& new_element = String::Handle(String::New("new", Heap::kNew)); | 326 const String& new_element = String::Handle(String::New("new", Heap::kNew)); |
| 341 const String& old_element = String::Handle(String::New("old", Heap::kOld)); | 327 const String& old_element = String::Handle(String::New("old", Heap::kOld)); |
| 342 const Array& before_obj = Array::Handle(Array::New(1, Heap::kOld)); | 328 const Array& before_obj = Array::Handle(Array::New(1, Heap::kOld)); |
| 343 const Array& after_obj = Array::Handle(Array::New(1, Heap::kOld)); | 329 const Array& after_obj = Array::Handle(Array::New(1, Heap::kOld)); |
| 344 before_obj.SetAt(0, new_element); | 330 before_obj.SetAt(0, new_element); |
| 345 after_obj.SetAt(0, old_element); | 331 after_obj.SetAt(0, old_element); |
| (...skipping 10 matching lines...) Expand all Loading... |
| 356 Become::ElementsForwardIdentity(before, after); | 342 Become::ElementsForwardIdentity(before, after); |
| 357 | 343 |
| 358 EXPECT(before_obj.raw() == after_obj.raw()); | 344 EXPECT(before_obj.raw() == after_obj.raw()); |
| 359 EXPECT(!after_obj.raw()->IsRemembered()); | 345 EXPECT(!after_obj.raw()->IsRemembered()); |
| 360 | 346 |
| 361 heap->CollectAllGarbage(); | 347 heap->CollectAllGarbage(); |
| 362 | 348 |
| 363 EXPECT(before_obj.raw() == after_obj.raw()); | 349 EXPECT(before_obj.raw() == after_obj.raw()); |
| 364 } | 350 } |
| 365 | 351 |
| 366 | |
| 367 ISOLATE_UNIT_TEST_CASE(CollectAllGarbage_DeadOldToNew) { | 352 ISOLATE_UNIT_TEST_CASE(CollectAllGarbage_DeadOldToNew) { |
| 368 Isolate* isolate = Isolate::Current(); | 353 Isolate* isolate = Isolate::Current(); |
| 369 Heap* heap = isolate->heap(); | 354 Heap* heap = isolate->heap(); |
| 370 | 355 |
| 371 heap->CollectAllGarbage(); | 356 heap->CollectAllGarbage(); |
| 372 intptr_t size_before = | 357 intptr_t size_before = |
| 373 heap->new_space()->UsedInWords() + heap->old_space()->UsedInWords(); | 358 heap->new_space()->UsedInWords() + heap->old_space()->UsedInWords(); |
| 374 | 359 |
| 375 Array& old = Array::Handle(Array::New(1, Heap::kOld)); | 360 Array& old = Array::Handle(Array::New(1, Heap::kOld)); |
| 376 Array& neu = Array::Handle(Array::New(1, Heap::kNew)); | 361 Array& neu = Array::Handle(Array::New(1, Heap::kNew)); |
| 377 old.SetAt(0, neu); | 362 old.SetAt(0, neu); |
| 378 old = Array::null(); | 363 old = Array::null(); |
| 379 neu = Array::null(); | 364 neu = Array::null(); |
| 380 | 365 |
| 381 heap->CollectAllGarbage(); | 366 heap->CollectAllGarbage(); |
| 382 | 367 |
| 383 intptr_t size_after = | 368 intptr_t size_after = |
| 384 heap->new_space()->UsedInWords() + heap->old_space()->UsedInWords(); | 369 heap->new_space()->UsedInWords() + heap->old_space()->UsedInWords(); |
| 385 | 370 |
| 386 EXPECT(size_before == size_after); | 371 EXPECT(size_before == size_after); |
| 387 } | 372 } |
| 388 | 373 |
| 389 | |
| 390 ISOLATE_UNIT_TEST_CASE(CollectAllGarbage_DeadNewToOld) { | 374 ISOLATE_UNIT_TEST_CASE(CollectAllGarbage_DeadNewToOld) { |
| 391 Isolate* isolate = Isolate::Current(); | 375 Isolate* isolate = Isolate::Current(); |
| 392 Heap* heap = isolate->heap(); | 376 Heap* heap = isolate->heap(); |
| 393 | 377 |
| 394 heap->CollectAllGarbage(); | 378 heap->CollectAllGarbage(); |
| 395 intptr_t size_before = | 379 intptr_t size_before = |
| 396 heap->new_space()->UsedInWords() + heap->old_space()->UsedInWords(); | 380 heap->new_space()->UsedInWords() + heap->old_space()->UsedInWords(); |
| 397 | 381 |
| 398 Array& old = Array::Handle(Array::New(1, Heap::kOld)); | 382 Array& old = Array::Handle(Array::New(1, Heap::kOld)); |
| 399 Array& neu = Array::Handle(Array::New(1, Heap::kNew)); | 383 Array& neu = Array::Handle(Array::New(1, Heap::kNew)); |
| 400 neu.SetAt(0, old); | 384 neu.SetAt(0, old); |
| 401 old = Array::null(); | 385 old = Array::null(); |
| 402 neu = Array::null(); | 386 neu = Array::null(); |
| 403 | 387 |
| 404 heap->CollectAllGarbage(); | 388 heap->CollectAllGarbage(); |
| 405 | 389 |
| 406 intptr_t size_after = | 390 intptr_t size_after = |
| 407 heap->new_space()->UsedInWords() + heap->old_space()->UsedInWords(); | 391 heap->new_space()->UsedInWords() + heap->old_space()->UsedInWords(); |
| 408 | 392 |
| 409 EXPECT(size_before == size_after); | 393 EXPECT(size_before == size_after); |
| 410 } | 394 } |
| 411 | 395 |
| 412 | |
| 413 ISOLATE_UNIT_TEST_CASE(CollectAllGarbage_DeadGenCycle) { | 396 ISOLATE_UNIT_TEST_CASE(CollectAllGarbage_DeadGenCycle) { |
| 414 Isolate* isolate = Isolate::Current(); | 397 Isolate* isolate = Isolate::Current(); |
| 415 Heap* heap = isolate->heap(); | 398 Heap* heap = isolate->heap(); |
| 416 | 399 |
| 417 heap->CollectAllGarbage(); | 400 heap->CollectAllGarbage(); |
| 418 intptr_t size_before = | 401 intptr_t size_before = |
| 419 heap->new_space()->UsedInWords() + heap->old_space()->UsedInWords(); | 402 heap->new_space()->UsedInWords() + heap->old_space()->UsedInWords(); |
| 420 | 403 |
| 421 Array& old = Array::Handle(Array::New(1, Heap::kOld)); | 404 Array& old = Array::Handle(Array::New(1, Heap::kOld)); |
| 422 Array& neu = Array::Handle(Array::New(1, Heap::kNew)); | 405 Array& neu = Array::Handle(Array::New(1, Heap::kNew)); |
| 423 neu.SetAt(0, old); | 406 neu.SetAt(0, old); |
| 424 old.SetAt(0, neu); | 407 old.SetAt(0, neu); |
| 425 old = Array::null(); | 408 old = Array::null(); |
| 426 neu = Array::null(); | 409 neu = Array::null(); |
| 427 | 410 |
| 428 heap->CollectAllGarbage(); | 411 heap->CollectAllGarbage(); |
| 429 | 412 |
| 430 intptr_t size_after = | 413 intptr_t size_after = |
| 431 heap->new_space()->UsedInWords() + heap->old_space()->UsedInWords(); | 414 heap->new_space()->UsedInWords() + heap->old_space()->UsedInWords(); |
| 432 | 415 |
| 433 EXPECT(size_before == size_after); | 416 EXPECT(size_before == size_after); |
| 434 } | 417 } |
| 435 | 418 |
| 436 | |
| 437 ISOLATE_UNIT_TEST_CASE(CollectAllGarbage_LiveNewToOld) { | 419 ISOLATE_UNIT_TEST_CASE(CollectAllGarbage_LiveNewToOld) { |
| 438 Isolate* isolate = Isolate::Current(); | 420 Isolate* isolate = Isolate::Current(); |
| 439 Heap* heap = isolate->heap(); | 421 Heap* heap = isolate->heap(); |
| 440 | 422 |
| 441 heap->CollectAllGarbage(); | 423 heap->CollectAllGarbage(); |
| 442 intptr_t size_before = | 424 intptr_t size_before = |
| 443 heap->new_space()->UsedInWords() + heap->old_space()->UsedInWords(); | 425 heap->new_space()->UsedInWords() + heap->old_space()->UsedInWords(); |
| 444 | 426 |
| 445 Array& old = Array::Handle(Array::New(1, Heap::kOld)); | 427 Array& old = Array::Handle(Array::New(1, Heap::kOld)); |
| 446 Array& neu = Array::Handle(Array::New(1, Heap::kNew)); | 428 Array& neu = Array::Handle(Array::New(1, Heap::kNew)); |
| 447 neu.SetAt(0, old); | 429 neu.SetAt(0, old); |
| 448 old = Array::null(); | 430 old = Array::null(); |
| 449 | 431 |
| 450 heap->CollectAllGarbage(); | 432 heap->CollectAllGarbage(); |
| 451 | 433 |
| 452 intptr_t size_after = | 434 intptr_t size_after = |
| 453 heap->new_space()->UsedInWords() + heap->old_space()->UsedInWords(); | 435 heap->new_space()->UsedInWords() + heap->old_space()->UsedInWords(); |
| 454 | 436 |
| 455 EXPECT(size_before < size_after); | 437 EXPECT(size_before < size_after); |
| 456 } | 438 } |
| 457 | 439 |
| 458 | |
| 459 ISOLATE_UNIT_TEST_CASE(CollectAllGarbage_LiveOldToNew) { | 440 ISOLATE_UNIT_TEST_CASE(CollectAllGarbage_LiveOldToNew) { |
| 460 Isolate* isolate = Isolate::Current(); | 441 Isolate* isolate = Isolate::Current(); |
| 461 Heap* heap = isolate->heap(); | 442 Heap* heap = isolate->heap(); |
| 462 | 443 |
| 463 heap->CollectAllGarbage(); | 444 heap->CollectAllGarbage(); |
| 464 intptr_t size_before = | 445 intptr_t size_before = |
| 465 heap->new_space()->UsedInWords() + heap->old_space()->UsedInWords(); | 446 heap->new_space()->UsedInWords() + heap->old_space()->UsedInWords(); |
| 466 | 447 |
| 467 Array& old = Array::Handle(Array::New(1, Heap::kOld)); | 448 Array& old = Array::Handle(Array::New(1, Heap::kOld)); |
| 468 Array& neu = Array::Handle(Array::New(1, Heap::kNew)); | 449 Array& neu = Array::Handle(Array::New(1, Heap::kNew)); |
| 469 old.SetAt(0, neu); | 450 old.SetAt(0, neu); |
| 470 neu = Array::null(); | 451 neu = Array::null(); |
| 471 | 452 |
| 472 heap->CollectAllGarbage(); | 453 heap->CollectAllGarbage(); |
| 473 | 454 |
| 474 intptr_t size_after = | 455 intptr_t size_after = |
| 475 heap->new_space()->UsedInWords() + heap->old_space()->UsedInWords(); | 456 heap->new_space()->UsedInWords() + heap->old_space()->UsedInWords(); |
| 476 | 457 |
| 477 EXPECT(size_before < size_after); | 458 EXPECT(size_before < size_after); |
| 478 } | 459 } |
| 479 | 460 |
| 480 | |
| 481 ISOLATE_UNIT_TEST_CASE(CollectAllGarbage_LiveOldDeadNew) { | 461 ISOLATE_UNIT_TEST_CASE(CollectAllGarbage_LiveOldDeadNew) { |
| 482 Isolate* isolate = Isolate::Current(); | 462 Isolate* isolate = Isolate::Current(); |
| 483 Heap* heap = isolate->heap(); | 463 Heap* heap = isolate->heap(); |
| 484 | 464 |
| 485 heap->CollectAllGarbage(); | 465 heap->CollectAllGarbage(); |
| 486 intptr_t size_before = | 466 intptr_t size_before = |
| 487 heap->new_space()->UsedInWords() + heap->old_space()->UsedInWords(); | 467 heap->new_space()->UsedInWords() + heap->old_space()->UsedInWords(); |
| 488 | 468 |
| 489 Array& old = Array::Handle(Array::New(1, Heap::kOld)); | 469 Array& old = Array::Handle(Array::New(1, Heap::kOld)); |
| 490 Array& neu = Array::Handle(Array::New(1, Heap::kNew)); | 470 Array& neu = Array::Handle(Array::New(1, Heap::kNew)); |
| 491 neu = Array::null(); | 471 neu = Array::null(); |
| 492 old.SetAt(0, old); | 472 old.SetAt(0, old); |
| 493 | 473 |
| 494 heap->CollectAllGarbage(); | 474 heap->CollectAllGarbage(); |
| 495 | 475 |
| 496 intptr_t size_after = | 476 intptr_t size_after = |
| 497 heap->new_space()->UsedInWords() + heap->old_space()->UsedInWords(); | 477 heap->new_space()->UsedInWords() + heap->old_space()->UsedInWords(); |
| 498 | 478 |
| 499 EXPECT(size_before < size_after); | 479 EXPECT(size_before < size_after); |
| 500 } | 480 } |
| 501 | 481 |
| 502 | |
| 503 ISOLATE_UNIT_TEST_CASE(CollectAllGarbage_LiveNewDeadOld) { | 482 ISOLATE_UNIT_TEST_CASE(CollectAllGarbage_LiveNewDeadOld) { |
| 504 Isolate* isolate = Isolate::Current(); | 483 Isolate* isolate = Isolate::Current(); |
| 505 Heap* heap = isolate->heap(); | 484 Heap* heap = isolate->heap(); |
| 506 | 485 |
| 507 heap->CollectAllGarbage(); | 486 heap->CollectAllGarbage(); |
| 508 intptr_t size_before = | 487 intptr_t size_before = |
| 509 heap->new_space()->UsedInWords() + heap->old_space()->UsedInWords(); | 488 heap->new_space()->UsedInWords() + heap->old_space()->UsedInWords(); |
| 510 | 489 |
| 511 Array& old = Array::Handle(Array::New(1, Heap::kOld)); | 490 Array& old = Array::Handle(Array::New(1, Heap::kOld)); |
| 512 Array& neu = Array::Handle(Array::New(1, Heap::kNew)); | 491 Array& neu = Array::Handle(Array::New(1, Heap::kNew)); |
| 513 old = Array::null(); | 492 old = Array::null(); |
| 514 neu.SetAt(0, neu); | 493 neu.SetAt(0, neu); |
| 515 | 494 |
| 516 heap->CollectAllGarbage(); | 495 heap->CollectAllGarbage(); |
| 517 | 496 |
| 518 intptr_t size_after = | 497 intptr_t size_after = |
| 519 heap->new_space()->UsedInWords() + heap->old_space()->UsedInWords(); | 498 heap->new_space()->UsedInWords() + heap->old_space()->UsedInWords(); |
| 520 | 499 |
| 521 EXPECT(size_before < size_after); | 500 EXPECT(size_before < size_after); |
| 522 } | 501 } |
| 523 | 502 |
| 524 | |
| 525 ISOLATE_UNIT_TEST_CASE(CollectAllGarbage_LiveNewToOldChain) { | 503 ISOLATE_UNIT_TEST_CASE(CollectAllGarbage_LiveNewToOldChain) { |
| 526 Isolate* isolate = Isolate::Current(); | 504 Isolate* isolate = Isolate::Current(); |
| 527 Heap* heap = isolate->heap(); | 505 Heap* heap = isolate->heap(); |
| 528 | 506 |
| 529 heap->CollectAllGarbage(); | 507 heap->CollectAllGarbage(); |
| 530 intptr_t size_before = | 508 intptr_t size_before = |
| 531 heap->new_space()->UsedInWords() + heap->old_space()->UsedInWords(); | 509 heap->new_space()->UsedInWords() + heap->old_space()->UsedInWords(); |
| 532 | 510 |
| 533 Array& old = Array::Handle(Array::New(1, Heap::kOld)); | 511 Array& old = Array::Handle(Array::New(1, Heap::kOld)); |
| 534 Array& old2 = Array::Handle(Array::New(1, Heap::kOld)); | 512 Array& old2 = Array::Handle(Array::New(1, Heap::kOld)); |
| 535 Array& neu = Array::Handle(Array::New(1, Heap::kNew)); | 513 Array& neu = Array::Handle(Array::New(1, Heap::kNew)); |
| 536 old.SetAt(0, old2); | 514 old.SetAt(0, old2); |
| 537 neu.SetAt(0, old); | 515 neu.SetAt(0, old); |
| 538 old = Array::null(); | 516 old = Array::null(); |
| 539 old2 = Array::null(); | 517 old2 = Array::null(); |
| 540 | 518 |
| 541 heap->CollectAllGarbage(); | 519 heap->CollectAllGarbage(); |
| 542 | 520 |
| 543 intptr_t size_after = | 521 intptr_t size_after = |
| 544 heap->new_space()->UsedInWords() + heap->old_space()->UsedInWords(); | 522 heap->new_space()->UsedInWords() + heap->old_space()->UsedInWords(); |
| 545 | 523 |
| 546 EXPECT(size_before < size_after); | 524 EXPECT(size_before < size_after); |
| 547 } | 525 } |
| 548 | 526 |
| 549 | |
| 550 ISOLATE_UNIT_TEST_CASE(CollectAllGarbage_LiveOldToNewChain) { | 527 ISOLATE_UNIT_TEST_CASE(CollectAllGarbage_LiveOldToNewChain) { |
| 551 Isolate* isolate = Isolate::Current(); | 528 Isolate* isolate = Isolate::Current(); |
| 552 Heap* heap = isolate->heap(); | 529 Heap* heap = isolate->heap(); |
| 553 | 530 |
| 554 heap->CollectAllGarbage(); | 531 heap->CollectAllGarbage(); |
| 555 intptr_t size_before = | 532 intptr_t size_before = |
| 556 heap->new_space()->UsedInWords() + heap->old_space()->UsedInWords(); | 533 heap->new_space()->UsedInWords() + heap->old_space()->UsedInWords(); |
| 557 | 534 |
| 558 Array& old = Array::Handle(Array::New(1, Heap::kOld)); | 535 Array& old = Array::Handle(Array::New(1, Heap::kOld)); |
| 559 Array& neu = Array::Handle(Array::New(1, Heap::kNew)); | 536 Array& neu = Array::Handle(Array::New(1, Heap::kNew)); |
| 560 Array& neu2 = Array::Handle(Array::New(1, Heap::kOld)); | 537 Array& neu2 = Array::Handle(Array::New(1, Heap::kOld)); |
| 561 neu.SetAt(0, neu2); | 538 neu.SetAt(0, neu2); |
| 562 old.SetAt(0, neu); | 539 old.SetAt(0, neu); |
| 563 neu = Array::null(); | 540 neu = Array::null(); |
| 564 neu2 = Array::null(); | 541 neu2 = Array::null(); |
| 565 | 542 |
| 566 heap->CollectAllGarbage(); | 543 heap->CollectAllGarbage(); |
| 567 | 544 |
| 568 intptr_t size_after = | 545 intptr_t size_after = |
| 569 heap->new_space()->UsedInWords() + heap->old_space()->UsedInWords(); | 546 heap->new_space()->UsedInWords() + heap->old_space()->UsedInWords(); |
| 570 | 547 |
| 571 EXPECT(size_before < size_after); | 548 EXPECT(size_before < size_after); |
| 572 } | 549 } |
| 573 | 550 |
| 574 } // namespace dart | 551 } // namespace dart |
| OLD | NEW |