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

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: Reupload with similarity=90 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
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 540 matching lines...) Expand 10 before | Expand all | Expand 10 after
551 : Bar() 551 : Bar()
552 , m_strongBar(strongBar) 552 , m_strongBar(strongBar)
553 , m_weakBar(weakBar) 553 , m_weakBar(weakBar)
554 { 554 {
555 } 555 }
556 556
557 Member<Bar> m_strongBar; 557 Member<Bar> m_strongBar;
558 WeakMember<Bar> m_weakBar; 558 WeakMember<Bar> m_weakBar;
559 }; 559 };
560 560
561
562 class SuperClass;
563
564 class PointsBack : public RefCountedWillBeGarbageCollectedFinalized<PointsBack> {
565 DECLARE_GC_INFO;
566 public:
567 static PassRefPtrWillBePtr<PointsBack> create()
568 {
569 return adoptRefWillBeNoop(new PointsBack());
570 }
571
572 ~PointsBack()
573 {
574 --s_aliveCount;
575 }
576
577 void setBackPointer(SuperClass* backPointer)
578 {
579 m_backPointer = backPointer;
580 }
581
582 SuperClass* backPointer() const { return m_backPointer; }
583
584 void trace(Visitor* visitor)
585 {
586 #if ENABLE_OILPAN
Vyacheslav Egorov (Chromium) 2014/01/15 14:21:10 should it be ENABLE(OILPAN) (and likewise in other
587 visitor->trace(m_backPointer);
588 #endif
589 }
590
591 static int s_aliveCount;
592 private:
593 PointsBack() : m_backPointer(nullptr)
594 {
595 ++s_aliveCount;
596 }
597
598 PtrWillBeWeakMember<SuperClass> m_backPointer;
599 };
600
601 int PointsBack::s_aliveCount = 0;
602
603 class SuperClass : public RefCountedWillBeGarbageCollectedFinalized<SuperClass> {
604 DECLARE_GC_INFO;
605 public:
606 static PassRefPtrWillBePtr<SuperClass> create(PassRefPtrWillBePtr<PointsBack > pointsBack)
607 {
608 return adoptRefWillBeNoop(new SuperClass(pointsBack));
609 }
610
611 virtual ~SuperClass()
612 {
613 #if !ENABLE_OILPAN
614 m_pointsBack->setBackPointer(0);
615 #endif
616 --s_aliveCount;
617 }
618
619 void doStuff(PassRefPtrWillBePtr<SuperClass> targetPass, PointsBack* pointsB ack, int superClassCount)
620 {
621 RefPtrWillBePtr<SuperClass> target = targetPass;
622 Heap::collectGarbage(ThreadState::HeapPointersOnStack);
623 EXPECT_EQ(pointsBack, target->pointsBack());
624 EXPECT_EQ(superClassCount, SuperClass::s_aliveCount);
625 }
626
627 virtual void trace(Visitor* visitor)
628 {
629 #if ENABLE_OILPAN
630 visitor->trace(m_pointsBack);
631 #endif
632 }
633
634 PointsBack* pointsBack() const { return m_pointsBack.get(); }
635
636 static int s_aliveCount;
637 protected:
638 explicit SuperClass(PassRefPtrWillBePtr<PointsBack> pointsBack)
639 : m_pointsBack(pointsBack)
640 {
641 m_pointsBack->setBackPointer(this);
642 ++s_aliveCount;
643 }
644
645 private:
646 RefPtrWillBeMember<PointsBack> m_pointsBack;
647 };
648
649 int SuperClass::s_aliveCount = 0;
650 class SubData : public NoBaseWillBeGarbageCollectedFinalized<SubData> {
651 DECLARE_GC_INFO
652 public:
653 SubData() { ++s_aliveCount; }
654 ~SubData() { --s_aliveCount; }
655
656 void trace(Visitor*) { }
657
658 static int s_aliveCount;
659 };
660
661 int SubData::s_aliveCount = 0;
662
663 class SubClass : public SuperClass {
664 public:
665 static PassRefPtrWillBePtr<SubClass> create(PassRefPtrWillBePtr<PointsBack> pointsBack)
666 {
667 return adoptRefWillBeNoop(new SubClass(pointsBack));
668 }
669
670 virtual ~SubClass()
671 {
672 --s_aliveCount;
673 }
674
675 virtual void trace(Visitor* visitor)
676 {
677 #if ENABLE_OILPAN
678 SuperClass::trace(visitor);
679 visitor->trace(m_data);
680 #endif
681 }
682
683 static int s_aliveCount;
684 private:
685 explicit SubClass(PassRefPtrWillBePtr<PointsBack> pointsBack)
686 : SuperClass(pointsBack)
687 , m_data(adoptPtrWillBeNoop(new SubData()))
688 {
689 ++s_aliveCount;
690 }
691
692 private:
693 OwnPtrWillBeMember<SubData> m_data;
694 };
695
696 int SubClass::s_aliveCount = 0;
697
698 TEST(HeapTest, Transition)
699 {
700 Heap::init();
701
702 {
703 RefPtrWillBePersistent<PointsBack> pointsBack1 = PointsBack::create();
704 RefPtrWillBePersistent<PointsBack> pointsBack2 = PointsBack::create();
705 RefPtrWillBePersistent<SuperClass> superClass = SuperClass::create(point sBack1);
706 RefPtrWillBePersistent<SubClass> subClass = SubClass::create(pointsBack2 );
707 EXPECT_EQ(2, PointsBack::s_aliveCount);
708 EXPECT_EQ(2, SuperClass::s_aliveCount);
709 EXPECT_EQ(1, SubClass::s_aliveCount);
710 EXPECT_EQ(1, SubData::s_aliveCount);
711
712 Heap::collectGarbage(ThreadState::NoHeapPointersOnStack);
713 EXPECT_EQ(2, PointsBack::s_aliveCount);
714 EXPECT_EQ(2, SuperClass::s_aliveCount);
715 EXPECT_EQ(1, SubClass::s_aliveCount);
716 EXPECT_EQ(1, SubData::s_aliveCount);
717
718 superClass->doStuff(superClass.release(), pointsBack1.get(), 2);
719 Heap::collectGarbage(ThreadState::NoHeapPointersOnStack);
720 EXPECT_EQ(2, PointsBack::s_aliveCount);
721 EXPECT_EQ(1, SuperClass::s_aliveCount);
722 EXPECT_EQ(1, SubClass::s_aliveCount);
723 EXPECT_EQ(1, SubData::s_aliveCount);
724 EXPECT_EQ(0, pointsBack1->backPointer());
725
726 pointsBack1.release();
727 Heap::collectGarbage(ThreadState::NoHeapPointersOnStack);
728 EXPECT_EQ(1, PointsBack::s_aliveCount);
729 EXPECT_EQ(1, SuperClass::s_aliveCount);
730 EXPECT_EQ(1, SubClass::s_aliveCount);
731 EXPECT_EQ(1, SubData::s_aliveCount);
732
733 subClass->doStuff(subClass.release(), pointsBack2.get(), 1);
734 Heap::collectGarbage(ThreadState::NoHeapPointersOnStack);
735 EXPECT_EQ(1, PointsBack::s_aliveCount);
736 EXPECT_EQ(0, SuperClass::s_aliveCount);
737 EXPECT_EQ(0, SubClass::s_aliveCount);
738 EXPECT_EQ(0, SubData::s_aliveCount);
739 EXPECT_EQ(0, pointsBack2->backPointer());
740
741 pointsBack2.release();
742 Heap::collectGarbage(ThreadState::NoHeapPointersOnStack);
743 EXPECT_EQ(0, PointsBack::s_aliveCount);
744 EXPECT_EQ(0, SuperClass::s_aliveCount);
745 EXPECT_EQ(0, SubClass::s_aliveCount);
746 EXPECT_EQ(0, SubData::s_aliveCount);
747
748 EXPECT_TRUE(superClass == subClass);
749 }
750
751 Heap::shutdown();
752 }
753
561 TEST(HeapTest, Threading) 754 TEST(HeapTest, Threading)
562 { 755 {
563 Heap::init(); 756 Heap::init();
564 ThreadedHeapTester::test(); 757 ThreadedHeapTester::test();
565 Heap::shutdown(); 758 Heap::shutdown();
566 } 759 }
567 760
568 TEST(HeapTest, Init) 761 TEST(HeapTest, Init)
569 { 762 {
570 // FIXME: init and shutdown should be called via Blink 763 // FIXME: init and shutdown should be called via Blink
(...skipping 451 matching lines...) Expand 10 before | Expand all | Expand 10 after
1022 Heap::shutdown(); 1215 Heap::shutdown();
1023 } 1216 }
1024 1217
1025 DEFINE_GC_INFO(Bar); 1218 DEFINE_GC_INFO(Bar);
1026 DEFINE_GC_INFO(Baz); 1219 DEFINE_GC_INFO(Baz);
1027 DEFINE_GC_INFO(ClassWithMember); 1220 DEFINE_GC_INFO(ClassWithMember);
1028 DEFINE_GC_INFO(ConstructorAllocation); 1221 DEFINE_GC_INFO(ConstructorAllocation);
1029 DEFINE_GC_INFO(HeapAllocatedArray); 1222 DEFINE_GC_INFO(HeapAllocatedArray);
1030 DEFINE_GC_INFO(IntWrapper); 1223 DEFINE_GC_INFO(IntWrapper);
1031 DEFINE_GC_INFO(LargeObject); 1224 DEFINE_GC_INFO(LargeObject);
1225 DEFINE_GC_INFO(PointsBack);
1032 DEFINE_GC_INFO(RefCountedAndGarbageCollected); 1226 DEFINE_GC_INFO(RefCountedAndGarbageCollected);
1033 DEFINE_GC_INFO(SimpleFinalizedObject); 1227 DEFINE_GC_INFO(SimpleFinalizedObject);
1228 DEFINE_GC_INFO(SuperClass);
1229 DEFINE_GC_INFO(SubData);
1034 DEFINE_GC_INFO(TestTypedHeapClass); 1230 DEFINE_GC_INFO(TestTypedHeapClass);
1035 DEFINE_GC_INFO(TraceCounter); 1231 DEFINE_GC_INFO(TraceCounter);
1036 1232
1037 } // namespace 1233 } // namespace
OLDNEW
« Source/heap/Handle.h ('K') | « Source/heap/Handle.h ('k') | Source/wtf/Ptr.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698