OLD | NEW |
1 // Copyright 2012 the V8 project authors. All rights reserved. | 1 // Copyright 2012 the V8 project authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "src/heap/mark-compact.h" | 5 #include "src/heap/mark-compact.h" |
6 | 6 |
7 #include "src/base/atomicops.h" | 7 #include "src/base/atomicops.h" |
8 #include "src/base/bits.h" | 8 #include "src/base/bits.h" |
9 #include "src/base/sys-info.h" | 9 #include "src/base/sys-info.h" |
10 #include "src/code-stubs.h" | 10 #include "src/code-stubs.h" |
(...skipping 1515 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1526 MarkBit markbit = Marking::MarkBitFrom(object); | 1526 MarkBit markbit = Marking::MarkBitFrom(object); |
1527 DCHECK(Marking::IsGrey(markbit)); | 1527 DCHECK(Marking::IsGrey(markbit)); |
1528 Marking::GreyToBlack(markbit); | 1528 Marking::GreyToBlack(markbit); |
1529 PushBlack(object); | 1529 PushBlack(object); |
1530 if (marking_deque()->IsFull()) return; | 1530 if (marking_deque()->IsFull()) return; |
1531 } | 1531 } |
1532 } | 1532 } |
1533 | 1533 |
1534 class RecordMigratedSlotVisitor final : public ObjectVisitor { | 1534 class RecordMigratedSlotVisitor final : public ObjectVisitor { |
1535 public: | 1535 public: |
| 1536 explicit RecordMigratedSlotVisitor(MarkCompactCollector* collector) |
| 1537 : collector_(collector) {} |
| 1538 |
1536 inline void VisitPointer(Object** p) final { | 1539 inline void VisitPointer(Object** p) final { |
1537 RecordMigratedSlot(*p, reinterpret_cast<Address>(p)); | 1540 RecordMigratedSlot(*p, reinterpret_cast<Address>(p)); |
1538 } | 1541 } |
1539 | 1542 |
1540 inline void VisitPointers(Object** start, Object** end) final { | 1543 inline void VisitPointers(Object** start, Object** end) final { |
1541 while (start < end) { | 1544 while (start < end) { |
1542 RecordMigratedSlot(*start, reinterpret_cast<Address>(start)); | 1545 RecordMigratedSlot(*start, reinterpret_cast<Address>(start)); |
1543 ++start; | 1546 ++start; |
1544 } | 1547 } |
1545 } | 1548 } |
1546 | 1549 |
1547 inline void VisitCodeEntry(Address code_entry_slot) final { | 1550 inline void VisitCodeEntry(Address code_entry_slot) final { |
1548 Address code_entry = Memory::Address_at(code_entry_slot); | 1551 Address code_entry = Memory::Address_at(code_entry_slot); |
1549 if (Page::FromAddress(code_entry)->IsEvacuationCandidate()) { | 1552 if (Page::FromAddress(code_entry)->IsEvacuationCandidate()) { |
1550 RememberedSet<OLD_TO_OLD>::InsertTyped(Page::FromAddress(code_entry_slot), | 1553 RememberedSet<OLD_TO_OLD>::InsertTyped(Page::FromAddress(code_entry_slot), |
1551 CODE_ENTRY_SLOT, code_entry_slot); | 1554 CODE_ENTRY_SLOT, code_entry_slot); |
1552 } | 1555 } |
1553 } | 1556 } |
1554 | 1557 |
| 1558 inline void VisitCodeTarget(RelocInfo* rinfo) final { |
| 1559 DCHECK(RelocInfo::IsCodeTarget(rinfo->rmode())); |
| 1560 Code* target = Code::GetCodeFromTargetAddress(rinfo->target_address()); |
| 1561 Code* host = rinfo->host(); |
| 1562 collector_->RecordRelocSlot(host, rinfo, target); |
| 1563 } |
| 1564 |
| 1565 inline void VisitDebugTarget(RelocInfo* rinfo) final { |
| 1566 DCHECK(RelocInfo::IsDebugBreakSlot(rinfo->rmode()) && |
| 1567 rinfo->IsPatchedDebugBreakSlotSequence()); |
| 1568 Code* target = Code::GetCodeFromTargetAddress(rinfo->debug_call_address()); |
| 1569 Code* host = rinfo->host(); |
| 1570 collector_->RecordRelocSlot(host, rinfo, target); |
| 1571 } |
| 1572 |
| 1573 inline void VisitEmbeddedPointer(RelocInfo* rinfo) final { |
| 1574 DCHECK(rinfo->rmode() == RelocInfo::EMBEDDED_OBJECT); |
| 1575 HeapObject* object = HeapObject::cast(rinfo->target_object()); |
| 1576 Code* host = rinfo->host(); |
| 1577 collector_->RecordRelocSlot(host, rinfo, object); |
| 1578 } |
| 1579 |
| 1580 inline void VisitCell(RelocInfo* rinfo) final { |
| 1581 DCHECK(rinfo->rmode() == RelocInfo::CELL); |
| 1582 Cell* cell = rinfo->target_cell(); |
| 1583 Code* host = rinfo->host(); |
| 1584 collector_->RecordRelocSlot(host, rinfo, cell); |
| 1585 } |
| 1586 |
| 1587 // Entries that will never move. |
| 1588 inline void VisitCodeAgeSequence(RelocInfo* rinfo) final { |
| 1589 DCHECK(RelocInfo::IsCodeAgeSequence(rinfo->rmode())); |
| 1590 Code* stub = rinfo->code_age_stub(); |
| 1591 USE(stub); |
| 1592 DCHECK(!Page::FromAddress(stub->address())->IsEvacuationCandidate()); |
| 1593 } |
| 1594 |
| 1595 // Entries that are skipped for recording. |
| 1596 inline void VisitExternalReference(RelocInfo* rinfo) final {} |
| 1597 inline void VisitExternalReference(Address* p) final {} |
| 1598 inline void VisitRuntimeEntry(RelocInfo* rinfo) final {} |
| 1599 inline void VisitExternalOneByteString( |
| 1600 v8::String::ExternalOneByteStringResource** resource) final {} |
| 1601 inline void VisitExternalTwoByteString( |
| 1602 v8::String::ExternalStringResource** resource) final {} |
| 1603 inline void VisitInternalReference(RelocInfo* rinfo) final {} |
| 1604 inline void VisitEmbedderReference(Object** p, uint16_t class_id) final {} |
| 1605 |
1555 private: | 1606 private: |
1556 inline void RecordMigratedSlot(Object* value, Address slot) { | 1607 inline void RecordMigratedSlot(Object* value, Address slot) { |
1557 if (value->IsHeapObject()) { | 1608 if (value->IsHeapObject()) { |
1558 Page* p = Page::FromAddress(reinterpret_cast<Address>(value)); | 1609 Page* p = Page::FromAddress(reinterpret_cast<Address>(value)); |
1559 if (p->InNewSpace()) { | 1610 if (p->InNewSpace()) { |
1560 RememberedSet<OLD_TO_NEW>::Insert(Page::FromAddress(slot), slot); | 1611 RememberedSet<OLD_TO_NEW>::Insert(Page::FromAddress(slot), slot); |
1561 } else if (p->IsEvacuationCandidate()) { | 1612 } else if (p->IsEvacuationCandidate()) { |
1562 RememberedSet<OLD_TO_OLD>::Insert(Page::FromAddress(slot), slot); | 1613 RememberedSet<OLD_TO_OLD>::Insert(Page::FromAddress(slot), slot); |
1563 } | 1614 } |
1564 } | 1615 } |
1565 } | 1616 } |
| 1617 |
| 1618 MarkCompactCollector* collector_; |
1566 }; | 1619 }; |
1567 | 1620 |
1568 class MarkCompactCollector::HeapObjectVisitor { | 1621 class MarkCompactCollector::HeapObjectVisitor { |
1569 public: | 1622 public: |
1570 virtual ~HeapObjectVisitor() {} | 1623 virtual ~HeapObjectVisitor() {} |
1571 virtual bool Visit(HeapObject* object) = 0; | 1624 virtual bool Visit(HeapObject* object) = 0; |
1572 }; | 1625 }; |
1573 | 1626 |
1574 class MarkCompactCollector::EvacuateVisitorBase | 1627 class MarkCompactCollector::EvacuateVisitorBase |
1575 : public MarkCompactCollector::HeapObjectVisitor { | 1628 : public MarkCompactCollector::HeapObjectVisitor { |
(...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1613 DCHECK(heap_->AllowedToBeMigrated(src, dest)); | 1666 DCHECK(heap_->AllowedToBeMigrated(src, dest)); |
1614 DCHECK(dest != LO_SPACE); | 1667 DCHECK(dest != LO_SPACE); |
1615 if (dest == OLD_SPACE) { | 1668 if (dest == OLD_SPACE) { |
1616 DCHECK_OBJECT_SIZE(size); | 1669 DCHECK_OBJECT_SIZE(size); |
1617 DCHECK(IsAligned(size, kPointerSize)); | 1670 DCHECK(IsAligned(size, kPointerSize)); |
1618 heap_->CopyBlock(dst_addr, src_addr, size); | 1671 heap_->CopyBlock(dst_addr, src_addr, size); |
1619 if ((mode == kProfiled) && FLAG_ignition && dst->IsBytecodeArray()) { | 1672 if ((mode == kProfiled) && FLAG_ignition && dst->IsBytecodeArray()) { |
1620 PROFILE(heap_->isolate(), | 1673 PROFILE(heap_->isolate(), |
1621 CodeMoveEvent(AbstractCode::cast(src), dst_addr)); | 1674 CodeMoveEvent(AbstractCode::cast(src), dst_addr)); |
1622 } | 1675 } |
1623 RecordMigratedSlotVisitor visitor; | 1676 RecordMigratedSlotVisitor visitor(heap_->mark_compact_collector()); |
1624 dst->IterateBodyFast(dst->map()->instance_type(), size, &visitor); | 1677 dst->IterateBodyFast(dst->map()->instance_type(), size, &visitor); |
1625 } else if (dest == CODE_SPACE) { | 1678 } else if (dest == CODE_SPACE) { |
1626 DCHECK_CODEOBJECT_SIZE(size, heap_->code_space()); | 1679 DCHECK_CODEOBJECT_SIZE(size, heap_->code_space()); |
1627 if (mode == kProfiled) { | 1680 if (mode == kProfiled) { |
1628 PROFILE(heap_->isolate(), | 1681 PROFILE(heap_->isolate(), |
1629 CodeMoveEvent(AbstractCode::cast(src), dst_addr)); | 1682 CodeMoveEvent(AbstractCode::cast(src), dst_addr)); |
1630 } | 1683 } |
1631 heap_->CopyBlock(dst_addr, src_addr, size); | 1684 heap_->CopyBlock(dst_addr, src_addr, size); |
1632 RememberedSet<OLD_TO_OLD>::InsertTyped(Page::FromAddress(dst_addr), | |
1633 RELOCATED_CODE_OBJECT, dst_addr); | |
1634 Code::cast(dst)->Relocate(dst_addr - src_addr); | 1685 Code::cast(dst)->Relocate(dst_addr - src_addr); |
| 1686 RecordMigratedSlotVisitor visitor(heap_->mark_compact_collector()); |
| 1687 dst->IterateBodyFast(dst->map()->instance_type(), size, &visitor); |
1635 } else { | 1688 } else { |
1636 DCHECK_OBJECT_SIZE(size); | 1689 DCHECK_OBJECT_SIZE(size); |
1637 DCHECK(dest == NEW_SPACE); | 1690 DCHECK(dest == NEW_SPACE); |
1638 heap_->CopyBlock(dst_addr, src_addr, size); | 1691 heap_->CopyBlock(dst_addr, src_addr, size); |
1639 } | 1692 } |
1640 if (mode == kProfiled) { | 1693 if (mode == kProfiled) { |
1641 heap_->OnMoveEvent(dst, src, size); | 1694 heap_->OnMoveEvent(dst, src, size); |
1642 } | 1695 } |
1643 Memory::Address_at(src_addr) = dst_addr; | 1696 Memory::Address_at(src_addr) = dst_addr; |
1644 } | 1697 } |
(...skipping 147 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1792 LocalAllocationBuffer buffer_; | 1845 LocalAllocationBuffer buffer_; |
1793 AllocationSpace space_to_allocate_; | 1846 AllocationSpace space_to_allocate_; |
1794 intptr_t promoted_size_; | 1847 intptr_t promoted_size_; |
1795 intptr_t semispace_copied_size_; | 1848 intptr_t semispace_copied_size_; |
1796 HashMap* local_pretenuring_feedback_; | 1849 HashMap* local_pretenuring_feedback_; |
1797 }; | 1850 }; |
1798 | 1851 |
1799 class MarkCompactCollector::EvacuateNewSpacePageVisitor final | 1852 class MarkCompactCollector::EvacuateNewSpacePageVisitor final |
1800 : public MarkCompactCollector::HeapObjectVisitor { | 1853 : public MarkCompactCollector::HeapObjectVisitor { |
1801 public: | 1854 public: |
1802 EvacuateNewSpacePageVisitor() : promoted_size_(0) {} | 1855 explicit EvacuateNewSpacePageVisitor(Heap* heap) |
| 1856 : heap_(heap), promoted_size_(0) {} |
1803 | 1857 |
1804 static void TryMoveToOldSpace(Page* page, PagedSpace* owner) { | 1858 static void TryMoveToOldSpace(Page* page, PagedSpace* owner) { |
1805 if (page->heap()->new_space()->ReplaceWithEmptyPage(page)) { | 1859 if (page->heap()->new_space()->ReplaceWithEmptyPage(page)) { |
1806 Page* new_page = Page::ConvertNewToOld(page, owner); | 1860 Page* new_page = Page::ConvertNewToOld(page, owner); |
1807 new_page->SetFlag(Page::PAGE_NEW_OLD_PROMOTION); | 1861 new_page->SetFlag(Page::PAGE_NEW_OLD_PROMOTION); |
1808 } | 1862 } |
1809 } | 1863 } |
1810 | 1864 |
1811 inline bool Visit(HeapObject* object) { | 1865 inline bool Visit(HeapObject* object) { |
1812 if (V8_UNLIKELY(object->IsJSArrayBuffer())) { | 1866 if (V8_UNLIKELY(object->IsJSArrayBuffer())) { |
1813 object->GetHeap()->array_buffer_tracker()->Promote( | 1867 object->GetHeap()->array_buffer_tracker()->Promote( |
1814 JSArrayBuffer::cast(object)); | 1868 JSArrayBuffer::cast(object)); |
1815 } | 1869 } |
1816 RecordMigratedSlotVisitor visitor; | 1870 RecordMigratedSlotVisitor visitor(heap_->mark_compact_collector()); |
1817 object->IterateBodyFast(&visitor); | 1871 object->IterateBodyFast(&visitor); |
1818 promoted_size_ += object->Size(); | 1872 promoted_size_ += object->Size(); |
1819 return true; | 1873 return true; |
1820 } | 1874 } |
1821 | 1875 |
1822 intptr_t promoted_size() { return promoted_size_; } | 1876 intptr_t promoted_size() { return promoted_size_; } |
1823 | 1877 |
1824 private: | 1878 private: |
| 1879 Heap* heap_; |
1825 intptr_t promoted_size_; | 1880 intptr_t promoted_size_; |
1826 }; | 1881 }; |
1827 | 1882 |
1828 class MarkCompactCollector::EvacuateOldSpaceVisitor final | 1883 class MarkCompactCollector::EvacuateOldSpaceVisitor final |
1829 : public MarkCompactCollector::EvacuateVisitorBase { | 1884 : public MarkCompactCollector::EvacuateVisitorBase { |
1830 public: | 1885 public: |
1831 EvacuateOldSpaceVisitor(Heap* heap, | 1886 EvacuateOldSpaceVisitor(Heap* heap, |
1832 CompactionSpaceCollection* compaction_spaces) | 1887 CompactionSpaceCollection* compaction_spaces) |
1833 : EvacuateVisitorBase(heap, compaction_spaces) {} | 1888 : EvacuateVisitorBase(heap, compaction_spaces) {} |
1834 | 1889 |
1835 inline bool Visit(HeapObject* object) override { | 1890 inline bool Visit(HeapObject* object) override { |
1836 CompactionSpace* target_space = compaction_spaces_->Get( | 1891 CompactionSpace* target_space = compaction_spaces_->Get( |
1837 Page::FromAddress(object->address())->owner()->identity()); | 1892 Page::FromAddress(object->address())->owner()->identity()); |
1838 HeapObject* target_object = nullptr; | 1893 HeapObject* target_object = nullptr; |
1839 if (TryEvacuateObject(target_space, object, &target_object)) { | 1894 if (TryEvacuateObject(target_space, object, &target_object)) { |
1840 DCHECK(object->map_word().IsForwardingAddress()); | 1895 DCHECK(object->map_word().IsForwardingAddress()); |
1841 return true; | 1896 return true; |
1842 } | 1897 } |
1843 return false; | 1898 return false; |
1844 } | 1899 } |
1845 }; | 1900 }; |
1846 | 1901 |
1847 class MarkCompactCollector::EvacuateRecordOnlyVisitor final | 1902 class MarkCompactCollector::EvacuateRecordOnlyVisitor final |
1848 : public MarkCompactCollector::HeapObjectVisitor { | 1903 : public MarkCompactCollector::HeapObjectVisitor { |
1849 public: | 1904 public: |
1850 explicit EvacuateRecordOnlyVisitor(AllocationSpace space) : space_(space) {} | 1905 explicit EvacuateRecordOnlyVisitor(Heap* heap) : heap_(heap) {} |
1851 | 1906 |
1852 inline bool Visit(HeapObject* object) { | 1907 inline bool Visit(HeapObject* object) { |
1853 if (space_ == OLD_SPACE) { | 1908 RecordMigratedSlotVisitor visitor(heap_->mark_compact_collector()); |
1854 RecordMigratedSlotVisitor visitor; | 1909 object->IterateBody(&visitor); |
1855 object->IterateBody(&visitor); | |
1856 } else { | |
1857 DCHECK_EQ(space_, CODE_SPACE); | |
1858 // Add a typed slot for the whole code object. | |
1859 RememberedSet<OLD_TO_OLD>::InsertTyped( | |
1860 Page::FromAddress(object->address()), RELOCATED_CODE_OBJECT, | |
1861 object->address()); | |
1862 } | |
1863 return true; | 1910 return true; |
1864 } | 1911 } |
1865 | 1912 |
1866 private: | 1913 private: |
1867 AllocationSpace space_; | 1914 Heap* heap_; |
1868 }; | 1915 }; |
1869 | 1916 |
1870 void MarkCompactCollector::DiscoverGreyObjectsInSpace(PagedSpace* space) { | 1917 void MarkCompactCollector::DiscoverGreyObjectsInSpace(PagedSpace* space) { |
1871 PageIterator it(space); | 1918 PageIterator it(space); |
1872 while (it.has_next()) { | 1919 while (it.has_next()) { |
1873 Page* p = it.next(); | 1920 Page* p = it.next(); |
1874 if (!p->IsFlagSet(Page::BLACK_PAGE)) { | 1921 if (!p->IsFlagSet(Page::BLACK_PAGE)) { |
1875 DiscoverGreyObjectsOnPage(p); | 1922 DiscoverGreyObjectsOnPage(p); |
1876 } | 1923 } |
1877 if (marking_deque()->IsFull()) return; | 1924 if (marking_deque()->IsFull()) return; |
(...skipping 884 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2762 } | 2809 } |
2763 case CELL_TARGET_SLOT: { | 2810 case CELL_TARGET_SLOT: { |
2764 RelocInfo rinfo(isolate, addr, RelocInfo::CELL, 0, NULL); | 2811 RelocInfo rinfo(isolate, addr, RelocInfo::CELL, 0, NULL); |
2765 rinfo.Visit(isolate, v); | 2812 rinfo.Visit(isolate, v); |
2766 break; | 2813 break; |
2767 } | 2814 } |
2768 case CODE_ENTRY_SLOT: { | 2815 case CODE_ENTRY_SLOT: { |
2769 v->VisitCodeEntry(addr); | 2816 v->VisitCodeEntry(addr); |
2770 break; | 2817 break; |
2771 } | 2818 } |
2772 case RELOCATED_CODE_OBJECT: { | |
2773 HeapObject* obj = HeapObject::FromAddress(addr); | |
2774 Code::BodyDescriptor::IterateBody(obj, v); | |
2775 break; | |
2776 } | |
2777 case DEBUG_TARGET_SLOT: { | 2819 case DEBUG_TARGET_SLOT: { |
2778 RelocInfo rinfo(isolate, addr, RelocInfo::DEBUG_BREAK_SLOT_AT_POSITION, 0, | 2820 RelocInfo rinfo(isolate, addr, RelocInfo::DEBUG_BREAK_SLOT_AT_POSITION, 0, |
2779 NULL); | 2821 NULL); |
2780 if (rinfo.IsPatchedDebugBreakSlotSequence()) rinfo.Visit(isolate, v); | 2822 if (rinfo.IsPatchedDebugBreakSlotSequence()) rinfo.Visit(isolate, v); |
2781 break; | 2823 break; |
2782 } | 2824 } |
2783 case EMBEDDED_OBJECT_SLOT: { | 2825 case EMBEDDED_OBJECT_SLOT: { |
2784 RelocInfo rinfo(isolate, addr, RelocInfo::EMBEDDED_OBJECT, 0, NULL); | 2826 RelocInfo rinfo(isolate, addr, RelocInfo::EMBEDDED_OBJECT, 0, NULL); |
2785 rinfo.Visit(isolate, v); | 2827 rinfo.Visit(isolate, v); |
2786 break; | 2828 break; |
(...skipping 267 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3054 return Page::kAllocatableMemory + kPointerSize; | 3096 return Page::kAllocatableMemory + kPointerSize; |
3055 } | 3097 } |
3056 | 3098 |
3057 explicit Evacuator(MarkCompactCollector* collector) | 3099 explicit Evacuator(MarkCompactCollector* collector) |
3058 : collector_(collector), | 3100 : collector_(collector), |
3059 compaction_spaces_(collector->heap()), | 3101 compaction_spaces_(collector->heap()), |
3060 local_pretenuring_feedback_(HashMap::PointersMatch, | 3102 local_pretenuring_feedback_(HashMap::PointersMatch, |
3061 kInitialLocalPretenuringFeedbackCapacity), | 3103 kInitialLocalPretenuringFeedbackCapacity), |
3062 new_space_visitor_(collector->heap(), &compaction_spaces_, | 3104 new_space_visitor_(collector->heap(), &compaction_spaces_, |
3063 &local_pretenuring_feedback_), | 3105 &local_pretenuring_feedback_), |
3064 new_space_page_visitor(), | 3106 new_space_page_visitor(collector->heap()), |
3065 old_space_visitor_(collector->heap(), &compaction_spaces_), | 3107 old_space_visitor_(collector->heap(), &compaction_spaces_), |
3066 duration_(0.0), | 3108 duration_(0.0), |
3067 bytes_compacted_(0) {} | 3109 bytes_compacted_(0) {} |
3068 | 3110 |
3069 inline bool EvacuatePage(Page* chunk); | 3111 inline bool EvacuatePage(Page* chunk); |
3070 | 3112 |
3071 // Merge back locally cached info sequentially. Note that this method needs | 3113 // Merge back locally cached info sequentially. Note that this method needs |
3072 // to be called from the main thread. | 3114 // to be called from the main thread. |
3073 inline void Finalize(); | 3115 inline void Finalize(); |
3074 | 3116 |
(...skipping 90 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3165 case kPageNewToOld: | 3207 case kPageNewToOld: |
3166 result = EvacuateSinglePage<kKeepMarking>(page, &new_space_page_visitor); | 3208 result = EvacuateSinglePage<kKeepMarking>(page, &new_space_page_visitor); |
3167 DCHECK(result); | 3209 DCHECK(result); |
3168 USE(result); | 3210 USE(result); |
3169 break; | 3211 break; |
3170 case kObjectsOldToOld: | 3212 case kObjectsOldToOld: |
3171 result = EvacuateSinglePage<kClearMarkbits>(page, &old_space_visitor_); | 3213 result = EvacuateSinglePage<kClearMarkbits>(page, &old_space_visitor_); |
3172 if (!result) { | 3214 if (!result) { |
3173 // Aborted compaction page. We can record slots here to have them | 3215 // Aborted compaction page. We can record slots here to have them |
3174 // processed in parallel later on. | 3216 // processed in parallel later on. |
3175 EvacuateRecordOnlyVisitor record_visitor(page->owner()->identity()); | 3217 EvacuateRecordOnlyVisitor record_visitor(collector_->heap()); |
3176 result = EvacuateSinglePage<kKeepMarking>(page, &record_visitor); | 3218 result = EvacuateSinglePage<kKeepMarking>(page, &record_visitor); |
3177 DCHECK(result); | 3219 DCHECK(result); |
3178 USE(result); | 3220 USE(result); |
3179 // We need to return failure here to indicate that we want this page | 3221 // We need to return failure here to indicate that we want this page |
3180 // added to the sweeper. | 3222 // added to the sweeper. |
3181 return false; | 3223 return false; |
3182 } | 3224 } |
3183 break; | 3225 break; |
3184 default: | 3226 default: |
3185 UNREACHABLE(); | 3227 UNREACHABLE(); |
(...skipping 761 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3947 MarkBit mark_bit = Marking::MarkBitFrom(host); | 3989 MarkBit mark_bit = Marking::MarkBitFrom(host); |
3948 if (Marking::IsBlack(mark_bit)) { | 3990 if (Marking::IsBlack(mark_bit)) { |
3949 RelocInfo rinfo(isolate(), pc, RelocInfo::CODE_TARGET, 0, host); | 3991 RelocInfo rinfo(isolate(), pc, RelocInfo::CODE_TARGET, 0, host); |
3950 RecordRelocSlot(host, &rinfo, target); | 3992 RecordRelocSlot(host, &rinfo, target); |
3951 } | 3993 } |
3952 } | 3994 } |
3953 } | 3995 } |
3954 | 3996 |
3955 } // namespace internal | 3997 } // namespace internal |
3956 } // namespace v8 | 3998 } // namespace v8 |
OLD | NEW |