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 543 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
554 , m_weakBar(weakBar) | 554 , m_weakBar(weakBar) |
555 { | 555 { |
556 } | 556 } |
557 | 557 |
558 Member<Bar> m_strongBar; | 558 Member<Bar> m_strongBar; |
559 WeakMember<Bar> m_weakBar; | 559 WeakMember<Bar> m_weakBar; |
560 }; | 560 }; |
561 | 561 |
562 TEST(HeapTest, Threading) | 562 TEST(HeapTest, Threading) |
563 { | 563 { |
564 Heap::init(); | |
565 ThreadedHeapTester::test(); | 564 ThreadedHeapTester::test(); |
566 Heap::shutdown(); | |
567 } | |
568 | |
569 TEST(HeapTest, Init) | |
570 { | |
571 // FIXME: init and shutdown should be called via Blink | |
572 // initialization in the test runner. This test can be removed | |
573 // when that is done. | |
574 Heap::init(); | |
575 Heap::shutdown(); | |
576 } | 565 } |
577 | 566 |
578 TEST(HeapTest, SimpleAllocation) | 567 TEST(HeapTest, SimpleAllocation) |
579 { | 568 { |
580 // FIXME: init and shutdown should be called via Blink | |
581 // initialization in the test runner. | |
582 Heap::init(); | |
583 | |
584 // Get initial heap stats. | 569 // Get initial heap stats. |
585 HeapStats initialHeapStats; | 570 HeapStats initialHeapStats; |
586 getHeapStats(&initialHeapStats); | 571 getHeapStats(&initialHeapStats); |
587 EXPECT_EQ(0ul, initialHeapStats.totalObjectSpace()); | 572 EXPECT_EQ(0ul, initialHeapStats.totalObjectSpace()); |
588 | 573 |
589 // Allocate an object in the heap. | 574 // Allocate an object in the heap. |
590 HeapAllocatedArray* array = new HeapAllocatedArray(); | 575 HeapAllocatedArray* array = new HeapAllocatedArray(); |
591 HeapStats statsAfterAllocation; | 576 HeapStats statsAfterAllocation; |
592 getHeapStats(&statsAfterAllocation); | 577 getHeapStats(&statsAfterAllocation); |
593 EXPECT_TRUE(statsAfterAllocation.totalObjectSpace() >= sizeof(HeapAllocatedA
rray)); | 578 EXPECT_TRUE(statsAfterAllocation.totalObjectSpace() >= sizeof(HeapAllocatedA
rray)); |
594 | 579 |
595 // Sanity check of the contents in the heap. | 580 // Sanity check of the contents in the heap. |
596 EXPECT_EQ(0, array->at(0)); | 581 EXPECT_EQ(0, array->at(0)); |
597 EXPECT_EQ(42, array->at(42)); | 582 EXPECT_EQ(42, array->at(42)); |
598 EXPECT_EQ(0, array->at(128)); | 583 EXPECT_EQ(0, array->at(128)); |
599 EXPECT_EQ(999 % 128, array->at(999)); | 584 EXPECT_EQ(999 % 128, array->at(999)); |
600 | |
601 Heap::shutdown(); | |
602 } | 585 } |
603 | 586 |
604 TEST(HeapTest, SimplePersistent) | 587 TEST(HeapTest, SimplePersistent) |
605 { | 588 { |
606 // FIXME: init and shutdown should be called via Blink | 589 Persistent<TraceCounter> traceCounter = TraceCounter::create(); |
607 // initialization in the test runner. | 590 EXPECT_EQ(0, traceCounter->traceCount()); |
608 Heap::init(); | |
609 | 591 |
610 { | 592 Heap::collectGarbage(ThreadState::NoHeapPointersOnStack); |
611 Persistent<TraceCounter> traceCounter = TraceCounter::create(); | 593 EXPECT_EQ(1, traceCounter->traceCount()); |
612 EXPECT_EQ(0, traceCounter->traceCount()); | |
613 | 594 |
614 Heap::collectGarbage(ThreadState::NoHeapPointersOnStack); | 595 Persistent<ClassWithMember> classWithMember = ClassWithMember::create(); |
615 EXPECT_EQ(1, traceCounter->traceCount()); | 596 EXPECT_EQ(0, classWithMember->traceCount()); |
616 | 597 |
617 Persistent<ClassWithMember> classWithMember = ClassWithMember::create(); | 598 Heap::collectGarbage(ThreadState::NoHeapPointersOnStack); |
618 EXPECT_EQ(0, classWithMember->traceCount()); | 599 EXPECT_EQ(1, classWithMember->traceCount()); |
619 | 600 EXPECT_EQ(2, traceCounter->traceCount()); |
620 Heap::collectGarbage(ThreadState::NoHeapPointersOnStack); | |
621 EXPECT_EQ(1, classWithMember->traceCount()); | |
622 EXPECT_EQ(2, traceCounter->traceCount()); | |
623 } | |
624 | |
625 Heap::shutdown(); | |
626 } | 601 } |
627 | 602 |
628 TEST(HeapTest, SimpleFinalization) | 603 TEST(HeapTest, SimpleFinalization) |
629 { | 604 { |
630 // FIXME: init and shutdown should be called via Blink | |
631 // initialization in the test runner. | |
632 Heap::init(); | |
633 | |
634 { | 605 { |
635 Persistent<SimpleFinalizedObject> finalized = SimpleFinalizedObject::cre
ate(); | 606 Persistent<SimpleFinalizedObject> finalized = SimpleFinalizedObject::cre
ate(); |
636 EXPECT_EQ(0, SimpleFinalizedObject::s_destructorCalls); | 607 EXPECT_EQ(0, SimpleFinalizedObject::s_destructorCalls); |
637 Heap::collectGarbage(ThreadState::NoHeapPointersOnStack); | 608 Heap::collectGarbage(ThreadState::NoHeapPointersOnStack); |
638 EXPECT_EQ(0, SimpleFinalizedObject::s_destructorCalls); | 609 EXPECT_EQ(0, SimpleFinalizedObject::s_destructorCalls); |
639 } | 610 } |
640 | 611 |
641 Heap::collectGarbage(ThreadState::NoHeapPointersOnStack); | 612 Heap::collectGarbage(ThreadState::NoHeapPointersOnStack); |
642 EXPECT_EQ(1, SimpleFinalizedObject::s_destructorCalls); | 613 EXPECT_EQ(1, SimpleFinalizedObject::s_destructorCalls); |
643 | |
644 Heap::shutdown(); | |
645 } | 614 } |
646 | 615 |
647 TEST(HeapTest, TypedHeapSanity) | 616 TEST(HeapTest, TypedHeapSanity) |
648 { | 617 { |
649 // FIXME: init and shutdown should be called via Blink | 618 // We use TraceCounter for allocating an object on the general heap. |
650 // initialization in the test runner. | 619 Persistent<TraceCounter> generalHeapObject = TraceCounter::create(); |
651 Heap::init(); | 620 Persistent<TestTypedHeapClass> typedHeapObject = TestTypedHeapClass::create(
); |
652 | 621 EXPECT_NE(pageHeaderAddress(reinterpret_cast<Address>(generalHeapObject.raw(
))), |
653 { | 622 pageHeaderAddress(reinterpret_cast<Address>(typedHeapObject.raw()))); |
654 // We use TraceCounter for allocating an object on the general heap. | |
655 Persistent<TraceCounter> generalHeapObject = TraceCounter::create(); | |
656 Persistent<TestTypedHeapClass> typedHeapObject = TestTypedHeapClass::cre
ate(); | |
657 EXPECT_NE(pageHeaderAddress(reinterpret_cast<Address>(generalHeapObject.
raw())), | |
658 pageHeaderAddress(reinterpret_cast<Address>(typedHeapObject.raw())))
; | |
659 } | |
660 | |
661 Heap::shutdown(); | |
662 } | 623 } |
663 | 624 |
664 TEST(HeapTest, NoAllocation) | 625 TEST(HeapTest, NoAllocation) |
665 { | 626 { |
666 // FIXME: init and shutdown should be called via Blink | |
667 // initialization in the test runner. | |
668 Heap::init(); | |
669 | |
670 EXPECT_TRUE(ThreadState::current()->isAllocationAllowed()); | 627 EXPECT_TRUE(ThreadState::current()->isAllocationAllowed()); |
671 { | 628 { |
672 // Disallow allocation | 629 // Disallow allocation |
673 NoAllocationScope<AnyThread> noAllocationScope; | 630 NoAllocationScope<AnyThread> noAllocationScope; |
674 EXPECT_FALSE(ThreadState::current()->isAllocationAllowed()); | 631 EXPECT_FALSE(ThreadState::current()->isAllocationAllowed()); |
675 } | 632 } |
676 EXPECT_TRUE(ThreadState::current()->isAllocationAllowed()); | 633 EXPECT_TRUE(ThreadState::current()->isAllocationAllowed()); |
677 | |
678 Heap::shutdown(); | |
679 } | 634 } |
680 | 635 |
681 TEST(HeapTest, Members) | 636 TEST(HeapTest, Members) |
682 { | 637 { |
683 // FIXME: init and shutdown should be called via Blink | |
684 // initialization in the test runner. | |
685 Heap::init(); | |
686 | |
687 Bar::s_live = 0; | 638 Bar::s_live = 0; |
688 { | 639 { |
689 Persistent<Baz> h1; | 640 Persistent<Baz> h1; |
690 Persistent<Baz> h2; | 641 Persistent<Baz> h2; |
691 { | 642 { |
692 h1 = Baz::create(Bar::create()); | 643 h1 = Baz::create(Bar::create()); |
693 Heap::collectGarbage(ThreadState::NoHeapPointersOnStack); | 644 Heap::collectGarbage(ThreadState::NoHeapPointersOnStack); |
694 EXPECT_EQ(1u, Bar::s_live); | 645 EXPECT_EQ(1u, Bar::s_live); |
695 h2 = Baz::create(Bar::create()); | 646 h2 = Baz::create(Bar::create()); |
696 Heap::collectGarbage(ThreadState::NoHeapPointersOnStack); | 647 Heap::collectGarbage(ThreadState::NoHeapPointersOnStack); |
697 EXPECT_EQ(2u, Bar::s_live); | 648 EXPECT_EQ(2u, Bar::s_live); |
698 } | 649 } |
699 Heap::collectGarbage(ThreadState::NoHeapPointersOnStack); | 650 Heap::collectGarbage(ThreadState::NoHeapPointersOnStack); |
700 EXPECT_EQ(2u, Bar::s_live); | 651 EXPECT_EQ(2u, Bar::s_live); |
701 h1->clear(); | 652 h1->clear(); |
702 Heap::collectGarbage(ThreadState::NoHeapPointersOnStack); | 653 Heap::collectGarbage(ThreadState::NoHeapPointersOnStack); |
703 EXPECT_EQ(1u, Bar::s_live); | 654 EXPECT_EQ(1u, Bar::s_live); |
704 } | 655 } |
705 Heap::collectGarbage(ThreadState::NoHeapPointersOnStack); | 656 Heap::collectGarbage(ThreadState::NoHeapPointersOnStack); |
706 EXPECT_EQ(0u, Bar::s_live); | 657 EXPECT_EQ(0u, Bar::s_live); |
707 | |
708 Heap::shutdown(); | |
709 } | 658 } |
710 | 659 |
711 TEST(HeapTest, DeepTest) | 660 TEST(HeapTest, DeepTest) |
712 { | 661 { |
713 // FIXME: init and shutdown should be called via Blink | |
714 // initialization in the test runner. | |
715 Heap::init(); | |
716 | |
717 const unsigned depth = 100000; | 662 const unsigned depth = 100000; |
718 Bar::s_live = 0; | 663 Bar::s_live = 0; |
719 { | 664 { |
720 Bar* bar = Bar::create(); | 665 Bar* bar = Bar::create(); |
721 EXPECT_TRUE(ThreadState::current()->contains(bar)); | 666 EXPECT_TRUE(ThreadState::current()->contains(bar)); |
722 Foo* foo = Foo::create(bar); | 667 Foo* foo = Foo::create(bar); |
723 EXPECT_TRUE(ThreadState::current()->contains(foo)); | 668 EXPECT_TRUE(ThreadState::current()->contains(foo)); |
724 EXPECT_EQ(2u, Bar::s_live); | 669 EXPECT_EQ(2u, Bar::s_live); |
725 for (unsigned i = 0; i < depth; i++) { | 670 for (unsigned i = 0; i < depth; i++) { |
726 Foo* foo2 = Foo::create(foo); | 671 Foo* foo2 = Foo::create(foo); |
727 foo = foo2; | 672 foo = foo2; |
728 EXPECT_TRUE(ThreadState::current()->contains(foo)); | 673 EXPECT_TRUE(ThreadState::current()->contains(foo)); |
729 } | 674 } |
730 EXPECT_EQ(depth + 2, Bar::s_live); | 675 EXPECT_EQ(depth + 2, Bar::s_live); |
731 Heap::collectGarbage(ThreadState::HeapPointersOnStack); | 676 Heap::collectGarbage(ThreadState::HeapPointersOnStack); |
732 EXPECT_EQ(depth + 2, Bar::s_live); | 677 EXPECT_EQ(depth + 2, Bar::s_live); |
733 } | 678 } |
734 Heap::collectGarbage(ThreadState::NoHeapPointersOnStack); | 679 Heap::collectGarbage(ThreadState::NoHeapPointersOnStack); |
735 EXPECT_EQ(0u, Bar::s_live); | 680 EXPECT_EQ(0u, Bar::s_live); |
736 | |
737 Heap::shutdown(); | |
738 } | 681 } |
739 | 682 |
740 TEST(HeapTest, WideTest) | 683 TEST(HeapTest, WideTest) |
741 { | 684 { |
742 // FIXME: init and shutdown should be called via Blink | |
743 // initialization in the test runner. | |
744 Heap::init(); | |
745 | |
746 Bar::s_live = 0; | 685 Bar::s_live = 0; |
747 { | 686 { |
748 Bars* bars = Bars::create(); | 687 Bars* bars = Bars::create(); |
749 unsigned width = Bars::width; | 688 unsigned width = Bars::width; |
750 EXPECT_EQ(width + 1, Bar::s_live); | 689 EXPECT_EQ(width + 1, Bar::s_live); |
751 Heap::collectGarbage(ThreadState::HeapPointersOnStack); | 690 Heap::collectGarbage(ThreadState::HeapPointersOnStack); |
752 EXPECT_EQ(width + 1, Bar::s_live); | 691 EXPECT_EQ(width + 1, Bar::s_live); |
753 // Use bars here to make sure that it will be on the stack | 692 // Use bars here to make sure that it will be on the stack |
754 // for the conservative stack scan to find. | 693 // for the conservative stack scan to find. |
755 EXPECT_EQ(width, bars->getWidth()); | 694 EXPECT_EQ(width, bars->getWidth()); |
756 } | 695 } |
757 EXPECT_EQ(Bars::width + 1, Bar::s_live); | 696 EXPECT_EQ(Bars::width + 1, Bar::s_live); |
758 Heap::collectGarbage(ThreadState::NoHeapPointersOnStack); | 697 Heap::collectGarbage(ThreadState::NoHeapPointersOnStack); |
759 EXPECT_EQ(0u, Bar::s_live); | 698 EXPECT_EQ(0u, Bar::s_live); |
760 | |
761 Heap::shutdown(); | |
762 } | 699 } |
763 | 700 |
764 TEST(HeapTest, HashMapOfMembers) | 701 TEST(HeapTest, HashMapOfMembers) |
765 { | 702 { |
766 // FIXME: init and shutdown should be called via Blink | |
767 // initialization in the test runner. | |
768 Heap::init(); | |
769 | |
770 HeapStats initialHeapSize; | 703 HeapStats initialHeapSize; |
771 IntWrapper::s_destructorCalls = 0; | 704 IntWrapper::s_destructorCalls = 0; |
772 | 705 |
773 clearOutOldGarbage(&initialHeapSize); | 706 clearOutOldGarbage(&initialHeapSize); |
774 { | 707 { |
775 typedef HashMap< | 708 typedef HashMap< |
776 Member<IntWrapper>, | 709 Member<IntWrapper>, |
777 Member<IntWrapper>, | 710 Member<IntWrapper>, |
778 DefaultHash<Member<IntWrapper> >::Hash, | 711 DefaultHash<Member<IntWrapper> >::Hash, |
779 HashTraits<Member<IntWrapper> >, | 712 HashTraits<Member<IntWrapper> >, |
(...skipping 62 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
842 getHeapStats(&afterGC3); | 775 getHeapStats(&afterGC3); |
843 EXPECT_TRUE(afterGC3.totalObjectSpace() < afterAdding1000.totalObjectSpa
ce()); | 776 EXPECT_TRUE(afterGC3.totalObjectSpace() < afterAdding1000.totalObjectSpa
ce()); |
844 } | 777 } |
845 | 778 |
846 Heap::collectGarbage(ThreadState::NoHeapPointersOnStack); | 779 Heap::collectGarbage(ThreadState::NoHeapPointersOnStack); |
847 // The objects 'one', anotherOne, and the 999 other pairs. | 780 // The objects 'one', anotherOne, and the 999 other pairs. |
848 EXPECT_EQ(IntWrapper::s_destructorCalls, 2000); | 781 EXPECT_EQ(IntWrapper::s_destructorCalls, 2000); |
849 HeapStats afterGC4; | 782 HeapStats afterGC4; |
850 getHeapStats(&afterGC4); | 783 getHeapStats(&afterGC4); |
851 EXPECT_EQ(afterGC4.totalObjectSpace(), initialHeapSize.totalObjectSpace()); | 784 EXPECT_EQ(afterGC4.totalObjectSpace(), initialHeapSize.totalObjectSpace()); |
852 | |
853 Heap::shutdown(); | |
854 } | 785 } |
855 | 786 |
856 TEST(HeapTest, NestedAllocation) | 787 TEST(HeapTest, NestedAllocation) |
857 { | 788 { |
858 // FIXME: init and shutdown should be called via Blink | |
859 // initialization in the test runner. | |
860 Heap::init(); | |
861 | |
862 HeapStats initialHeapSize; | 789 HeapStats initialHeapSize; |
863 clearOutOldGarbage(&initialHeapSize); | 790 clearOutOldGarbage(&initialHeapSize); |
864 { | 791 { |
865 Persistent<ConstructorAllocation> constructorAllocation = ConstructorAll
ocation::create(); | 792 Persistent<ConstructorAllocation> constructorAllocation = ConstructorAll
ocation::create(); |
866 } | 793 } |
867 HeapStats afterFree; | 794 HeapStats afterFree; |
868 clearOutOldGarbage(&afterFree); | 795 clearOutOldGarbage(&afterFree); |
869 EXPECT_TRUE(initialHeapSize == afterFree); | 796 EXPECT_TRUE(initialHeapSize == afterFree); |
870 | |
871 Heap::shutdown(); | |
872 } | 797 } |
873 | 798 |
874 TEST(HeapTest, LargeObjects) | 799 TEST(HeapTest, LargeObjects) |
875 { | 800 { |
876 // FIXME: init and shutdown should be called via Blink | |
877 // initialization in the test runner. | |
878 Heap::init(); | |
879 | |
880 HeapStats initialHeapSize; | 801 HeapStats initialHeapSize; |
881 clearOutOldGarbage(&initialHeapSize); | 802 clearOutOldGarbage(&initialHeapSize); |
882 IntWrapper::s_destructorCalls = 0; | 803 IntWrapper::s_destructorCalls = 0; |
883 LargeObject::s_destructorCalls = 0; | 804 LargeObject::s_destructorCalls = 0; |
884 { | 805 { |
885 int slack = 8; // LargeObject points to an IntWrapper that is also alloc
ated. | 806 int slack = 8; // LargeObject points to an IntWrapper that is also alloc
ated. |
886 Persistent<LargeObject> object = LargeObject::create(); | 807 Persistent<LargeObject> object = LargeObject::create(); |
887 HeapStats afterAllocation; | 808 HeapStats afterAllocation; |
888 clearOutOldGarbage(&afterAllocation); | 809 clearOutOldGarbage(&afterAllocation); |
889 { | 810 { |
(...skipping 25 matching lines...) Expand all Loading... |
915 EXPECT_TRUE(oneLargeObject == afterAllocation); | 836 EXPECT_TRUE(oneLargeObject == afterAllocation); |
916 EXPECT_EQ(10, IntWrapper::s_destructorCalls); | 837 EXPECT_EQ(10, IntWrapper::s_destructorCalls); |
917 EXPECT_EQ(10, LargeObject::s_destructorCalls); | 838 EXPECT_EQ(10, LargeObject::s_destructorCalls); |
918 } | 839 } |
919 HeapStats backToInitial; | 840 HeapStats backToInitial; |
920 clearOutOldGarbage(&backToInitial); | 841 clearOutOldGarbage(&backToInitial); |
921 EXPECT_TRUE(initialHeapSize == backToInitial); | 842 EXPECT_TRUE(initialHeapSize == backToInitial); |
922 EXPECT_EQ(11, IntWrapper::s_destructorCalls); | 843 EXPECT_EQ(11, IntWrapper::s_destructorCalls); |
923 EXPECT_EQ(11, LargeObject::s_destructorCalls); | 844 EXPECT_EQ(11, LargeObject::s_destructorCalls); |
924 Heap::collectGarbage(ThreadState::NoHeapPointersOnStack); | 845 Heap::collectGarbage(ThreadState::NoHeapPointersOnStack); |
925 | |
926 Heap::shutdown(); | |
927 } | 846 } |
928 | 847 |
929 TEST(HeapTest, RefCountedGarbageCollected) | 848 TEST(HeapTest, RefCountedGarbageCollected) |
930 { | 849 { |
931 // FIXME: init and shutdown should be called via Blink | |
932 // initialization in the test runner. | |
933 Heap::init(); | |
934 | |
935 RefCountedAndGarbageCollected::s_destructorCalls = 0; | 850 RefCountedAndGarbageCollected::s_destructorCalls = 0; |
936 { | 851 { |
937 RefPtr<RefCountedAndGarbageCollected> refPtr3; | 852 RefPtr<RefCountedAndGarbageCollected> refPtr3; |
938 { | 853 { |
939 Persistent<RefCountedAndGarbageCollected> persistent; | 854 Persistent<RefCountedAndGarbageCollected> persistent; |
940 { | 855 { |
941 RefPtr<RefCountedAndGarbageCollected> refPtr1 = RefCountedAndGar
bageCollected::create(); | 856 RefPtr<RefCountedAndGarbageCollected> refPtr1 = RefCountedAndGar
bageCollected::create(); |
942 RefPtr<RefCountedAndGarbageCollected> refPtr2 = RefCountedAndGar
bageCollected::create(); | 857 RefPtr<RefCountedAndGarbageCollected> refPtr2 = RefCountedAndGar
bageCollected::create(); |
943 Heap::collectGarbage(ThreadState::NoHeapPointersOnStack); | 858 Heap::collectGarbage(ThreadState::NoHeapPointersOnStack); |
944 EXPECT_EQ(0, RefCountedAndGarbageCollected::s_destructorCalls); | 859 EXPECT_EQ(0, RefCountedAndGarbageCollected::s_destructorCalls); |
945 persistent = refPtr1.get(); | 860 persistent = refPtr1.get(); |
946 } | 861 } |
947 // Reference count is zero for both objects but one of | 862 // Reference count is zero for both objects but one of |
948 // them is kept alive by a persistent handle. | 863 // them is kept alive by a persistent handle. |
949 Heap::collectGarbage(ThreadState::NoHeapPointersOnStack); | 864 Heap::collectGarbage(ThreadState::NoHeapPointersOnStack); |
950 EXPECT_EQ(1, RefCountedAndGarbageCollected::s_destructorCalls); | 865 EXPECT_EQ(1, RefCountedAndGarbageCollected::s_destructorCalls); |
951 refPtr3 = persistent; | 866 refPtr3 = persistent; |
952 } | 867 } |
953 // The persistent handle is gone but the ref count has been | 868 // The persistent handle is gone but the ref count has been |
954 // increased to 1. | 869 // increased to 1. |
955 Heap::collectGarbage(ThreadState::NoHeapPointersOnStack); | 870 Heap::collectGarbage(ThreadState::NoHeapPointersOnStack); |
956 EXPECT_EQ(1, RefCountedAndGarbageCollected::s_destructorCalls); | 871 EXPECT_EQ(1, RefCountedAndGarbageCollected::s_destructorCalls); |
957 } | 872 } |
958 // Both persistent handle is gone and ref count is zero so the | 873 // Both persistent handle is gone and ref count is zero so the |
959 // object can be collected. | 874 // object can be collected. |
960 Heap::collectGarbage(ThreadState::NoHeapPointersOnStack); | 875 Heap::collectGarbage(ThreadState::NoHeapPointersOnStack); |
961 EXPECT_EQ(2, RefCountedAndGarbageCollected::s_destructorCalls); | 876 EXPECT_EQ(2, RefCountedAndGarbageCollected::s_destructorCalls); |
962 | |
963 Heap::shutdown(); | |
964 } | 877 } |
965 | 878 |
966 TEST(HeapTest, WeakMembers) | 879 TEST(HeapTest, WeakMembers) |
967 { | 880 { |
968 // FIXME: init and shutdown should be called via Blink | |
969 // initialization in the test runner. | |
970 Heap::init(); | |
971 | |
972 Bar::s_live = 0; | 881 Bar::s_live = 0; |
973 { | 882 { |
974 Persistent<Bar> h1 = Bar::create(); | 883 Persistent<Bar> h1 = Bar::create(); |
975 Persistent<Weak> h4; | 884 Persistent<Weak> h4; |
976 Persistent<WithWeakMember> h5; | 885 Persistent<WithWeakMember> h5; |
977 Heap::collectGarbage(ThreadState::NoHeapPointersOnStack); | 886 Heap::collectGarbage(ThreadState::NoHeapPointersOnStack); |
978 ASSERT_EQ(1u, Bar::s_live); // h1 is live. | 887 ASSERT_EQ(1u, Bar::s_live); // h1 is live. |
979 { | 888 { |
980 Bar* h2 = Bar::create(); | 889 Bar* h2 = Bar::create(); |
981 Bar* h3 = Bar::create(); | 890 Bar* h3 = Bar::create(); |
(...skipping 15 matching lines...) Expand all Loading... |
997 EXPECT_FALSE(h5->weakIsThere()); // h3 is gone from weak pointer. | 906 EXPECT_FALSE(h5->weakIsThere()); // h3 is gone from weak pointer. |
998 h1.clear(); // Zero out h1. | 907 h1.clear(); // Zero out h1. |
999 Heap::collectGarbage(ThreadState::NoHeapPointersOnStack); | 908 Heap::collectGarbage(ThreadState::NoHeapPointersOnStack); |
1000 EXPECT_EQ(3u, Bar::s_live); // Only h4, h5 and h2 are left. | 909 EXPECT_EQ(3u, Bar::s_live); // Only h4, h5 and h2 are left. |
1001 EXPECT_TRUE(h4->strongIsThere()); // h2 is still pointed to from h4. | 910 EXPECT_TRUE(h4->strongIsThere()); // h2 is still pointed to from h4. |
1002 EXPECT_TRUE(h5->strongIsThere()); // h2 is still pointed to from h5. | 911 EXPECT_TRUE(h5->strongIsThere()); // h2 is still pointed to from h5. |
1003 } | 912 } |
1004 // h4 and h5 have gone out of scope now and they were keeping h2 alive. | 913 // h4 and h5 have gone out of scope now and they were keeping h2 alive. |
1005 Heap::collectGarbage(ThreadState::NoHeapPointersOnStack); | 914 Heap::collectGarbage(ThreadState::NoHeapPointersOnStack); |
1006 EXPECT_EQ(0u, Bar::s_live); // All gone. | 915 EXPECT_EQ(0u, Bar::s_live); // All gone. |
1007 | |
1008 Heap::shutdown(); | |
1009 } | 916 } |
1010 | 917 |
1011 DEFINE_GC_INFO(Bar); | 918 DEFINE_GC_INFO(Bar); |
1012 DEFINE_GC_INFO(Baz); | 919 DEFINE_GC_INFO(Baz); |
1013 DEFINE_GC_INFO(ClassWithMember); | 920 DEFINE_GC_INFO(ClassWithMember); |
1014 DEFINE_GC_INFO(ConstructorAllocation); | 921 DEFINE_GC_INFO(ConstructorAllocation); |
1015 DEFINE_GC_INFO(HeapAllocatedArray); | 922 DEFINE_GC_INFO(HeapAllocatedArray); |
1016 DEFINE_GC_INFO(IntWrapper); | 923 DEFINE_GC_INFO(IntWrapper); |
1017 DEFINE_GC_INFO(LargeObject); | 924 DEFINE_GC_INFO(LargeObject); |
1018 DEFINE_GC_INFO(RefCountedAndGarbageCollected); | 925 DEFINE_GC_INFO(RefCountedAndGarbageCollected); |
1019 DEFINE_GC_INFO(SimpleFinalizedObject); | 926 DEFINE_GC_INFO(SimpleFinalizedObject); |
1020 DEFINE_GC_INFO(TestTypedHeapClass); | 927 DEFINE_GC_INFO(TestTypedHeapClass); |
1021 DEFINE_GC_INFO(TraceCounter); | 928 DEFINE_GC_INFO(TraceCounter); |
1022 | 929 |
1023 } // namespace | 930 } // namespace |
OLD | NEW |