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