OLD | NEW |
---|---|
1 /* | 1 /* |
2 * Copyright (c) 2013, Google Inc. All rights reserved. | 2 * Copyright (c) 2013, Google Inc. All rights reserved. |
3 * | 3 * |
4 * Redistribution and use in source and binary forms, with or without | 4 * Redistribution and use in source and binary forms, with or without |
5 * modification, are permitted provided that the following conditions are | 5 * modification, are permitted provided that the following conditions are |
6 * met: | 6 * met: |
7 * | 7 * |
8 * * Redistributions of source code must retain the above copyright | 8 * * Redistributions of source code must retain the above copyright |
9 * notice, this list of conditions and the following disclaimer. | 9 * notice, this list of conditions and the following disclaimer. |
10 * * Redistributions in binary form must reproduce the above | 10 * * Redistributions in binary form must reproduce the above |
(...skipping 330 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
341 ASSERT_EQ(2, HeapTestSubClass::s_destructorCalls); | 341 ASSERT_EQ(2, HeapTestSubClass::s_destructorCalls); |
342 ASSERT_EQ(3, HeapTestSuperClass::s_destructorCalls); | 342 ASSERT_EQ(3, HeapTestSuperClass::s_destructorCalls); |
343 // Destructors not called again when sweeping again. | 343 // Destructors not called again when sweeping again. |
344 Heap::sweep(); | 344 Heap::sweep(); |
345 ASSERT_EQ(2, HeapTestSubClass::s_destructorCalls); | 345 ASSERT_EQ(2, HeapTestSubClass::s_destructorCalls); |
346 ASSERT_EQ(3, HeapTestSuperClass::s_destructorCalls); | 346 ASSERT_EQ(3, HeapTestSuperClass::s_destructorCalls); |
347 } | 347 } |
348 | 348 |
349 static void refCountedHeapAllocatedTest() | 349 static void refCountedHeapAllocatedTest() |
350 { | 350 { |
351 RefCountedAndHeapAllocated::s_destructorCalls = 0; | |
352 RefCountedAndHeapAllocated2::s_destructorCalls = 0; | |
351 { | 353 { |
352 RefPtr<RefCountedAndHeapAllocated> o1 = RefCountedAndHeapAllocated:: create(); | 354 RefPtr<RefCountedAndHeapAllocated> o1 = RefCountedAndHeapAllocated:: create(); |
353 RefPtr<RefCountedAndHeapAllocated> o2 = RefCountedAndHeapAllocated:: create(); | 355 RefPtr<RefCountedAndHeapAllocated> o2 = RefCountedAndHeapAllocated:: create(); |
354 RefPtr<RefCountedAndHeapAllocated2> o3 = RefCountedAndHeapAllocated2 ::create(); | 356 RefPtr<RefCountedAndHeapAllocated2> o3 = RefCountedAndHeapAllocated2 ::create(); |
355 RefPtr<RefCountedAndHeapAllocated2> o4 = RefCountedAndHeapAllocated2 ::create(); | 357 RefPtr<RefCountedAndHeapAllocated2> o4 = RefCountedAndHeapAllocated2 ::create(); |
356 void* objects[4] = { o1.get(), o2.get(), o3.get(), o4.get() }; | 358 void* objects[4] = { o1.get(), o2.get(), o3.get(), o4.get() }; |
357 RefCountedHeapAllocatedHandleVisitor visitor(4, objects); | 359 RefCountedHeapAllocatedHandleVisitor visitor(4, objects); |
358 PersistentBase::visitRoots(&visitor); | 360 PersistentBase::visitRoots(&visitor); |
359 ASSERT_TRUE(visitor.validate()); | 361 ASSERT_TRUE(visitor.validate()); |
360 | 362 |
361 Heap::collectGarbage(); | 363 Heap::collectGarbage(); |
362 ASSERT_EQ(0, RefCountedAndHeapAllocated::s_destructorCalls); | 364 ASSERT_EQ(0, RefCountedAndHeapAllocated::s_destructorCalls); |
363 ASSERT_EQ(0, RefCountedAndHeapAllocated2::s_destructorCalls); | 365 ASSERT_EQ(0, RefCountedAndHeapAllocated2::s_destructorCalls); |
364 } | 366 } |
365 Heap::collectGarbage(); | 367 Heap::collectGarbage(); |
366 ASSERT_EQ(2, RefCountedAndHeapAllocated::s_destructorCalls); | 368 ASSERT_EQ(2, RefCountedAndHeapAllocated::s_destructorCalls); |
367 ASSERT_EQ(2, RefCountedAndHeapAllocated2::s_destructorCalls); | 369 ASSERT_EQ(2, RefCountedAndHeapAllocated2::s_destructorCalls); |
368 } | 370 } |
369 | 371 |
372 static void refCountedHeapAllocatedWithHandlesTest() | |
373 { | |
374 RefCountedAndHeapAllocated::s_destructorCalls = 0; | |
375 RefCountedAndHeapAllocated2::s_destructorCalls = 0; | |
376 { | |
377 HandleScope scope; | |
378 Handle<RefCountedAndHeapAllocated> handle1; | |
379 Handle<RefCountedAndHeapAllocated> handle2; | |
380 { | |
381 RefPtr<RefCountedAndHeapAllocated> object1 = RefCountedAndHeapAl located::create(); | |
382 RefPtr<RefCountedAndHeapAllocated> object2 = RefCountedAndHeapAl located::create(); | |
383 handle1 = Handle<RefCountedAndHeapAllocated>(object1.get()); | |
384 handle2 = Handle<RefCountedAndHeapAllocated>(object2.get()); | |
385 void* objects[2] = { object1.get(), object2.get() }; | |
386 RefCountedHeapAllocatedHandleVisitor visitor(2, objects); | |
387 PersistentBase::visitRoots(&visitor); | |
388 ASSERT_TRUE(visitor.validate()); | |
389 | |
390 Heap::collectGarbage(); | |
391 ASSERT_EQ(0, RefCountedAndHeapAllocated::s_destructorCalls); | |
392 } | |
393 Heap::collectGarbage(); | |
394 ASSERT_EQ(0, RefCountedAndHeapAllocated::s_destructorCalls); | |
395 | |
396 // At this point, the reference counts of object1 and object2 are 0. | |
397 // Only handle1 and handle2 keep references to object1 and object2. | |
Mads Ager (google)
2013/05/29 13:47:54
Maybe check that PersistentBase::visitRoots does n
| |
398 | |
399 { | |
400 RefPtr<RefCountedAndHeapAllocated> object1 = adoptRef(handle1.ra w()); | |
401 RefPtr<RefCountedAndHeapAllocated> object2 = adoptRef(handle2.ra w()); | |
402 handle1 = Handle<RefCountedAndHeapAllocated>(object1.get()); | |
Mads Ager (google)
2013/05/29 13:47:54
These lines are just reassigning the same value to
haraken
2013/05/29 14:52:16
Good catch! I verified that PersistentBase::visitR
| |
403 handle2 = Handle<RefCountedAndHeapAllocated>(object2.get()); | |
404 | |
405 Heap::collectGarbage(); | |
406 ASSERT_EQ(0, RefCountedAndHeapAllocated::s_destructorCalls); | |
407 } | |
408 | |
409 Heap::collectGarbage(); | |
410 ASSERT_EQ(0, RefCountedAndHeapAllocated::s_destructorCalls); | |
411 } | |
412 Heap::collectGarbage(); | |
413 ASSERT_EQ(2, RefCountedAndHeapAllocated::s_destructorCalls); | |
414 } | |
415 | |
370 static void markTest(); | 416 static void markTest(); |
371 static void deepTest(); | 417 static void deepTest(); |
372 static void wideTest(); | 418 static void wideTest(); |
373 static void memberTest(); | 419 static void memberTest(); |
374 }; | 420 }; |
375 | 421 |
376 class Bar { | 422 class Bar { |
377 DECLARE_GC_TYPE_MARKER | 423 DECLARE_GC_TYPE_MARKER |
378 public: | 424 public: |
379 Bar() | 425 Bar() |
(...skipping 197 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
577 TEST(heap, Finalization) | 623 TEST(heap, Finalization) |
578 { | 624 { |
579 HeapTester::finalizationTest(); | 625 HeapTester::finalizationTest(); |
580 } | 626 } |
581 | 627 |
582 TEST(heap, RefCountedHeapAllocated) | 628 TEST(heap, RefCountedHeapAllocated) |
583 { | 629 { |
584 HeapTester::refCountedHeapAllocatedTest(); | 630 HeapTester::refCountedHeapAllocatedTest(); |
585 } | 631 } |
586 | 632 |
633 TEST(heap, RefCountedHeapAllocatedWithHandles) | |
634 { | |
635 HeapTester::refCountedHeapAllocatedWithHandlesTest(); | |
636 } | |
637 | |
587 TEST(heap, Mark) | 638 TEST(heap, Mark) |
588 { | 639 { |
589 HeapTester::markTest(); | 640 HeapTester::markTest(); |
590 } | 641 } |
591 | 642 |
592 TEST(heap, Deep) | 643 TEST(heap, Deep) |
593 { | 644 { |
594 HeapTester::deepTest(); | 645 HeapTester::deepTest(); |
595 } | 646 } |
596 | 647 |
597 TEST(heap, Wide) | 648 TEST(heap, Wide) |
598 { | 649 { |
599 HeapTester::wideTest(); | 650 HeapTester::wideTest(); |
600 } | 651 } |
601 | 652 |
602 TEST(heap, Member) | 653 TEST(heap, Member) |
603 { | 654 { |
604 HeapTester::memberTest(); | 655 HeapTester::memberTest(); |
605 } | 656 } |
606 | 657 |
607 } // namespace WebCore | 658 } // namespace WebCore |
OLD | NEW |