Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(872)

Side by Side Diff: Source/heap/HeapTest.cpp

Issue 137483003: Add template aliases to support both reference counting and garbage collection for a transition per… (Closed) Base URL: svn://svn.chromium.org/blink/trunk
Patch Set: Address comment. Created 6 years, 11 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « Source/heap/Handle.h ('k') | Source/wtf/Ptr.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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 741 matching lines...) Expand 10 before | Expand all | Expand 10 after
752 : Bar() 752 : Bar()
753 , m_strongBar(strongBar) 753 , m_strongBar(strongBar)
754 , m_weakBar(weakBar) 754 , m_weakBar(weakBar)
755 { 755 {
756 } 756 }
757 757
758 Member<Bar> m_strongBar; 758 Member<Bar> m_strongBar;
759 WeakMember<Bar> m_weakBar; 759 WeakMember<Bar> m_weakBar;
760 }; 760 };
761 761
762
763 class SuperClass;
764
765 class PointsBack : public RefCountedWillBeGarbageCollectedFinalized<PointsBack> {
766 DECLARE_GC_INFO;
767 public:
768 static PassRefPtrWillBePtr<PointsBack> create()
769 {
770 return adoptRefWillBeNoop(new PointsBack());
771 }
772
773 ~PointsBack()
774 {
775 --s_aliveCount;
776 }
777
778 void setBackPointer(SuperClass* backPointer)
779 {
780 m_backPointer = backPointer;
781 }
782
783 SuperClass* backPointer() const { return m_backPointer; }
784
785 void trace(Visitor* visitor)
786 {
787 #if ENABLE_OILPAN
788 visitor->trace(m_backPointer);
789 #endif
790 }
791
792 static int s_aliveCount;
793 private:
794 PointsBack() : m_backPointer(nullptr)
795 {
796 ++s_aliveCount;
797 }
798
799 PtrWillBeWeakMember<SuperClass> m_backPointer;
800 };
801
802 int PointsBack::s_aliveCount = 0;
803
804 class SuperClass : public RefCountedWillBeGarbageCollectedFinalized<SuperClass> {
805 DECLARE_GC_INFO;
806 public:
807 static PassRefPtrWillBePtr<SuperClass> create(PassRefPtrWillBePtr<PointsBack > pointsBack)
808 {
809 return adoptRefWillBeNoop(new SuperClass(pointsBack));
810 }
811
812 virtual ~SuperClass()
813 {
814 #if !ENABLE_OILPAN
815 m_pointsBack->setBackPointer(0);
816 #endif
817 --s_aliveCount;
818 }
819
820 void doStuff(PassRefPtrWillBePtr<SuperClass> targetPass, PointsBack* pointsB ack, int superClassCount)
821 {
822 RefPtrWillBePtr<SuperClass> target = targetPass;
823 Heap::collectGarbage(ThreadState::HeapPointersOnStack);
824 EXPECT_EQ(pointsBack, target->pointsBack());
825 EXPECT_EQ(superClassCount, SuperClass::s_aliveCount);
826 }
827
828 virtual void trace(Visitor* visitor)
829 {
830 #if ENABLE_OILPAN
831 visitor->trace(m_pointsBack);
832 #endif
833 }
834
835 PointsBack* pointsBack() const { return m_pointsBack.get(); }
836
837 static int s_aliveCount;
838 protected:
839 explicit SuperClass(PassRefPtrWillBePtr<PointsBack> pointsBack)
840 : m_pointsBack(pointsBack)
841 {
842 m_pointsBack->setBackPointer(this);
843 ++s_aliveCount;
844 }
845
846 private:
847 RefPtrWillBeMember<PointsBack> m_pointsBack;
848 };
849
850 int SuperClass::s_aliveCount = 0;
851 class SubData : public NoBaseWillBeGarbageCollectedFinalized<SubData> {
852 DECLARE_GC_INFO
853 public:
854 SubData() { ++s_aliveCount; }
855 ~SubData() { --s_aliveCount; }
856
857 void trace(Visitor*) { }
858
859 static int s_aliveCount;
860 };
861
862 int SubData::s_aliveCount = 0;
863
864 class SubClass : public SuperClass {
865 public:
866 static PassRefPtrWillBePtr<SubClass> create(PassRefPtrWillBePtr<PointsBack> pointsBack)
867 {
868 return adoptRefWillBeNoop(new SubClass(pointsBack));
869 }
870
871 virtual ~SubClass()
872 {
873 --s_aliveCount;
874 }
875
876 virtual void trace(Visitor* visitor)
877 {
878 #if ENABLE_OILPAN
879 SuperClass::trace(visitor);
880 visitor->trace(m_data);
881 #endif
882 }
883
884 static int s_aliveCount;
885 private:
886 explicit SubClass(PassRefPtrWillBePtr<PointsBack> pointsBack)
887 : SuperClass(pointsBack)
888 , m_data(adoptPtrWillBeNoop(new SubData()))
889 {
890 ++s_aliveCount;
891 }
892
893 private:
894 OwnPtrWillBeMember<SubData> m_data;
895 };
896
897 int SubClass::s_aliveCount = 0;
898
899 TEST(HeapTest, Transition)
900 {
901 RefPtrWillBePersistent<PointsBack> pointsBack1 = PointsBack::create();
902 RefPtrWillBePersistent<PointsBack> pointsBack2 = PointsBack::create();
903 RefPtrWillBePersistent<SuperClass> superClass = SuperClass::create(pointsBac k1);
904 RefPtrWillBePersistent<SubClass> subClass = SubClass::create(pointsBack2);
905 EXPECT_EQ(2, PointsBack::s_aliveCount);
906 EXPECT_EQ(2, SuperClass::s_aliveCount);
907 EXPECT_EQ(1, SubClass::s_aliveCount);
908 EXPECT_EQ(1, SubData::s_aliveCount);
909
910 Heap::collectGarbage(ThreadState::NoHeapPointersOnStack);
911 EXPECT_EQ(2, PointsBack::s_aliveCount);
912 EXPECT_EQ(2, SuperClass::s_aliveCount);
913 EXPECT_EQ(1, SubClass::s_aliveCount);
914 EXPECT_EQ(1, SubData::s_aliveCount);
915
916 superClass->doStuff(superClass.release(), pointsBack1.get(), 2);
917 Heap::collectGarbage(ThreadState::NoHeapPointersOnStack);
918 EXPECT_EQ(2, PointsBack::s_aliveCount);
919 EXPECT_EQ(1, SuperClass::s_aliveCount);
920 EXPECT_EQ(1, SubClass::s_aliveCount);
921 EXPECT_EQ(1, SubData::s_aliveCount);
922 EXPECT_EQ(0, pointsBack1->backPointer());
923
924 pointsBack1.release();
925 Heap::collectGarbage(ThreadState::NoHeapPointersOnStack);
926 EXPECT_EQ(1, PointsBack::s_aliveCount);
927 EXPECT_EQ(1, SuperClass::s_aliveCount);
928 EXPECT_EQ(1, SubClass::s_aliveCount);
929 EXPECT_EQ(1, SubData::s_aliveCount);
930
931 subClass->doStuff(subClass.release(), pointsBack2.get(), 1);
932 Heap::collectGarbage(ThreadState::NoHeapPointersOnStack);
933 EXPECT_EQ(1, PointsBack::s_aliveCount);
934 EXPECT_EQ(0, SuperClass::s_aliveCount);
935 EXPECT_EQ(0, SubClass::s_aliveCount);
936 EXPECT_EQ(0, SubData::s_aliveCount);
937 EXPECT_EQ(0, pointsBack2->backPointer());
938
939 pointsBack2.release();
940 Heap::collectGarbage(ThreadState::NoHeapPointersOnStack);
941 EXPECT_EQ(0, PointsBack::s_aliveCount);
942 EXPECT_EQ(0, SuperClass::s_aliveCount);
943 EXPECT_EQ(0, SubClass::s_aliveCount);
944 EXPECT_EQ(0, SubData::s_aliveCount);
945
946 EXPECT_TRUE(superClass == subClass);
947 }
948
762 TEST(HeapTest, Threading) 949 TEST(HeapTest, Threading)
763 { 950 {
764 ThreadedHeapTester::test(); 951 ThreadedHeapTester::test();
765 } 952 }
766 953
767 TEST(HeapTest, BasicFunctionality) 954 TEST(HeapTest, BasicFunctionality)
768 { 955 {
769 HeapStats heapStats; 956 HeapStats heapStats;
770 clearOutOldGarbage(&heapStats); 957 clearOutOldGarbage(&heapStats);
771 { 958 {
(...skipping 648 matching lines...) Expand 10 before | Expand all | Expand 10 after
1420 } 1607 }
1421 1608
1422 DEFINE_GC_INFO(Bar); 1609 DEFINE_GC_INFO(Bar);
1423 DEFINE_GC_INFO(Baz); 1610 DEFINE_GC_INFO(Baz);
1424 DEFINE_GC_INFO(ClassWithMember); 1611 DEFINE_GC_INFO(ClassWithMember);
1425 DEFINE_GC_INFO(ConstructorAllocation); 1612 DEFINE_GC_INFO(ConstructorAllocation);
1426 DEFINE_GC_INFO(HeapAllocatedArray); 1613 DEFINE_GC_INFO(HeapAllocatedArray);
1427 DEFINE_GC_INFO(HeapTestSuperClass); 1614 DEFINE_GC_INFO(HeapTestSuperClass);
1428 DEFINE_GC_INFO(IntWrapper); 1615 DEFINE_GC_INFO(IntWrapper);
1429 DEFINE_GC_INFO(LargeObject); 1616 DEFINE_GC_INFO(LargeObject);
1617 DEFINE_GC_INFO(PointsBack);
1430 DEFINE_GC_INFO(RefCountedAndGarbageCollected); 1618 DEFINE_GC_INFO(RefCountedAndGarbageCollected);
1431 DEFINE_GC_INFO(RefCountedAndGarbageCollected2); 1619 DEFINE_GC_INFO(RefCountedAndGarbageCollected2);
1432 DEFINE_GC_INFO(SimpleFinalizedObject); 1620 DEFINE_GC_INFO(SimpleFinalizedObject);
1433 DEFINE_GC_INFO(SimpleObject); 1621 DEFINE_GC_INFO(SimpleObject);
1622 DEFINE_GC_INFO(SuperClass);
1623 DEFINE_GC_INFO(SubData);
1434 DEFINE_GC_INFO(TestTypedHeapClass); 1624 DEFINE_GC_INFO(TestTypedHeapClass);
1435 DEFINE_GC_INFO(TraceCounter); 1625 DEFINE_GC_INFO(TraceCounter);
1436 1626
1437 } // namespace 1627 } // namespace
OLDNEW
« no previous file with comments | « Source/heap/Handle.h ('k') | Source/wtf/Ptr.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698