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