Chromium Code Reviews| 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 540 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 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 Loading... | |
| 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 |
| OLD | NEW |