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