13ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch// Copyright 2011 the V8 project authors. All rights reserved. 2a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// Redistribution and use in source and binary forms, with or without 3a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// modification, are permitted provided that the following conditions are 4a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// met: 5a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// 6a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// * Redistributions of source code must retain the above copyright 7a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// notice, this list of conditions and the following disclaimer. 8a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// * Redistributions in binary form must reproduce the above 9a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// copyright notice, this list of conditions and the following 10a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// disclaimer in the documentation and/or other materials provided 11a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// with the distribution. 12a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// * Neither the name of Google Inc. nor the names of its 13a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// contributors may be used to endorse or promote products derived 14a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// from this software without specific prior written permission. 15a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// 16a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 17a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 18a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 19a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 20a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 21a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 22a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 23a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 24a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 25a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 26a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 27a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 28a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block#ifndef V8_SPACES_INL_H_ 29a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block#define V8_SPACES_INL_H_ 30a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 3144f0eee88ff00398ff7f715fab053374d808c90dSteve Block#include "isolate.h" 32a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block#include "spaces.h" 3344f0eee88ff00398ff7f715fab053374d808c90dSteve Block#include "v8memory.h" 34a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 35a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blocknamespace v8 { 36a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blocknamespace internal { 37a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 38a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 39a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// ----------------------------------------------------------------------------- 403ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch// Bitmap 41a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 423ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochvoid Bitmap::Clear(MemoryChunk* chunk) { 433ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch Bitmap* bitmap = chunk->markbits(); 443ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch for (int i = 0; i < bitmap->CellsCount(); i++) bitmap->cells()[i] = 0; 453ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch chunk->ResetLiveBytes(); 46a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 47a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 48a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 49a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// ----------------------------------------------------------------------------- 503ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch// PageIterator 51a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 527f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch 533ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochPageIterator::PageIterator(PagedSpace* space) 543ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch : space_(space), 553ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch prev_page_(&space->anchor_), 563ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch next_page_(prev_page_->next_page()) { } 577f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch 5885b71799222b55eb5dd74ea26efe0c64ab655c8cBen Murdoch 593ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochbool PageIterator::has_next() { 603ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return next_page_ != &space_->anchor_; 6185b71799222b55eb5dd74ea26efe0c64ab655c8cBen Murdoch} 627f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch 637f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch 643ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochPage* PageIterator::next() { 653ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch ASSERT(has_next()); 663ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch prev_page_ = next_page_; 673ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch next_page_ = next_page_->next_page(); 683ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return prev_page_; 6985b71799222b55eb5dd74ea26efe0c64ab655c8cBen Murdoch} 707f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch 717f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch 723ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch// ----------------------------------------------------------------------------- 733ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch// NewSpacePageIterator 747f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch 757f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch 763ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochNewSpacePageIterator::NewSpacePageIterator(NewSpace* space) 773ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch : prev_page_(NewSpacePage::FromAddress(space->ToSpaceStart())->prev_page()), 783ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch next_page_(NewSpacePage::FromAddress(space->ToSpaceStart())), 793ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch last_page_(NewSpacePage::FromLimit(space->ToSpaceEnd())) { } 807f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch 813ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochNewSpacePageIterator::NewSpacePageIterator(SemiSpace* space) 823ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch : prev_page_(space->anchor()), 833ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch next_page_(prev_page_->next_page()), 843ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch last_page_(prev_page_->prev_page()) { } 857f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch 863ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochNewSpacePageIterator::NewSpacePageIterator(Address start, Address limit) 873ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch : prev_page_(NewSpacePage::FromAddress(start)->prev_page()), 883ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch next_page_(NewSpacePage::FromAddress(start)), 893ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch last_page_(NewSpacePage::FromLimit(limit)) { 903ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch SemiSpace::AssertValidRange(start, limit); 917f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch} 927f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch 937f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch 943ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochbool NewSpacePageIterator::has_next() { 953ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return prev_page_ != last_page_; 9685b71799222b55eb5dd74ea26efe0c64ab655c8cBen Murdoch} 9785b71799222b55eb5dd74ea26efe0c64ab655c8cBen Murdoch 9885b71799222b55eb5dd74ea26efe0c64ab655c8cBen Murdoch 993ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochNewSpacePage* NewSpacePageIterator::next() { 1003ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch ASSERT(has_next()); 1013ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch prev_page_ = next_page_; 1023ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch next_page_ = next_page_->next_page(); 1033ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return prev_page_; 10485b71799222b55eb5dd74ea26efe0c64ab655c8cBen Murdoch} 10585b71799222b55eb5dd74ea26efe0c64ab655c8cBen Murdoch 10685b71799222b55eb5dd74ea26efe0c64ab655c8cBen Murdoch 1073ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch// ----------------------------------------------------------------------------- 1083ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch// HeapObjectIterator 1093ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochHeapObject* HeapObjectIterator::FromCurrentPage() { 1103ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch while (cur_addr_ != cur_end_) { 1113ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch if (cur_addr_ == space_->top() && cur_addr_ != space_->limit()) { 1123ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch cur_addr_ = space_->limit(); 1133ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch continue; 1143ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } 1153ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch HeapObject* obj = HeapObject::FromAddress(cur_addr_); 1163ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch int obj_size = (size_func_ == NULL) ? obj->Size() : size_func_(obj); 1173ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch cur_addr_ += obj_size; 1183ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch ASSERT(cur_addr_ <= cur_end_); 1193ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch if (!obj->IsFiller()) { 1203ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch ASSERT_OBJECT_SIZE(obj_size); 1213ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return obj; 1227f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch } 1237f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch } 1243ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return NULL; 1257f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch} 1267f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch 1277f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch 1283ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch// ----------------------------------------------------------------------------- 1293ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch// MemoryAllocator 1307f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch 1313ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch#ifdef ENABLE_HEAP_PROTECTION 132a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1333ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochvoid MemoryAllocator::Protect(Address start, size_t size) { 1343ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch OS::Protect(start, size); 135a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 136a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 137a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1383ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochvoid MemoryAllocator::Unprotect(Address start, 1393ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch size_t size, 1403ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch Executability executable) { 1413ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch OS::Unprotect(start, size, executable); 1423ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 14385b71799222b55eb5dd74ea26efe0c64ab655c8cBen Murdoch 14485b71799222b55eb5dd74ea26efe0c64ab655c8cBen Murdoch 1453ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochvoid MemoryAllocator::ProtectChunkFromPage(Page* page) { 1463ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch int id = GetChunkId(page); 1473ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch OS::Protect(chunks_[id].address(), chunks_[id].size()); 1487f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch} 1497f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch 1507f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch 1513ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochvoid MemoryAllocator::UnprotectChunkFromPage(Page* page) { 1523ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch int id = GetChunkId(page); 1533ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch OS::Unprotect(chunks_[id].address(), chunks_[id].size(), 1543ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch chunks_[id].owner()->executable() == EXECUTABLE); 1557f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch} 1567f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch 1573ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch#endif 1587f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch 1597f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch 1603ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch// -------------------------------------------------------------------------- 1613ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch// PagedSpace 1623ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochPage* Page::Initialize(Heap* heap, 1633ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch MemoryChunk* chunk, 1643ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch Executability executable, 1653ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch PagedSpace* owner) { 1663ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch Page* page = reinterpret_cast<Page*>(chunk); 1673ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch ASSERT(chunk->size() == static_cast<size_t>(kPageSize)); 1683ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch ASSERT(chunk->owner() == owner); 1693ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch owner->IncreaseCapacity(page->area_size()); 1703ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch owner->Free(page->area_start(), page->area_size()); 1717f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch 1723ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch heap->incremental_marking()->SetOldSpacePageFlags(chunk); 1737f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch 1743ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return page; 175a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 176a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 177a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1783ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochbool PagedSpace::Contains(Address addr) { 1793ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch Page* p = Page::FromAddress(addr); 1803ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch if (!p->is_valid()) return false; 1813ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return p->owner() == this; 1826ded16be15dd865a9b21ea304d5273c8be299c87Steve Block} 1836ded16be15dd865a9b21ea304d5273c8be299c87Steve Block 1846ded16be15dd865a9b21ea304d5273c8be299c87Steve Block 1853ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochvoid MemoryChunk::set_scan_on_scavenge(bool scan) { 1863ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch if (scan) { 1873ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch if (!scan_on_scavenge()) heap_->increment_scan_on_scavenge_pages(); 1883ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch SetFlag(SCAN_ON_SCAVENGE); 1896ded16be15dd865a9b21ea304d5273c8be299c87Steve Block } else { 1903ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch if (scan_on_scavenge()) heap_->decrement_scan_on_scavenge_pages(); 1913ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch ClearFlag(SCAN_ON_SCAVENGE); 1926ded16be15dd865a9b21ea304d5273c8be299c87Steve Block } 1933ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch heap_->incremental_marking()->SetOldSpacePageFlags(this); 1943ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 1953ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 1963ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 1973ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochMemoryChunk* MemoryChunk::FromAnyPointerAddress(Address addr) { 1983ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch MemoryChunk* maybe = reinterpret_cast<MemoryChunk*>( 1993ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch OffsetFrom(addr) & ~Page::kPageAlignmentMask); 2003ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch if (maybe->owner() != NULL) return maybe; 2013ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch LargeObjectIterator iterator(HEAP->lo_space()); 2023ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch for (HeapObject* o = iterator.Next(); o != NULL; o = iterator.Next()) { 2033ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch // Fixed arrays are the only pointer-containing objects in large object 2043ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch // space. 2053ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch if (o->IsFixedArray()) { 2063ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch MemoryChunk* chunk = MemoryChunk::FromAddress(o->address()); 2073ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch if (chunk->Contains(addr)) { 2083ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return chunk; 2093ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } 2103ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } 2117f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch } 2123ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch UNREACHABLE(); 2133ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return NULL; 2147f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch} 2157f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch 2167f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch 2173ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochPointerChunkIterator::PointerChunkIterator(Heap* heap) 2183ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch : state_(kOldPointerState), 2193ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch old_pointer_iterator_(heap->old_pointer_space()), 2203ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch map_iterator_(heap->map_space()), 2213ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch lo_iterator_(heap->lo_space()) { } 2226ded16be15dd865a9b21ea304d5273c8be299c87Steve Block 2236ded16be15dd865a9b21ea304d5273c8be299c87Steve Block 2243ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochPage* Page::next_page() { 2253ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch ASSERT(next_chunk()->owner() == owner()); 2263ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return static_cast<Page*>(next_chunk()); 22785b71799222b55eb5dd74ea26efe0c64ab655c8cBen Murdoch} 22885b71799222b55eb5dd74ea26efe0c64ab655c8cBen Murdoch 22985b71799222b55eb5dd74ea26efe0c64ab655c8cBen Murdoch 2303ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochPage* Page::prev_page() { 2313ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch ASSERT(prev_chunk()->owner() == owner()); 2323ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return static_cast<Page*>(prev_chunk()); 23385b71799222b55eb5dd74ea26efe0c64ab655c8cBen Murdoch} 23485b71799222b55eb5dd74ea26efe0c64ab655c8cBen Murdoch 23585b71799222b55eb5dd74ea26efe0c64ab655c8cBen Murdoch 2363ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochvoid Page::set_next_page(Page* page) { 2373ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch ASSERT(page->owner() == owner()); 2383ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch set_next_chunk(page); 23985b71799222b55eb5dd74ea26efe0c64ab655c8cBen Murdoch} 24085b71799222b55eb5dd74ea26efe0c64ab655c8cBen Murdoch 24185b71799222b55eb5dd74ea26efe0c64ab655c8cBen Murdoch 2423ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochvoid Page::set_prev_page(Page* page) { 2433ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch ASSERT(page->owner() == owner()); 2443ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch set_prev_chunk(page); 245b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch} 246b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 247b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 248a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// Try linear allocation in the page of alloc_info's allocation top. Does 2493ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch// not contain slow case logic (e.g. move to the next page or try free list 250a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// allocation) so it can be used by all the allocation functions and for all 251a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// the paged spaces. 2523ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochHeapObject* PagedSpace::AllocateLinearly(int size_in_bytes) { 2533ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch Address current_top = allocation_info_.top; 254a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block Address new_top = current_top + size_in_bytes; 2553ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch if (new_top > allocation_info_.limit) return NULL; 256a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 2573ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch allocation_info_.top = new_top; 258a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block return HeapObject::FromAddress(current_top); 259a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 260a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 261a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 262a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// Raw allocation. 2635913587db4c6bab03d97bfe44b06289fd6d7270dJohn ReckMaybeObject* PagedSpace::AllocateRaw(int size_in_bytes) { 2643ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch HeapObject* object = AllocateLinearly(size_in_bytes); 2653ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch if (object != NULL) { 2663ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch if (identity() == CODE_SPACE) { 2673ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch SkipList::Update(object->address(), size_in_bytes); 2683ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } 2693ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return object; 2703ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } 2713ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 2723ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch object = free_list_.Allocate(size_in_bytes); 2733ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch if (object != NULL) { 2743ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch if (identity() == CODE_SPACE) { 2753ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch SkipList::Update(object->address(), size_in_bytes); 2763ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } 2773ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return object; 2783ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } 279a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 280a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block object = SlowAllocateRaw(size_in_bytes); 2813ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch if (object != NULL) { 2823ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch if (identity() == CODE_SPACE) { 2833ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch SkipList::Update(object->address(), size_in_bytes); 2843ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } 2853ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return object; 2863ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } 287a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 288f87a203d89e1bbb6708282e0b64dbd13d59b723dBen Murdoch return Failure::RetryAfterGC(identity()); 289a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 290a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 291a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 2923ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch// ----------------------------------------------------------------------------- 2933ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch// NewSpace 294a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 295a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 2963ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochMaybeObject* NewSpace::AllocateRaw(int size_in_bytes) { 2973ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch Address old_top = allocation_info_.top; 2983ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch if (allocation_info_.limit - old_top < size_in_bytes) { 2993ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return SlowAllocateRaw(size_in_bytes); 3003ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } 3013ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block 3023ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch Object* obj = HeapObject::FromAddress(allocation_info_.top); 3033ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch allocation_info_.top += size_in_bytes; 3043ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch ASSERT_SEMISPACE_ALLOCATION_INFO(allocation_info_, to_space_); 30585b71799222b55eb5dd74ea26efe0c64ab655c8cBen Murdoch 30685b71799222b55eb5dd74ea26efe0c64ab655c8cBen Murdoch return obj; 307592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch} 308592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch 309592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch 3103ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochLargePage* LargePage::Initialize(Heap* heap, MemoryChunk* chunk) { 3113ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch heap->incremental_marking()->SetOldSpacePageFlags(chunk); 3123ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return static_cast<LargePage*>(chunk); 3133ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 3143ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 3153ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 31644f0eee88ff00398ff7f715fab053374d808c90dSteve Blockintptr_t LargeObjectSpace::Available() { 3173ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return ObjectSizeFor(heap()->isolate()->memory_allocator()->Available()); 31844f0eee88ff00398ff7f715fab053374d808c90dSteve Block} 31944f0eee88ff00398ff7f715fab053374d808c90dSteve Block 32044f0eee88ff00398ff7f715fab053374d808c90dSteve Block 321b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdochtemplate <typename StringType> 322b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdochvoid NewSpace::ShrinkStringAtAllocationBoundary(String* string, int length) { 323b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch ASSERT(length <= string->length()); 324b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch ASSERT(string->IsSeqString()); 325b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch ASSERT(string->address() + StringType::SizeFor(string->length()) == 326b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch allocation_info_.top); 3273ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch Address old_top = allocation_info_.top; 328b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch allocation_info_.top = 329b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch string->address() + StringType::SizeFor(length); 330b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch string->set_length(length); 3313ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch if (Marking::IsBlack(Marking::MarkBitFrom(string))) { 3323ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch int delta = static_cast<int>(old_top - allocation_info_.top); 3333ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch MemoryChunk::IncrementLiveBytesFromMutator(string->address(), -delta); 3343ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } 335b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch} 336b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 337b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 3383ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Blockbool FreeListNode::IsFreeListNode(HeapObject* object) { 3393ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch Map* map = object->map(); 3403ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch Heap* heap = object->GetHeap(); 3413ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return map == heap->raw_unchecked_free_space_map() 3423ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch || map == heap->raw_unchecked_one_pointer_filler_map() 3433ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch || map == heap->raw_unchecked_two_pointer_filler_map(); 3443ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block} 3453ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block 346a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} } // namespace v8::internal 347a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 348a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block#endif // V8_SPACES_INL_H_ 349