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

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

Issue 131803005: Add more oilpan collections support (Closed) Base URL: svn://svn.chromium.org/blink/trunk
Patch Set: Fix OtherType for Windows compielr 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 1055 matching lines...) Expand 10 before | Expand all | Expand 10 after
1066 total += big / 2; 1066 total += big / 2;
1067 if (bigAreaRaw == alloc->get()) 1067 if (bigAreaRaw == alloc->get())
1068 break; 1068 break;
1069 } 1069 }
1070 1070
1071 getHeapStats(&heapStats); 1071 getHeapStats(&heapStats);
1072 CheckWithSlack(baseLevel + total, heapStats.totalObjectSpace(), slack); 1072 CheckWithSlack(baseLevel + total, heapStats.totalObjectSpace(), slack);
1073 if (testPagesAllocated) 1073 if (testPagesAllocated)
1074 EXPECT_EQ(0ul, heapStats.totalAllocatedSpace() & (blinkPageSize - 1)); 1074 EXPECT_EQ(0ul, heapStats.totalAllocatedSpace() & (blinkPageSize - 1));
1075 1075
1076 for (size_t i = 0; i < persistentCount; i++) 1076 for (size_t i = 0; i < persistentCount; i++) {
1077 persistents[i]->release(); 1077 delete persistents[i];
1078 persistents[i] = 0;
1079 }
1078 1080
1079 uint8_t* address = Heap::reallocate<uint8_t>(0, 100); 1081 uint8_t* address = Heap::reallocate<uint8_t>(0, 100);
1080 for (int i = 0; i < 100; i++) 1082 for (int i = 0; i < 100; i++)
1081 address[i] = i; 1083 address[i] = i;
1082 address = Heap::reallocate<uint8_t>(address, 100000); 1084 address = Heap::reallocate<uint8_t>(address, 100000);
1083 for (int i = 0; i < 100; i++) 1085 for (int i = 0; i < 100; i++)
1084 EXPECT_EQ(address[i], i); 1086 EXPECT_EQ(address[i], i);
1085 address = Heap::reallocate<uint8_t>(address, 50); 1087 address = Heap::reallocate<uint8_t>(address, 50);
1086 for (int i = 0; i < 50; i++) 1088 for (int i = 0; i < 50; i++)
1087 EXPECT_EQ(address[i], i); 1089 EXPECT_EQ(address[i], i);
(...skipping 320 matching lines...) Expand 10 before | Expand all | Expand 10 after
1408 EXPECT_EQ(10, LargeObject::s_destructorCalls); 1410 EXPECT_EQ(10, LargeObject::s_destructorCalls);
1409 } 1411 }
1410 HeapStats backToInitial; 1412 HeapStats backToInitial;
1411 clearOutOldGarbage(&backToInitial); 1413 clearOutOldGarbage(&backToInitial);
1412 EXPECT_TRUE(initialHeapSize == backToInitial); 1414 EXPECT_TRUE(initialHeapSize == backToInitial);
1413 EXPECT_EQ(11, IntWrapper::s_destructorCalls); 1415 EXPECT_EQ(11, IntWrapper::s_destructorCalls);
1414 EXPECT_EQ(11, LargeObject::s_destructorCalls); 1416 EXPECT_EQ(11, LargeObject::s_destructorCalls);
1415 Heap::collectGarbage(ThreadState::NoHeapPointersOnStack); 1417 Heap::collectGarbage(ThreadState::NoHeapPointersOnStack);
1416 } 1418 }
1417 1419
1420 class Container : public GarbageCollected<Container> {
1421 DECLARE_GC_INFO
1422 public:
1423 static Container* create() { return new Container(); }
1424 HeapHashMap<Member<IntWrapper>, Member<IntWrapper> > map;
1425 HeapHashSet<Member<IntWrapper> > set;
1426 HeapHashSet<Member<IntWrapper> > set2;
1427 HeapVector<Member<IntWrapper>, 2> vector;
1428 void trace(Visitor* visitor)
1429 {
1430 visitor->trace(map);
1431 visitor->trace(set);
1432 visitor->trace(set2);
1433 visitor->trace(vector);
1434 }
1435 };
1436
1437 TEST(HeapTest, HeapVectorWithInlineCapacity)
1438 {
1439 IntWrapper* one = IntWrapper::create(1);
1440 IntWrapper* two = IntWrapper::create(2);
1441 IntWrapper* three = IntWrapper::create(3);
1442 IntWrapper* four = IntWrapper::create(4);
1443 IntWrapper* five = IntWrapper::create(5);
1444 IntWrapper* six = IntWrapper::create(6);
1445 {
1446 HeapVector<Member<IntWrapper>, 2> vector;
1447 vector.append(one);
1448 vector.append(two);
1449 Heap::collectGarbage(ThreadState::HeapPointersOnStack);
1450 EXPECT_TRUE(vector.contains(one));
1451 EXPECT_TRUE(vector.contains(two));
1452
1453 vector.append(three);
1454 vector.append(four);
1455 Heap::collectGarbage(ThreadState::HeapPointersOnStack);
1456 EXPECT_TRUE(vector.contains(one));
1457 EXPECT_TRUE(vector.contains(two));
1458 EXPECT_TRUE(vector.contains(three));
1459 EXPECT_TRUE(vector.contains(four));
1460
1461 vector.shrink(1);
1462 Heap::collectGarbage(ThreadState::HeapPointersOnStack);
1463 EXPECT_TRUE(vector.contains(one));
1464 EXPECT_FALSE(vector.contains(two));
1465 EXPECT_FALSE(vector.contains(three));
1466 EXPECT_FALSE(vector.contains(four));
1467 }
1468 {
1469 HeapVector<Member<IntWrapper>, 2> vector1;
1470 HeapVector<Member<IntWrapper>, 2> vector2;
1471
1472 vector1.append(one);
1473 vector2.append(two);
1474 vector1.swap(vector2);
1475 Heap::collectGarbage(ThreadState::HeapPointersOnStack);
1476 EXPECT_TRUE(vector1.contains(two));
1477 EXPECT_TRUE(vector2.contains(one));
1478 }
1479 {
1480 HeapVector<Member<IntWrapper>, 2> vector1;
1481 HeapVector<Member<IntWrapper>, 2> vector2;
1482
1483 vector1.append(one);
1484 vector1.append(two);
1485 vector2.append(three);
1486 vector2.append(four);
1487 vector2.append(five);
1488 vector2.append(six);
1489 vector1.swap(vector2);
1490 Heap::collectGarbage(ThreadState::HeapPointersOnStack);
1491 EXPECT_TRUE(vector1.contains(three));
1492 EXPECT_TRUE(vector1.contains(four));
1493 EXPECT_TRUE(vector1.contains(five));
1494 EXPECT_TRUE(vector1.contains(six));
1495 EXPECT_TRUE(vector2.contains(one));
1496 EXPECT_TRUE(vector2.contains(two));
1497 }
1498 }
1499
1500 TEST(HeapTest, HeapCollectionTypes)
1501 {
1502 HeapStats initialHeapSize;
1503 IntWrapper::s_destructorCalls = 0;
1504
1505 typedef HeapHashMap<Member<IntWrapper>, Member<IntWrapper> > MemberMember;
1506 typedef HeapHashMap<Member<IntWrapper>, int> MemberPrimitive;
1507 typedef HeapHashMap<int, Member<IntWrapper> > PrimitiveMember;
1508
1509 typedef HeapHashSet<Member<IntWrapper> > MemberSet;
1510 typedef HeapHashSet<WeakMember<IntWrapper> > WeakMemberSet;
1511
1512 typedef HeapVector<Member<IntWrapper>, 2> MemberVector;
1513
1514 Persistent<MemberMember> memberMember = new MemberMember();
1515 Persistent<MemberMember> memberMember2 = new MemberMember();
1516 Persistent<MemberMember> memberMember3 = new MemberMember();
1517 Persistent<MemberPrimitive> memberPrimitive = new MemberPrimitive();
1518 Persistent<PrimitiveMember> primitiveMember = new PrimitiveMember();
1519 Persistent<MemberSet> set = new MemberSet();
1520 Persistent<MemberSet> set2 = new MemberSet();
1521 Persistent<MemberVector> vector = new MemberVector();
1522 Persistent<MemberVector> vector2 = new MemberVector();
1523 Persistent<Container> container = Container::create();
1524
1525 clearOutOldGarbage(&initialHeapSize);
1526 {
1527 Persistent<IntWrapper> one(IntWrapper::create(1));
1528 Persistent<IntWrapper> two(IntWrapper::create(2));
1529 Persistent<IntWrapper> oneB(IntWrapper::create(1));
1530 Persistent<IntWrapper> twoB(IntWrapper::create(2));
1531 Persistent<IntWrapper> oneC(IntWrapper::create(1));
1532 Persistent<IntWrapper> twoC(IntWrapper::create(2));
1533 {
1534 IntWrapper* three(IntWrapper::create(3));
1535 IntWrapper* four(IntWrapper::create(4));
1536 IntWrapper* threeB(IntWrapper::create(3));
1537 IntWrapper* fourB(IntWrapper::create(4));
1538
1539 // Member Collections.
1540 memberMember2->add(one, two);
1541 memberMember2->add(two, three);
1542 memberMember2->add(three, four);
1543 memberMember2->add(four, one);
1544 primitiveMember->add(1, two);
1545 primitiveMember->add(2, three);
1546 primitiveMember->add(3, four);
1547 primitiveMember->add(4, one);
1548 memberPrimitive->add(one, 2);
1549 memberPrimitive->add(two, 3);
1550 memberPrimitive->add(three, 4);
1551 memberPrimitive->add(four, 1);
1552 set2->add(one);
1553 set2->add(two);
1554 set2->add(three);
1555 set2->add(four);
1556 set->add(oneB);
1557 vector->append(oneB);
1558 vector2->append(threeB);
1559 vector2->append(fourB);
1560
1561 // Collect garbage. This should change nothing since we are keeping
1562 // alive the IntWrapper objects with on-stack pointers.
1563 Heap::collectGarbage(ThreadState::HeapPointersOnStack);
1564 EXPECT_EQ(0u, memberMember->size());
1565 EXPECT_EQ(4u, memberMember2->size());
1566 EXPECT_EQ(4u, primitiveMember->size());
1567 EXPECT_EQ(4u, memberPrimitive->size());
1568 EXPECT_EQ(1u, set->size());
1569 EXPECT_EQ(4u, set2->size());
1570 EXPECT_EQ(1u, vector->size());
1571 EXPECT_EQ(2u, vector2->size());
1572
1573 MemberVector& cvec = container->vector;
1574 cvec.swap(*vector.get());
1575 vector2->swap(cvec);
1576 vector->swap(cvec);
1577
1578 // Swap set and set2 in a roundabout way.
1579 MemberSet& cset1 = container->set;
1580 MemberSet& cset2 = container->set2;
1581 set->swap(cset1);
1582 set2->swap(cset2);
1583 set->swap(cset2);
1584 cset1.swap(cset2);
1585 cset2.swap(set2);
1586
1587 // Triple swap.
1588 container->map.swap(memberMember2);
1589 MemberMember& containedMap = container->map;
1590 memberMember3->swap(containedMap);
1591 memberMember3->swap(memberMember);
1592
1593 EXPECT_TRUE(memberMember->get(one) == two);
1594 EXPECT_TRUE(memberMember->get(two) == three);
1595 EXPECT_TRUE(memberMember->get(three) == four);
1596 EXPECT_TRUE(memberMember->get(four) == one);
1597 EXPECT_TRUE(primitiveMember->get(1) == two);
1598 EXPECT_TRUE(primitiveMember->get(2) == three);
1599 EXPECT_TRUE(primitiveMember->get(3) == four);
1600 EXPECT_TRUE(primitiveMember->get(4) == one);
1601 EXPECT_EQ(1, memberPrimitive->get(four));
1602 EXPECT_EQ(2, memberPrimitive->get(one));
1603 EXPECT_EQ(3, memberPrimitive->get(two));
1604 EXPECT_EQ(4, memberPrimitive->get(three));
1605 EXPECT_TRUE(set->contains(one));
1606 EXPECT_TRUE(set->contains(two));
1607 EXPECT_TRUE(set->contains(three));
1608 EXPECT_TRUE(set->contains(four));
1609 EXPECT_TRUE(set2->contains(oneB));
1610 EXPECT_TRUE(vector->contains(threeB));
1611 EXPECT_TRUE(vector->contains(fourB));
1612 EXPECT_TRUE(vector2->contains(oneB));
1613 EXPECT_FALSE(vector2->contains(threeB));
1614 }
1615
1616 Heap::collectGarbage(ThreadState::NoHeapPointersOnStack);
1617
1618 EXPECT_EQ(4u, memberMember->size());
1619 EXPECT_EQ(0u, memberMember2->size());
1620 EXPECT_EQ(4u, primitiveMember->size());
1621 EXPECT_EQ(4u, memberPrimitive->size());
1622 EXPECT_EQ(4u, set->size());
1623 EXPECT_EQ(1u, set2->size());
1624 EXPECT_EQ(2u, vector->size());
1625 EXPECT_EQ(1u, vector2->size());
1626
1627 EXPECT_TRUE(memberMember->get(one) == two);
1628 EXPECT_TRUE(primitiveMember->get(1) == two);
1629 EXPECT_TRUE(primitiveMember->get(4) == one);
1630 EXPECT_EQ(2, memberPrimitive->get(one));
1631 EXPECT_EQ(3, memberPrimitive->get(two));
1632 EXPECT_TRUE(set->contains(one));
1633 EXPECT_TRUE(set->contains(two));
1634 EXPECT_FALSE(set->contains(oneB));
1635 EXPECT_TRUE(set2->contains(oneB));
1636 EXPECT_EQ(3, vector->at(0)->value());
1637 EXPECT_EQ(4, vector->at(1)->value());
1638 }
1639
1640 Heap::collectGarbage(ThreadState::NoHeapPointersOnStack);
1641 Heap::collectGarbage(ThreadState::NoHeapPointersOnStack);
1642
1643 EXPECT_EQ(4u, memberMember->size());
1644 EXPECT_EQ(4u, primitiveMember->size());
1645 EXPECT_EQ(4u, memberPrimitive->size());
1646 EXPECT_EQ(4u, set->size());
1647 EXPECT_EQ(1u, set2->size());
1648 EXPECT_EQ(2u, vector->size());
1649 EXPECT_EQ(1u, vector2->size());
1650 EXPECT_EQ(2u, vector->size());
1651 EXPECT_EQ(1u, vector2->size());
1652 }
1653
1654 template<typename T>
1655 void MapIteratorCheck(T& it, const T& end, int expected)
1656 {
1657 int found = 0;
1658 while (it != end) {
1659 found++;
1660 int key = it->key->value();
1661 int value = it->value->value();
1662 EXPECT_TRUE(key >= 0 && key < 1100);
1663 EXPECT_TRUE(value >= 0 && value < 1100);
1664 ++it;
1665 }
1666 EXPECT_EQ(expected, found);
1667 }
1668
1669 template<typename T>
1670 void SetIteratorCheck(T& it, const T& end, int expected)
1671 {
1672 int found = 0;
1673 while (it != end) {
1674 found++;
1675 int value = (*it)->value();
1676 EXPECT_TRUE(value >= 0 && value < 1100);
1677 ++it;
1678 }
1679 EXPECT_EQ(expected, found);
1680 }
1681
1682 TEST(HeapTest, HeapWeakCollectionSimple)
1683 {
1684
1685 IntWrapper::s_destructorCalls = 0;
1686
1687 CollectionPersistent<Vector<Member<IntWrapper> > > keepNumbersAlive;
1688
1689 typedef HeapHashMap<WeakMember<IntWrapper>, Member<IntWrapper> > WeakStrong;
1690 typedef HeapHashMap<Member<IntWrapper>, WeakMember<IntWrapper> > StrongWeak;
1691 typedef HeapHashMap<WeakMember<IntWrapper>, WeakMember<IntWrapper> > WeakWea k;
1692 typedef HeapHashSet<WeakMember<IntWrapper> > WeakSet;
1693
1694 Persistent<WeakStrong> weakStrong = new WeakStrong();
1695 Persistent<StrongWeak> strongWeak = new StrongWeak();
1696 Persistent<WeakWeak> weakWeak = new WeakWeak();
1697 Persistent<WeakSet> weakSet = new WeakSet();
1698
1699 Persistent<IntWrapper> two = IntWrapper::create(2);
1700
1701 keepNumbersAlive->append(IntWrapper::create(103));
1702 keepNumbersAlive->append(IntWrapper::create(10));
1703
1704 {
1705 weakStrong->add(IntWrapper::create(1), two);
1706 strongWeak->add(two, IntWrapper::create(1));
1707 weakWeak->add(two, IntWrapper::create(42));
1708 weakWeak->add(IntWrapper::create(42), two);
1709 weakSet->add(IntWrapper::create(0));
1710 weakSet->add(two);
1711 weakSet->add(keepNumbersAlive[0]);
1712 weakSet->add(keepNumbersAlive[1]);
1713 EXPECT_EQ(1u, weakStrong->size());
1714 EXPECT_EQ(1u, strongWeak->size());
1715 EXPECT_EQ(2u, weakWeak->size());
1716 EXPECT_EQ(4u, weakSet->size());
1717 }
1718
1719 keepNumbersAlive[0] = nullptr;
1720
1721 Heap::collectGarbage(ThreadState::NoHeapPointersOnStack);
1722
1723 EXPECT_EQ(0u, weakStrong->size());
1724 EXPECT_EQ(0u, strongWeak->size());
1725 EXPECT_EQ(0u, weakWeak->size());
1726 EXPECT_EQ(2u, weakSet->size());
1727 }
1728
1729 TEST(HeapTest, HeapWeakCollectionTypes)
1730 {
1731 HeapStats initialHeapSize;
1732 IntWrapper::s_destructorCalls = 0;
1733
1734 typedef HeapHashMap<WeakMember<IntWrapper>, Member<IntWrapper> > WeakStrong;
1735 typedef HeapHashMap<Member<IntWrapper>, WeakMember<IntWrapper> > StrongWeak;
1736 typedef HeapHashMap<WeakMember<IntWrapper>, WeakMember<IntWrapper> > WeakWea k;
1737 typedef HeapHashSet<WeakMember<IntWrapper> > WeakSet;
1738
1739 clearOutOldGarbage(&initialHeapSize);
1740
1741 const int weakStrongIndex = 0;
1742 const int strongWeakIndex = 1;
1743 const int weakWeakIndex = 2;
1744 const int numberOfMapIndices = 3;
1745 const int weakSetIndex = 3;
1746 const int numberOfCollections = 4;
1747
1748 for (int testRun = 0; testRun < 4; testRun++) {
1749 for (int collectionNumber = 0; collectionNumber < numberOfCollections; c ollectionNumber++) {
1750 bool testThatIteratorsMakeStrong = (testRun == weakSetIndex);
1751 bool deleteAfterwards = (testRun == 1);
1752 bool addAfterwards = (testRun == weakWeakIndex);
1753
1754 // The test doesn't work for strongWeak with deleting because we los t
1755 // the key from the keepNumbersAlive array, so we can't do the looku p.
1756 if (deleteAfterwards && collectionNumber == strongWeakIndex)
1757 continue;
1758
1759 unsigned added = addAfterwards ? 100 : 0;
1760
1761 Persistent<WeakStrong> weakStrong = new WeakStrong();
1762 Persistent<StrongWeak> strongWeak = new StrongWeak();
1763 Persistent<WeakWeak> weakWeak = new WeakWeak();
1764
1765 Persistent<WeakSet> weakSet = new WeakSet();
1766
1767 CollectionPersistent<Vector<Member<IntWrapper> > > keepNumbersAlive;
1768 for (int i = 0; i < 128; i += 2) {
1769 IntWrapper* wrapped = IntWrapper::create(i);
1770 IntWrapper* wrapped2 = IntWrapper::create(i + 1);
1771 keepNumbersAlive->append(wrapped);
1772 keepNumbersAlive->append(wrapped2);
1773 weakStrong->add(wrapped, wrapped2);
1774 strongWeak->add(wrapped2, wrapped);
1775 weakWeak->add(wrapped, wrapped2);
1776 weakSet->add(wrapped);
1777 }
1778
1779 EXPECT_EQ(64u, weakStrong->size());
1780 EXPECT_EQ(64u, strongWeak->size());
1781 EXPECT_EQ(64u, weakWeak->size());
1782 EXPECT_EQ(64u, weakSet->size());
1783
1784 // Collect garbage. This should change nothing since we are keeping
1785 // alive the IntWrapper objects.
1786 Heap::collectGarbage(ThreadState::NoHeapPointersOnStack);
1787
1788 EXPECT_EQ(64u, weakStrong->size());
1789 EXPECT_EQ(64u, strongWeak->size());
1790 EXPECT_EQ(64u, weakWeak->size());
1791 EXPECT_EQ(64u, weakSet->size());
1792
1793 for (int i = 0; i < 128; i += 2) {
1794 IntWrapper* wrapped = keepNumbersAlive[i];
1795 IntWrapper* wrapped2 = keepNumbersAlive[i + 1];
1796 EXPECT_EQ(wrapped2, weakStrong->get(wrapped));
1797 EXPECT_EQ(wrapped, strongWeak->get(wrapped2));
1798 EXPECT_EQ(wrapped2, weakWeak->get(wrapped));
1799 EXPECT_TRUE(weakSet->contains(wrapped));
1800 }
1801
1802 for (int i = 0; i < 128; i += 3)
1803 keepNumbersAlive[i] = nullptr;
1804
1805 if (collectionNumber != weakStrongIndex)
1806 weakStrong->clear();
1807 if (collectionNumber != strongWeakIndex)
1808 strongWeak->clear();
1809 if (collectionNumber != weakWeakIndex)
1810 weakWeak->clear();
1811 if (collectionNumber != weakSetIndex)
1812 weakSet->clear();
1813
1814 if (testThatIteratorsMakeStrong) {
1815 WeakStrong::iterator it1 = weakStrong->begin();
1816 StrongWeak::iterator it2 = strongWeak->begin();
1817 WeakWeak::iterator it3 = weakWeak->begin();
1818 WeakSet::iterator it4 = weakSet->begin();
1819 // Collect garbage. This should change nothing since the
1820 // iterators make the collections strong.
1821 Heap::collectGarbage(ThreadState::HeapPointersOnStack);
1822 if (collectionNumber == weakStrongIndex) {
1823 EXPECT_EQ(64u, weakStrong->size());
1824 MapIteratorCheck(it1, weakStrong->end(), 64);
1825 } else if (collectionNumber == strongWeakIndex) {
1826 EXPECT_EQ(64u, strongWeak->size());
1827 MapIteratorCheck(it2, strongWeak->end(), 64);
1828 } else if (collectionNumber == weakWeakIndex) {
1829 EXPECT_EQ(64u, weakWeak->size());
1830 MapIteratorCheck(it3, weakWeak->end(), 64);
1831 } else if (collectionNumber == weakSetIndex) {
1832 EXPECT_EQ(64u, weakSet->size());
1833 SetIteratorCheck(it4, weakSet->end(), 64);
1834 }
1835 } else {
1836 // Collect garbage. This causes weak processing to remove
1837 // things from the collections.
1838 Heap::collectGarbage(ThreadState::NoHeapPointersOnStack);
1839 unsigned count = 0;
1840 for (int i = 0; i < 128; i += 2) {
1841 bool firstAlive = keepNumbersAlive[i];
1842 bool secondAlive = keepNumbersAlive[i + 1];
1843 if (firstAlive && (collectionNumber == weakStrongIndex || co llectionNumber == strongWeakIndex))
1844 secondAlive = true;
1845 if (firstAlive && secondAlive && collectionNumber < numberOf MapIndices) {
1846 if (collectionNumber == weakStrongIndex) {
1847 if (deleteAfterwards)
1848 EXPECT_EQ(i + 1, weakStrong->take(keepNumbersAli ve[i])->value());
1849 } else if (collectionNumber == strongWeakIndex) {
1850 if (deleteAfterwards)
1851 EXPECT_EQ(i, strongWeak->take(keepNumbersAlive[i + 1])->value());
1852 } else if (collectionNumber == weakWeakIndex) {
1853 if (deleteAfterwards)
1854 EXPECT_EQ(i + 1, weakWeak->take(keepNumbersAlive [i])->value());
1855 }
1856 if (!deleteAfterwards)
1857 count++;
1858 } else if (collectionNumber == weakSetIndex && firstAlive) {
1859 ASSERT_TRUE(weakSet->contains(keepNumbersAlive[i]));
1860 if (deleteAfterwards)
1861 weakSet->remove(keepNumbersAlive[i]);
1862 else
1863 count++;
1864 }
1865 }
1866 if (addAfterwards) {
1867 for (int i = 1000; i < 1100; i++) {
1868 IntWrapper* wrapped = IntWrapper::create(i);
1869 keepNumbersAlive->append(wrapped);
1870 weakStrong->add(wrapped, wrapped);
1871 strongWeak->add(wrapped, wrapped);
1872 weakWeak->add(wrapped, wrapped);
1873 weakSet->add(wrapped);
1874 }
1875 }
1876 if (collectionNumber == weakStrongIndex)
1877 EXPECT_EQ(count + added, weakStrong->size());
1878 else if (collectionNumber == strongWeakIndex)
1879 EXPECT_EQ(count + added, strongWeak->size());
1880 else if (collectionNumber == weakWeakIndex)
1881 EXPECT_EQ(count + added, weakWeak->size());
1882 else if (collectionNumber == weakSetIndex)
1883 EXPECT_EQ(count + added, weakSet->size());
1884 WeakStrong::iterator it1 = weakStrong->begin();
1885 StrongWeak::iterator it2 = strongWeak->begin();
1886 WeakWeak::iterator it3 = weakWeak->begin();
1887 WeakSet::iterator it4 = weakSet->begin();
1888 MapIteratorCheck(it1, weakStrong->end(), (collectionNumber == we akStrongIndex ? count : 0) + added);
1889 MapIteratorCheck(it2, strongWeak->end(), (collectionNumber == st rongWeakIndex ? count : 0) + added);
1890 MapIteratorCheck(it3, weakWeak->end(), (collectionNumber == weak WeakIndex ? count : 0) + added);
1891 SetIteratorCheck(it4, weakSet->end(), (collectionNumber == weakS etIndex ? count : 0) + added);
1892 }
1893 for (unsigned i = 0; i < 128 + added; i++)
1894 keepNumbersAlive[i] = nullptr;
1895 Heap::collectGarbage(ThreadState::NoHeapPointersOnStack);
1896 EXPECT_EQ(added, weakStrong->size());
1897 EXPECT_EQ(added, strongWeak->size());
1898 EXPECT_EQ(added, weakWeak->size());
1899 EXPECT_EQ(added, weakSet->size());
1900 }
1901 }
1902 }
1903
1418 TEST(HeapTest, RefCountedGarbageCollected) 1904 TEST(HeapTest, RefCountedGarbageCollected)
1419 { 1905 {
1420 RefCountedAndGarbageCollected::s_destructorCalls = 0; 1906 RefCountedAndGarbageCollected::s_destructorCalls = 0;
1421 { 1907 {
1422 RefPtr<RefCountedAndGarbageCollected> refPtr3; 1908 RefPtr<RefCountedAndGarbageCollected> refPtr3;
1423 { 1909 {
1424 Persistent<RefCountedAndGarbageCollected> persistent; 1910 Persistent<RefCountedAndGarbageCollected> persistent;
1425 { 1911 {
1426 RefPtr<RefCountedAndGarbageCollected> refPtr1 = RefCountedAndGar bageCollected::create(); 1912 RefPtr<RefCountedAndGarbageCollected> refPtr1 = RefCountedAndGar bageCollected::create();
1427 RefPtr<RefCountedAndGarbageCollected> refPtr2 = RefCountedAndGar bageCollected::create(); 1913 RefPtr<RefCountedAndGarbageCollected> refPtr2 = RefCountedAndGar bageCollected::create();
(...skipping 175 matching lines...) Expand 10 before | Expand all | Expand 10 after
1603 } 2089 }
1604 // This round of GC is important to make sure that the object start 2090 // This round of GC is important to make sure that the object start
1605 // bitmap are cleared out and that the free lists are rebuild. 2091 // bitmap are cleared out and that the free lists are rebuild.
1606 clearOutOldGarbage(&initialHeapStats); 2092 clearOutOldGarbage(&initialHeapStats);
1607 } 2093 }
1608 2094
1609 DEFINE_GC_INFO(Bar); 2095 DEFINE_GC_INFO(Bar);
1610 DEFINE_GC_INFO(Baz); 2096 DEFINE_GC_INFO(Baz);
1611 DEFINE_GC_INFO(ClassWithMember); 2097 DEFINE_GC_INFO(ClassWithMember);
1612 DEFINE_GC_INFO(ConstructorAllocation); 2098 DEFINE_GC_INFO(ConstructorAllocation);
2099 DEFINE_GC_INFO(Container);
1613 DEFINE_GC_INFO(HeapAllocatedArray); 2100 DEFINE_GC_INFO(HeapAllocatedArray);
1614 DEFINE_GC_INFO(HeapTestSuperClass); 2101 DEFINE_GC_INFO(HeapTestSuperClass);
1615 DEFINE_GC_INFO(IntWrapper); 2102 DEFINE_GC_INFO(IntWrapper);
1616 DEFINE_GC_INFO(LargeObject); 2103 DEFINE_GC_INFO(LargeObject);
1617 DEFINE_GC_INFO(PointsBack); 2104 DEFINE_GC_INFO(PointsBack);
1618 DEFINE_GC_INFO(RefCountedAndGarbageCollected); 2105 DEFINE_GC_INFO(RefCountedAndGarbageCollected);
1619 DEFINE_GC_INFO(RefCountedAndGarbageCollected2); 2106 DEFINE_GC_INFO(RefCountedAndGarbageCollected2);
1620 DEFINE_GC_INFO(SimpleFinalizedObject); 2107 DEFINE_GC_INFO(SimpleFinalizedObject);
1621 DEFINE_GC_INFO(SimpleObject); 2108 DEFINE_GC_INFO(SimpleObject);
1622 DEFINE_GC_INFO(SuperClass); 2109 DEFINE_GC_INFO(SuperClass);
1623 DEFINE_GC_INFO(SubData); 2110 DEFINE_GC_INFO(SubData);
1624 DEFINE_GC_INFO(TestTypedHeapClass); 2111 DEFINE_GC_INFO(TestTypedHeapClass);
1625 DEFINE_GC_INFO(TraceCounter); 2112 DEFINE_GC_INFO(TraceCounter);
1626 2113
1627 } // namespace 2114 } // namespace
OLDNEW
« Source/heap/Heap.h ('K') | « Source/heap/Heap.h ('k') | Source/heap/Visitor.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698