| OLD | NEW |
| 1 // Copyright 2011 the V8 project authors. All rights reserved. | 1 // Copyright 2011 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/spaces.h" | 5 #include "src/heap/spaces.h" |
| 6 | 6 |
| 7 #include <utility> | 7 #include <utility> |
| 8 | 8 |
| 9 #include "src/base/bits.h" | 9 #include "src/base/bits.h" |
| 10 #include "src/base/platform/platform.h" | 10 #include "src/base/platform/platform.h" |
| (...skipping 1412 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1423 if (page->next_chunk() != NULL) { | 1423 if (page->next_chunk() != NULL) { |
| 1424 DCHECK(page->prev_chunk() != NULL); | 1424 DCHECK(page->prev_chunk() != NULL); |
| 1425 page->Unlink(); | 1425 page->Unlink(); |
| 1426 } | 1426 } |
| 1427 | 1427 |
| 1428 AccountUncommitted(static_cast<intptr_t>(page->size())); | 1428 AccountUncommitted(static_cast<intptr_t>(page->size())); |
| 1429 accounting_stats_.ShrinkSpace(page->area_size()); | 1429 accounting_stats_.ShrinkSpace(page->area_size()); |
| 1430 heap()->memory_allocator()->Free<MemoryAllocator::kPreFreeAndQueue>(page); | 1430 heap()->memory_allocator()->Free<MemoryAllocator::kPreFreeAndQueue>(page); |
| 1431 } | 1431 } |
| 1432 | 1432 |
| 1433 std::unique_ptr<ObjectIterator> PagedSpace::GetObjectIterator() { |
| 1434 return std::unique_ptr<ObjectIterator>(new HeapObjectIterator(this)); |
| 1435 } |
| 1436 |
| 1433 #ifdef DEBUG | 1437 #ifdef DEBUG |
| 1434 void PagedSpace::Print() {} | 1438 void PagedSpace::Print() {} |
| 1435 #endif | 1439 #endif |
| 1436 | 1440 |
| 1437 #ifdef VERIFY_HEAP | 1441 #ifdef VERIFY_HEAP |
| 1438 void PagedSpace::Verify(ObjectVisitor* visitor) { | 1442 void PagedSpace::Verify(ObjectVisitor* visitor) { |
| 1439 bool allocation_pointer_found_in_space = | 1443 bool allocation_pointer_found_in_space = |
| 1440 (allocation_info_.top() == allocation_info_.limit()); | 1444 (allocation_info_.top() == allocation_info_.limit()); |
| 1441 for (Page* page : *this) { | 1445 for (Page* page : *this) { |
| 1442 CHECK(page->owner() == this); | 1446 CHECK(page->owner() == this); |
| (...skipping 366 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1809 if (top_on_previous_step_) { | 1813 if (top_on_previous_step_) { |
| 1810 int bytes_allocated = static_cast<int>(top - top_on_previous_step_); | 1814 int bytes_allocated = static_cast<int>(top - top_on_previous_step_); |
| 1811 for (int i = 0; i < allocation_observers_->length(); ++i) { | 1815 for (int i = 0; i < allocation_observers_->length(); ++i) { |
| 1812 (*allocation_observers_)[i]->AllocationStep(bytes_allocated, soon_object, | 1816 (*allocation_observers_)[i]->AllocationStep(bytes_allocated, soon_object, |
| 1813 size); | 1817 size); |
| 1814 } | 1818 } |
| 1815 top_on_previous_step_ = new_top; | 1819 top_on_previous_step_ = new_top; |
| 1816 } | 1820 } |
| 1817 } | 1821 } |
| 1818 | 1822 |
| 1823 std::unique_ptr<ObjectIterator> NewSpace::GetObjectIterator() { |
| 1824 return std::unique_ptr<ObjectIterator>(new SemiSpaceIterator(this)); |
| 1825 } |
| 1826 |
| 1819 #ifdef VERIFY_HEAP | 1827 #ifdef VERIFY_HEAP |
| 1820 // We do not use the SemiSpaceIterator because verification doesn't assume | 1828 // We do not use the SemiSpaceIterator because verification doesn't assume |
| 1821 // that it works (it depends on the invariants we are checking). | 1829 // that it works (it depends on the invariants we are checking). |
| 1822 void NewSpace::Verify() { | 1830 void NewSpace::Verify() { |
| 1823 // The allocation pointer should be in the space or at the very end. | 1831 // The allocation pointer should be in the space or at the very end. |
| 1824 DCHECK_SEMISPACE_ALLOCATION_INFO(allocation_info_, to_space_); | 1832 DCHECK_SEMISPACE_ALLOCATION_INFO(allocation_info_, to_space_); |
| 1825 | 1833 |
| 1826 // There should be objects packed in from the low address up to the | 1834 // There should be objects packed in from the low address up to the |
| 1827 // allocation pointer. | 1835 // allocation pointer. |
| 1828 Address current = to_space_.first_page()->area_start(); | 1836 Address current = to_space_.first_page()->area_start(); |
| (...skipping 253 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2082 | 2090 |
| 2083 void SemiSpace::set_age_mark(Address mark) { | 2091 void SemiSpace::set_age_mark(Address mark) { |
| 2084 DCHECK_EQ(Page::FromAllocationAreaAddress(mark)->owner(), this); | 2092 DCHECK_EQ(Page::FromAllocationAreaAddress(mark)->owner(), this); |
| 2085 age_mark_ = mark; | 2093 age_mark_ = mark; |
| 2086 // Mark all pages up to the one containing mark. | 2094 // Mark all pages up to the one containing mark. |
| 2087 for (Page* p : NewSpacePageRange(space_start(), mark)) { | 2095 for (Page* p : NewSpacePageRange(space_start(), mark)) { |
| 2088 p->SetFlag(MemoryChunk::NEW_SPACE_BELOW_AGE_MARK); | 2096 p->SetFlag(MemoryChunk::NEW_SPACE_BELOW_AGE_MARK); |
| 2089 } | 2097 } |
| 2090 } | 2098 } |
| 2091 | 2099 |
| 2100 std::unique_ptr<ObjectIterator> SemiSpace::GetObjectIterator() { |
| 2101 // Use the NewSpace::NewObjectIterator to iterate the ToSpace. |
| 2102 UNREACHABLE(); |
| 2103 return std::unique_ptr<ObjectIterator>(); |
| 2104 } |
| 2092 | 2105 |
| 2093 #ifdef DEBUG | 2106 #ifdef DEBUG |
| 2094 void SemiSpace::Print() {} | 2107 void SemiSpace::Print() {} |
| 2095 #endif | 2108 #endif |
| 2096 | 2109 |
| 2097 #ifdef VERIFY_HEAP | 2110 #ifdef VERIFY_HEAP |
| 2098 void SemiSpace::Verify() { | 2111 void SemiSpace::Verify() { |
| 2099 bool is_from_space = (id_ == kFromSpace); | 2112 bool is_from_space = (id_ == kFromSpace); |
| 2100 Page* page = anchor_.next_page(); | 2113 Page* page = anchor_.next_page(); |
| 2101 CHECK(anchor_.owner() == this); | 2114 CHECK(anchor_.owner() == this); |
| (...skipping 1032 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3134 Address address = object->address(); | 3147 Address address = object->address(); |
| 3135 MemoryChunk* chunk = MemoryChunk::FromAddress(address); | 3148 MemoryChunk* chunk = MemoryChunk::FromAddress(address); |
| 3136 | 3149 |
| 3137 bool owned = (chunk->owner() == this); | 3150 bool owned = (chunk->owner() == this); |
| 3138 | 3151 |
| 3139 SLOW_DCHECK(!owned || FindObject(address)->IsHeapObject()); | 3152 SLOW_DCHECK(!owned || FindObject(address)->IsHeapObject()); |
| 3140 | 3153 |
| 3141 return owned; | 3154 return owned; |
| 3142 } | 3155 } |
| 3143 | 3156 |
| 3157 std::unique_ptr<ObjectIterator> LargeObjectSpace::GetObjectIterator() { |
| 3158 return std::unique_ptr<ObjectIterator>(new LargeObjectIterator(this)); |
| 3159 } |
| 3144 | 3160 |
| 3145 #ifdef VERIFY_HEAP | 3161 #ifdef VERIFY_HEAP |
| 3146 // We do not assume that the large object iterator works, because it depends | 3162 // We do not assume that the large object iterator works, because it depends |
| 3147 // on the invariants we are checking during verification. | 3163 // on the invariants we are checking during verification. |
| 3148 void LargeObjectSpace::Verify() { | 3164 void LargeObjectSpace::Verify() { |
| 3149 for (LargePage* chunk = first_page_; chunk != NULL; | 3165 for (LargePage* chunk = first_page_; chunk != NULL; |
| 3150 chunk = chunk->next_page()) { | 3166 chunk = chunk->next_page()) { |
| 3151 // Each chunk contains an object that starts at the large object page's | 3167 // Each chunk contains an object that starts at the large object page's |
| 3152 // object area start. | 3168 // object area start. |
| 3153 HeapObject* object = chunk->GetObject(); | 3169 HeapObject* object = chunk->GetObject(); |
| (...skipping 81 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3235 object->ShortPrint(); | 3251 object->ShortPrint(); |
| 3236 PrintF("\n"); | 3252 PrintF("\n"); |
| 3237 } | 3253 } |
| 3238 printf(" --------------------------------------\n"); | 3254 printf(" --------------------------------------\n"); |
| 3239 printf(" Marked: %x, LiveCount: %x\n", mark_size, LiveBytes()); | 3255 printf(" Marked: %x, LiveCount: %x\n", mark_size, LiveBytes()); |
| 3240 } | 3256 } |
| 3241 | 3257 |
| 3242 #endif // DEBUG | 3258 #endif // DEBUG |
| 3243 } // namespace internal | 3259 } // namespace internal |
| 3244 } // namespace v8 | 3260 } // namespace v8 |
| OLD | NEW |