1c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com// Copyright 2011 the V8 project authors. All rights reserved. 23484964a86451e86dcf04be9bd8c0d76ee04f081rossberg@chromium.org// Use of this source code is governed by a BSD-style license that can be 33484964a86451e86dcf04be9bd8c0d76ee04f081rossberg@chromium.org// found in the LICENSE file. 443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 53e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.org#ifndef V8_HEAP_SPACES_INL_H_ 63e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.org#define V8_HEAP_SPACES_INL_H_ 743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 83e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.org#include "src/heap/spaces.h" 9196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org#include "src/heap-profiler.h" 10196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org#include "src/isolate.h" 11f1a5a1dc668380a183184ee7629703846eefcfaemachenbach@chromium.org#include "src/msan.h" 12196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org#include "src/v8memory.h" 1343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 1471affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.orgnamespace v8 { 1571affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.orgnamespace internal { 1643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 1743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 1843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// ----------------------------------------------------------------------------- 19c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com// Bitmap 2043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 21c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.comvoid Bitmap::Clear(MemoryChunk* chunk) { 22c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com Bitmap* bitmap = chunk->markbits(); 23c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com for (int i = 0; i < bitmap->CellsCount(); i++) bitmap->cells()[i] = 0; 24c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com chunk->ResetLiveBytes(); 2543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen} 2643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 2743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 2843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// ----------------------------------------------------------------------------- 29c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com// PageIterator 3043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 3130ce411529579186181838984710b0b0980857aaricow@chromium.org 32c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.comPageIterator::PageIterator(PagedSpace* space) 33c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com : space_(space), 34c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com prev_page_(&space->anchor_), 353e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.org next_page_(prev_page_->next_page()) {} 3643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 3730ce411529579186181838984710b0b0980857aaricow@chromium.org 383e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.orgbool PageIterator::has_next() { return next_page_ != &space_->anchor_; } 3943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 4043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 41c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.comPage* PageIterator::next() { 42e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(has_next()); 43c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com prev_page_ = next_page_; 44c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com next_page_ = next_page_->next_page(); 45c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com return prev_page_; 4630ce411529579186181838984710b0b0980857aaricow@chromium.org} 4743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 4830ce411529579186181838984710b0b0980857aaricow@chromium.org 49c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com// ----------------------------------------------------------------------------- 50c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com// NewSpacePageIterator 5130ce411529579186181838984710b0b0980857aaricow@chromium.org 5230ce411529579186181838984710b0b0980857aaricow@chromium.org 53c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.comNewSpacePageIterator::NewSpacePageIterator(NewSpace* space) 54c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com : prev_page_(NewSpacePage::FromAddress(space->ToSpaceStart())->prev_page()), 55c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com next_page_(NewSpacePage::FromAddress(space->ToSpaceStart())), 563e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.org last_page_(NewSpacePage::FromLimit(space->ToSpaceEnd())) {} 5743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 58c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.comNewSpacePageIterator::NewSpacePageIterator(SemiSpace* space) 59c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com : prev_page_(space->anchor()), 60c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com next_page_(prev_page_->next_page()), 613e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.org last_page_(prev_page_->prev_page()) {} 6243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 63c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.comNewSpacePageIterator::NewSpacePageIterator(Address start, Address limit) 64c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com : prev_page_(NewSpacePage::FromAddress(start)->prev_page()), 65c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com next_page_(NewSpacePage::FromAddress(start)), 66c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com last_page_(NewSpacePage::FromLimit(limit)) { 67c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com SemiSpace::AssertValidRange(start, limit); 6830ce411529579186181838984710b0b0980857aaricow@chromium.org} 6930ce411529579186181838984710b0b0980857aaricow@chromium.org 7030ce411529579186181838984710b0b0980857aaricow@chromium.org 713e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.orgbool NewSpacePageIterator::has_next() { return prev_page_ != last_page_; } 7230ce411529579186181838984710b0b0980857aaricow@chromium.org 7330ce411529579186181838984710b0b0980857aaricow@chromium.org 74c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.comNewSpacePage* NewSpacePageIterator::next() { 75e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(has_next()); 76c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com prev_page_ = next_page_; 77c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com next_page_ = next_page_->next_page(); 78c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com return prev_page_; 7930ce411529579186181838984710b0b0980857aaricow@chromium.org} 8030ce411529579186181838984710b0b0980857aaricow@chromium.org 8130ce411529579186181838984710b0b0980857aaricow@chromium.org 82c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com// ----------------------------------------------------------------------------- 83c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com// HeapObjectIterator 84c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.comHeapObject* HeapObjectIterator::FromCurrentPage() { 85c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com while (cur_addr_ != cur_end_) { 86c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com if (cur_addr_ == space_->top() && cur_addr_ != space_->limit()) { 87c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com cur_addr_ = space_->limit(); 88c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com continue; 89c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com } 90c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com HeapObject* obj = HeapObject::FromAddress(cur_addr_); 91c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com int obj_size = (size_func_ == NULL) ? obj->Size() : size_func_(obj); 92c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com cur_addr_ += obj_size; 93e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(cur_addr_ <= cur_end_); 94c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com if (!obj->IsFiller()) { 95e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK_OBJECT_SIZE(obj_size); 96c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com return obj; 972cc82ae439960d1adaf4374e093730dc23945d59ager@chromium.org } 982cc82ae439960d1adaf4374e093730dc23945d59ager@chromium.org } 99c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com return NULL; 1002cc82ae439960d1adaf4374e093730dc23945d59ager@chromium.org} 1012cc82ae439960d1adaf4374e093730dc23945d59ager@chromium.org 1022cc82ae439960d1adaf4374e093730dc23945d59ager@chromium.org 103c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com// ----------------------------------------------------------------------------- 104c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com// MemoryAllocator 10530ce411529579186181838984710b0b0980857aaricow@chromium.org 106c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com#ifdef ENABLE_HEAP_PROTECTION 10730ce411529579186181838984710b0b0980857aaricow@chromium.org 108c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.comvoid MemoryAllocator::Protect(Address start, size_t size) { 1095de0074a922429f5e0ec2cf140c2d2989bf88140yangguo@chromium.org base::OS::Protect(start, size); 11030ce411529579186181838984710b0b0980857aaricow@chromium.org} 11130ce411529579186181838984710b0b0980857aaricow@chromium.org 11230ce411529579186181838984710b0b0980857aaricow@chromium.org 1133e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.orgvoid MemoryAllocator::Unprotect(Address start, size_t size, 114c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com Executability executable) { 1155de0074a922429f5e0ec2cf140c2d2989bf88140yangguo@chromium.org base::OS::Unprotect(start, size, executable); 116c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com} 11730ce411529579186181838984710b0b0980857aaricow@chromium.org 11830ce411529579186181838984710b0b0980857aaricow@chromium.org 119c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.comvoid MemoryAllocator::ProtectChunkFromPage(Page* page) { 120c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com int id = GetChunkId(page); 1215de0074a922429f5e0ec2cf140c2d2989bf88140yangguo@chromium.org base::OS::Protect(chunks_[id].address(), chunks_[id].size()); 12230ce411529579186181838984710b0b0980857aaricow@chromium.org} 12330ce411529579186181838984710b0b0980857aaricow@chromium.org 12430ce411529579186181838984710b0b0980857aaricow@chromium.org 125c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.comvoid MemoryAllocator::UnprotectChunkFromPage(Page* page) { 126c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com int id = GetChunkId(page); 1275de0074a922429f5e0ec2cf140c2d2989bf88140yangguo@chromium.org base::OS::Unprotect(chunks_[id].address(), chunks_[id].size(), 1285de0074a922429f5e0ec2cf140c2d2989bf88140yangguo@chromium.org chunks_[id].owner()->executable() == EXECUTABLE); 12930ce411529579186181838984710b0b0980857aaricow@chromium.org} 13030ce411529579186181838984710b0b0980857aaricow@chromium.org 131c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com#endif 13230ce411529579186181838984710b0b0980857aaricow@chromium.org 13330ce411529579186181838984710b0b0980857aaricow@chromium.org 134c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com// -------------------------------------------------------------------------- 135c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com// PagedSpace 1363e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.orgPage* Page::Initialize(Heap* heap, MemoryChunk* chunk, Executability executable, 137c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com PagedSpace* owner) { 138c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com Page* page = reinterpret_cast<Page*>(chunk); 139e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(page->area_size() <= kMaxRegularHeapObjectSize); 140e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(chunk->owner() == owner); 141ab30bb83bf3dae0053739c57b1db9ad13c1f9e3ayangguo@chromium.org owner->IncreaseCapacity(page->area_size()); 142ab30bb83bf3dae0053739c57b1db9ad13c1f9e3ayangguo@chromium.org owner->Free(page->area_start(), page->area_size()); 14330ce411529579186181838984710b0b0980857aaricow@chromium.org 144c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com heap->incremental_marking()->SetOldSpacePageFlags(chunk); 14530ce411529579186181838984710b0b0980857aaricow@chromium.org 146c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com return page; 14743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen} 14843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 14943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 150c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.combool PagedSpace::Contains(Address addr) { 151c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com Page* p = Page::FromAddress(addr); 152c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com if (!p->is_valid()) return false; 153c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com return p->owner() == this; 154013f3e12d3af426bf5545b5f457aa08ee98bdca2fschneider@chromium.org} 155013f3e12d3af426bf5545b5f457aa08ee98bdca2fschneider@chromium.org 156013f3e12d3af426bf5545b5f457aa08ee98bdca2fschneider@chromium.org 157c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.comvoid MemoryChunk::set_scan_on_scavenge(bool scan) { 158c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com if (scan) { 159c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com if (!scan_on_scavenge()) heap_->increment_scan_on_scavenge_pages(); 160c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com SetFlag(SCAN_ON_SCAVENGE); 161013f3e12d3af426bf5545b5f457aa08ee98bdca2fschneider@chromium.org } else { 162c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com if (scan_on_scavenge()) heap_->decrement_scan_on_scavenge_pages(); 163c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com ClearFlag(SCAN_ON_SCAVENGE); 164013f3e12d3af426bf5545b5f457aa08ee98bdca2fschneider@chromium.org } 165c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com heap_->incremental_marking()->SetOldSpacePageFlags(this); 166c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com} 167c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com 168c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com 169c5d4971574b7a205fa0e788d8121dc79485e5e67hpayer@chromium.orgMemoryChunk* MemoryChunk::FromAnyPointerAddress(Heap* heap, Address addr) { 170c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com MemoryChunk* maybe = reinterpret_cast<MemoryChunk*>( 171c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com OffsetFrom(addr) & ~Page::kPageAlignmentMask); 172c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com if (maybe->owner() != NULL) return maybe; 173c5d4971574b7a205fa0e788d8121dc79485e5e67hpayer@chromium.org LargeObjectIterator iterator(heap->lo_space()); 174c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com for (HeapObject* o = iterator.Next(); o != NULL; o = iterator.Next()) { 175c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com // Fixed arrays are the only pointer-containing objects in large object 176c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com // space. 177c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com if (o->IsFixedArray()) { 178c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com MemoryChunk* chunk = MemoryChunk::FromAddress(o->address()); 179c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com if (chunk->Contains(addr)) { 180c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com return chunk; 181c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com } 182c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com } 18330ce411529579186181838984710b0b0980857aaricow@chromium.org } 184c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com UNREACHABLE(); 185c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com return NULL; 18643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen} 18743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 18843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 18972204d59e7fb1b8a0e9012e1fac5ef160351e8e4danno@chromium.orgvoid MemoryChunk::UpdateHighWaterMark(Address mark) { 19072204d59e7fb1b8a0e9012e1fac5ef160351e8e4danno@chromium.org if (mark == NULL) return; 19172204d59e7fb1b8a0e9012e1fac5ef160351e8e4danno@chromium.org // Need to subtract one from the mark because when a chunk is full the 19272204d59e7fb1b8a0e9012e1fac5ef160351e8e4danno@chromium.org // top points to the next address after the chunk, which effectively belongs 19372204d59e7fb1b8a0e9012e1fac5ef160351e8e4danno@chromium.org // to another chunk. See the comment to Page::FromAllocationTop. 19472204d59e7fb1b8a0e9012e1fac5ef160351e8e4danno@chromium.org MemoryChunk* chunk = MemoryChunk::FromAddress(mark - 1); 19572204d59e7fb1b8a0e9012e1fac5ef160351e8e4danno@chromium.org int new_mark = static_cast<int>(mark - chunk->address()); 19672204d59e7fb1b8a0e9012e1fac5ef160351e8e4danno@chromium.org if (new_mark > chunk->high_water_mark_) { 19772204d59e7fb1b8a0e9012e1fac5ef160351e8e4danno@chromium.org chunk->high_water_mark_ = new_mark; 19872204d59e7fb1b8a0e9012e1fac5ef160351e8e4danno@chromium.org } 19972204d59e7fb1b8a0e9012e1fac5ef160351e8e4danno@chromium.org} 20072204d59e7fb1b8a0e9012e1fac5ef160351e8e4danno@chromium.org 20172204d59e7fb1b8a0e9012e1fac5ef160351e8e4danno@chromium.org 202c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.comPointerChunkIterator::PointerChunkIterator(Heap* heap) 203c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com : state_(kOldPointerState), 204c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com old_pointer_iterator_(heap->old_pointer_space()), 205c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com map_iterator_(heap->map_space()), 2063e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.org lo_iterator_(heap->lo_space()) {} 20743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 20843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 209c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.comPage* Page::next_page() { 210e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(next_chunk()->owner() == owner()); 211c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com return static_cast<Page*>(next_chunk()); 21243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen} 21343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 21443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 215c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.comPage* Page::prev_page() { 216e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(prev_chunk()->owner() == owner()); 217c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com return static_cast<Page*>(prev_chunk()); 21843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen} 21943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 22043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 221c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.comvoid Page::set_next_page(Page* page) { 222e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(page->owner() == owner()); 223c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com set_next_chunk(page); 22443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen} 22543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 22643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 227c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.comvoid Page::set_prev_page(Page* page) { 228e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(page->owner() == owner()); 229c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com set_prev_chunk(page); 230a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org} 231a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 232a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 2337276f14ca716596e0a0d17539516370c1f453847kasper.lund// Try linear allocation in the page of alloc_info's allocation top. Does 2342efb900e7350b14be905abdeab077f3a64c583cfulan@chromium.org// not contain slow case logic (e.g. move to the next page or try free list 2357276f14ca716596e0a0d17539516370c1f453847kasper.lund// allocation) so it can be used by all the allocation functions and for all 2367276f14ca716596e0a0d17539516370c1f453847kasper.lund// the paged spaces. 237c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.comHeapObject* PagedSpace::AllocateLinearly(int size_in_bytes) { 238ef33a5482a35a9a25f702f8e3f02bb6b49f3854cjkummerow@chromium.org Address current_top = allocation_info_.top(); 2397276f14ca716596e0a0d17539516370c1f453847kasper.lund Address new_top = current_top + size_in_bytes; 240ef33a5482a35a9a25f702f8e3f02bb6b49f3854cjkummerow@chromium.org if (new_top > allocation_info_.limit()) return NULL; 2417276f14ca716596e0a0d17539516370c1f453847kasper.lund 242ef33a5482a35a9a25f702f8e3f02bb6b49f3854cjkummerow@chromium.org allocation_info_.set_top(new_top); 2437276f14ca716596e0a0d17539516370c1f453847kasper.lund return HeapObject::FromAddress(current_top); 2447276f14ca716596e0a0d17539516370c1f453847kasper.lund} 2457276f14ca716596e0a0d17539516370c1f453847kasper.lund 2467276f14ca716596e0a0d17539516370c1f453847kasper.lund 2477276f14ca716596e0a0d17539516370c1f453847kasper.lund// Raw allocation. 248a86d416fb652b1936026eee315eccd4f17ca1002machenbach@chromium.orgAllocationResult PagedSpace::AllocateRaw(int size_in_bytes) { 249c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com HeapObject* object = AllocateLinearly(size_in_bytes); 250c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com 2514b0feeef5d01dbc2948080b4f69daa37e1083461machenbach@chromium.org if (object == NULL) { 2524b0feeef5d01dbc2948080b4f69daa37e1083461machenbach@chromium.org object = free_list_.Allocate(size_in_bytes); 2534b0feeef5d01dbc2948080b4f69daa37e1083461machenbach@chromium.org if (object == NULL) { 2544b0feeef5d01dbc2948080b4f69daa37e1083461machenbach@chromium.org object = SlowAllocateRaw(size_in_bytes); 255c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com } 256c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com } 2577276f14ca716596e0a0d17539516370c1f453847kasper.lund 258c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com if (object != NULL) { 259c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com if (identity() == CODE_SPACE) { 260c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com SkipList::Update(object->address(), size_in_bytes); 261c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com } 262f1a5a1dc668380a183184ee7629703846eefcfaemachenbach@chromium.org MSAN_ALLOCATED_UNINITIALIZED_MEMORY(object->address(), size_in_bytes); 263c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com return object; 264c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com } 2657276f14ca716596e0a0d17539516370c1f453847kasper.lund 266a86d416fb652b1936026eee315eccd4f17ca1002machenbach@chromium.org return AllocationResult::Retry(identity()); 2677276f14ca716596e0a0d17539516370c1f453847kasper.lund} 2687276f14ca716596e0a0d17539516370c1f453847kasper.lund 2697276f14ca716596e0a0d17539516370c1f453847kasper.lund 270c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com// ----------------------------------------------------------------------------- 271c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com// NewSpace 272c612e0211bdb8821cbd7886e15b0273ed82d2e9edanno@chromium.org 273c612e0211bdb8821cbd7886e15b0273ed82d2e9edanno@chromium.org 274a86d416fb652b1936026eee315eccd4f17ca1002machenbach@chromium.orgAllocationResult NewSpace::AllocateRaw(int size_in_bytes) { 275ef33a5482a35a9a25f702f8e3f02bb6b49f3854cjkummerow@chromium.org Address old_top = allocation_info_.top(); 276efdb9d70bddd496ceb6a281dadcc065efbce37a1yangguo@chromium.org 277ef33a5482a35a9a25f702f8e3f02bb6b49f3854cjkummerow@chromium.org if (allocation_info_.limit() - old_top < size_in_bytes) { 278c612e0211bdb8821cbd7886e15b0273ed82d2e9edanno@chromium.org return SlowAllocateRaw(size_in_bytes); 279c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com } 2807276f14ca716596e0a0d17539516370c1f453847kasper.lund 281a2e1a40f85577979749d4c0d6de30e992d996659mstarzinger@chromium.org HeapObject* obj = HeapObject::FromAddress(old_top); 282ef33a5482a35a9a25f702f8e3f02bb6b49f3854cjkummerow@chromium.org allocation_info_.set_top(allocation_info_.top() + size_in_bytes); 283e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK_SEMISPACE_ALLOCATION_INFO(allocation_info_, to_space_); 2847276f14ca716596e0a0d17539516370c1f453847kasper.lund 285f1a5a1dc668380a183184ee7629703846eefcfaemachenbach@chromium.org // The slow path above ultimately goes through AllocateRaw, so this suffices. 286f1a5a1dc668380a183184ee7629703846eefcfaemachenbach@chromium.org MSAN_ALLOCATED_UNINITIALIZED_MEMORY(obj->address(), size_in_bytes); 287f1a5a1dc668380a183184ee7629703846eefcfaemachenbach@chromium.org 288c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com return obj; 2897276f14ca716596e0a0d17539516370c1f453847kasper.lund} 2907276f14ca716596e0a0d17539516370c1f453847kasper.lund 2917276f14ca716596e0a0d17539516370c1f453847kasper.lund 292c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.comLargePage* LargePage::Initialize(Heap* heap, MemoryChunk* chunk) { 293c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com heap->incremental_marking()->SetOldSpacePageFlags(chunk); 294c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com return static_cast<LargePage*>(chunk); 29543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen} 29643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 2973811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.org 298ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.orgintptr_t LargeObjectSpace::Available() { 299c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com return ObjectSizeFor(heap()->isolate()->memory_allocator()->Available()); 300ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org} 301ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org 302ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org 3033811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.orgbool FreeListNode::IsFreeListNode(HeapObject* object) { 304c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com Map* map = object->map(); 305c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com Heap* heap = object->GetHeap(); 3063e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.org return map == heap->raw_unchecked_free_space_map() || 3073e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.org map == heap->raw_unchecked_one_pointer_filler_map() || 3083e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.org map == heap->raw_unchecked_two_pointer_filler_map(); 3093811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.org} 3103e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.org} 3113e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.org} // namespace v8::internal 3123811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.org 3133e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.org#endif // V8_HEAP_SPACES_INL_H_ 314