1c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com// Copyright 2011 the V8 project authors. All rights reserved.
29a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com// Redistribution and use in source and binary forms, with or without
39a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com// modification, are permitted provided that the following conditions are
49a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com// met:
59a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com//
69a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com//     * Redistributions of source code must retain the above copyright
79a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com//       notice, this list of conditions and the following disclaimer.
89a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com//     * Redistributions in binary form must reproduce the above
99a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com//       copyright notice, this list of conditions and the following
109a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com//       disclaimer in the documentation and/or other materials provided
119a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com//       with the distribution.
129a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com//     * Neither the name of Google Inc. nor the names of its
139a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com//       contributors may be used to endorse or promote products derived
149a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com//       from this software without specific prior written permission.
159a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com//
169a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
179a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
189a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
199a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
209a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
219a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
229a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
239a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
249a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
259a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
269a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
279a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
289a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com#include <stdlib.h>
299a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
305de0074a922429f5e0ec2cf140c2d2989bf88140yangguo@chromium.org#include "src/snapshot.h"
31196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org#include "src/v8.h"
32196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org#include "test/cctest/cctest.h"
339a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
345de0074a922429f5e0ec2cf140c2d2989bf88140yangguo@chromium.org
359a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.comusing namespace v8::internal;
369a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
37c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com#if 0
3830ce411529579186181838984710b0b0980857aaricow@chromium.orgstatic void VerifyRegionMarking(Address page_start) {
39c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com#ifdef ENABLE_CARDMARKING_WRITE_BARRIER
409a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  Page* p = Page::FromAddress(page_start);
419a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
4230ce411529579186181838984710b0b0980857aaricow@chromium.org  p->SetRegionMarks(Page::kAllRegionsCleanMarks);
439a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
449a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  for (Address addr = p->ObjectAreaStart();
459a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com       addr < p->ObjectAreaEnd();
469a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com       addr += kPointerSize) {
4730ce411529579186181838984710b0b0980857aaricow@chromium.org    CHECK(!Page::FromAddress(addr)->IsRegionDirty(addr));
489a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  }
499a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
509a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  for (Address addr = p->ObjectAreaStart();
519a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com       addr < p->ObjectAreaEnd();
529a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com       addr += kPointerSize) {
5330ce411529579186181838984710b0b0980857aaricow@chromium.org    Page::FromAddress(addr)->MarkRegionDirty(addr);
549a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  }
559a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
569a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  for (Address addr = p->ObjectAreaStart();
579a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com       addr < p->ObjectAreaEnd();
589a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com       addr += kPointerSize) {
5930ce411529579186181838984710b0b0980857aaricow@chromium.org    CHECK(Page::FromAddress(addr)->IsRegionDirty(addr));
609a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  }
61c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com#endif
629a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com}
63c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com#endif
649a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
659a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
66c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com// TODO(gc) you can no longer allocate pages like this. Details are hidden.
67c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com#if 0
689a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.comTEST(Page) {
699a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  byte* mem = NewArray<byte>(2*Page::kPageSize);
709a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  CHECK(mem != NULL);
719a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
729a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  Address start = reinterpret_cast<Address>(mem);
739a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  Address page_start = RoundUp(start, Page::kPageSize);
749a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
759a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  Page* p = Page::FromAddress(page_start);
76ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  // Initialized Page has heap pointer, normally set by memory_allocator.
77528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org  p->heap_ = CcTest::heap();
789a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  CHECK(p->address() == page_start);
799a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  CHECK(p->is_valid());
809a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
819a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  p->opaque_header = 0;
82013f3e12d3af426bf5545b5f457aa08ee98bdca2fschneider@chromium.org  p->SetIsLargeObjectPage(false);
839a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  CHECK(!p->next_page()->is_valid());
849a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
859a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  CHECK(p->ObjectAreaStart() == page_start + Page::kObjectStartOffset);
869a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  CHECK(p->ObjectAreaEnd() == page_start + Page::kPageSize);
879a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
889a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  CHECK(p->Offset(page_start + Page::kObjectStartOffset) ==
899a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com        Page::kObjectStartOffset);
909a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  CHECK(p->Offset(page_start + Page::kPageSize) == Page::kPageSize);
919a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
929a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  CHECK(p->OffsetToAddress(Page::kObjectStartOffset) == p->ObjectAreaStart());
939a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  CHECK(p->OffsetToAddress(Page::kPageSize) == p->ObjectAreaEnd());
949a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
9530ce411529579186181838984710b0b0980857aaricow@chromium.org  // test region marking
9630ce411529579186181838984710b0b0980857aaricow@chromium.org  VerifyRegionMarking(page_start);
979a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
989a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  DeleteArray(mem);
999a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com}
100c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com#endif
1019a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
1029a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
1037c2628c3f0353f0558760c3ca442f934263ea766kmillikin@chromium.orgnamespace v8 {
1047c2628c3f0353f0558760c3ca442f934263ea766kmillikin@chromium.orgnamespace internal {
1057c2628c3f0353f0558760c3ca442f934263ea766kmillikin@chromium.org
1067c2628c3f0353f0558760c3ca442f934263ea766kmillikin@chromium.org// Temporarily sets a given allocator in an isolate.
1077c2628c3f0353f0558760c3ca442f934263ea766kmillikin@chromium.orgclass TestMemoryAllocatorScope {
1087c2628c3f0353f0558760c3ca442f934263ea766kmillikin@chromium.org public:
1097c2628c3f0353f0558760c3ca442f934263ea766kmillikin@chromium.org  TestMemoryAllocatorScope(Isolate* isolate, MemoryAllocator* allocator)
1107c2628c3f0353f0558760c3ca442f934263ea766kmillikin@chromium.org      : isolate_(isolate),
1117c2628c3f0353f0558760c3ca442f934263ea766kmillikin@chromium.org        old_allocator_(isolate->memory_allocator_) {
1127c2628c3f0353f0558760c3ca442f934263ea766kmillikin@chromium.org    isolate->memory_allocator_ = allocator;
1137c2628c3f0353f0558760c3ca442f934263ea766kmillikin@chromium.org  }
1147c2628c3f0353f0558760c3ca442f934263ea766kmillikin@chromium.org
1157c2628c3f0353f0558760c3ca442f934263ea766kmillikin@chromium.org  ~TestMemoryAllocatorScope() {
1167c2628c3f0353f0558760c3ca442f934263ea766kmillikin@chromium.org    isolate_->memory_allocator_ = old_allocator_;
1177c2628c3f0353f0558760c3ca442f934263ea766kmillikin@chromium.org  }
1187c2628c3f0353f0558760c3ca442f934263ea766kmillikin@chromium.org
1197c2628c3f0353f0558760c3ca442f934263ea766kmillikin@chromium.org private:
1207c2628c3f0353f0558760c3ca442f934263ea766kmillikin@chromium.org  Isolate* isolate_;
1217c2628c3f0353f0558760c3ca442f934263ea766kmillikin@chromium.org  MemoryAllocator* old_allocator_;
1227c2628c3f0353f0558760c3ca442f934263ea766kmillikin@chromium.org
1237c2628c3f0353f0558760c3ca442f934263ea766kmillikin@chromium.org  DISALLOW_COPY_AND_ASSIGN(TestMemoryAllocatorScope);
1247c2628c3f0353f0558760c3ca442f934263ea766kmillikin@chromium.org};
1257c2628c3f0353f0558760c3ca442f934263ea766kmillikin@chromium.org
126068ea0a6ea115c058d1d9798029bd7fa1eaaa955mstarzinger@chromium.org
127068ea0a6ea115c058d1d9798029bd7fa1eaaa955mstarzinger@chromium.org// Temporarily sets a given code range in an isolate.
128068ea0a6ea115c058d1d9798029bd7fa1eaaa955mstarzinger@chromium.orgclass TestCodeRangeScope {
129068ea0a6ea115c058d1d9798029bd7fa1eaaa955mstarzinger@chromium.org public:
130068ea0a6ea115c058d1d9798029bd7fa1eaaa955mstarzinger@chromium.org  TestCodeRangeScope(Isolate* isolate, CodeRange* code_range)
131068ea0a6ea115c058d1d9798029bd7fa1eaaa955mstarzinger@chromium.org      : isolate_(isolate),
132068ea0a6ea115c058d1d9798029bd7fa1eaaa955mstarzinger@chromium.org        old_code_range_(isolate->code_range_) {
133068ea0a6ea115c058d1d9798029bd7fa1eaaa955mstarzinger@chromium.org    isolate->code_range_ = code_range;
134068ea0a6ea115c058d1d9798029bd7fa1eaaa955mstarzinger@chromium.org  }
135068ea0a6ea115c058d1d9798029bd7fa1eaaa955mstarzinger@chromium.org
136068ea0a6ea115c058d1d9798029bd7fa1eaaa955mstarzinger@chromium.org  ~TestCodeRangeScope() {
137068ea0a6ea115c058d1d9798029bd7fa1eaaa955mstarzinger@chromium.org    isolate_->code_range_ = old_code_range_;
138068ea0a6ea115c058d1d9798029bd7fa1eaaa955mstarzinger@chromium.org  }
139068ea0a6ea115c058d1d9798029bd7fa1eaaa955mstarzinger@chromium.org
140068ea0a6ea115c058d1d9798029bd7fa1eaaa955mstarzinger@chromium.org private:
141068ea0a6ea115c058d1d9798029bd7fa1eaaa955mstarzinger@chromium.org  Isolate* isolate_;
142068ea0a6ea115c058d1d9798029bd7fa1eaaa955mstarzinger@chromium.org  CodeRange* old_code_range_;
143068ea0a6ea115c058d1d9798029bd7fa1eaaa955mstarzinger@chromium.org
144068ea0a6ea115c058d1d9798029bd7fa1eaaa955mstarzinger@chromium.org  DISALLOW_COPY_AND_ASSIGN(TestCodeRangeScope);
145068ea0a6ea115c058d1d9798029bd7fa1eaaa955mstarzinger@chromium.org};
146068ea0a6ea115c058d1d9798029bd7fa1eaaa955mstarzinger@chromium.org
1477c2628c3f0353f0558760c3ca442f934263ea766kmillikin@chromium.org} }  // namespace v8::internal
1487c2628c3f0353f0558760c3ca442f934263ea766kmillikin@chromium.org
1497c2628c3f0353f0558760c3ca442f934263ea766kmillikin@chromium.org
150068ea0a6ea115c058d1d9798029bd7fa1eaaa955mstarzinger@chromium.orgstatic void VerifyMemoryChunk(Isolate* isolate,
151068ea0a6ea115c058d1d9798029bd7fa1eaaa955mstarzinger@chromium.org                              Heap* heap,
152068ea0a6ea115c058d1d9798029bd7fa1eaaa955mstarzinger@chromium.org                              CodeRange* code_range,
153068ea0a6ea115c058d1d9798029bd7fa1eaaa955mstarzinger@chromium.org                              size_t reserve_area_size,
154068ea0a6ea115c058d1d9798029bd7fa1eaaa955mstarzinger@chromium.org                              size_t commit_area_size,
155068ea0a6ea115c058d1d9798029bd7fa1eaaa955mstarzinger@chromium.org                              size_t second_commit_area_size,
156068ea0a6ea115c058d1d9798029bd7fa1eaaa955mstarzinger@chromium.org                              Executability executable) {
157068ea0a6ea115c058d1d9798029bd7fa1eaaa955mstarzinger@chromium.org  MemoryAllocator* memory_allocator = new MemoryAllocator(isolate);
158068ea0a6ea115c058d1d9798029bd7fa1eaaa955mstarzinger@chromium.org  CHECK(memory_allocator->SetUp(heap->MaxReserved(),
159068ea0a6ea115c058d1d9798029bd7fa1eaaa955mstarzinger@chromium.org                                heap->MaxExecutableSize()));
160068ea0a6ea115c058d1d9798029bd7fa1eaaa955mstarzinger@chromium.org  TestMemoryAllocatorScope test_allocator_scope(isolate, memory_allocator);
161068ea0a6ea115c058d1d9798029bd7fa1eaaa955mstarzinger@chromium.org  TestCodeRangeScope test_code_range_scope(isolate, code_range);
162068ea0a6ea115c058d1d9798029bd7fa1eaaa955mstarzinger@chromium.org
163068ea0a6ea115c058d1d9798029bd7fa1eaaa955mstarzinger@chromium.org  size_t header_size = (executable == EXECUTABLE)
164068ea0a6ea115c058d1d9798029bd7fa1eaaa955mstarzinger@chromium.org                       ? MemoryAllocator::CodePageGuardStartOffset()
165068ea0a6ea115c058d1d9798029bd7fa1eaaa955mstarzinger@chromium.org                       : MemoryChunk::kObjectStartOffset;
166068ea0a6ea115c058d1d9798029bd7fa1eaaa955mstarzinger@chromium.org  size_t guard_size = (executable == EXECUTABLE)
167068ea0a6ea115c058d1d9798029bd7fa1eaaa955mstarzinger@chromium.org                       ? MemoryAllocator::CodePageGuardSize()
168068ea0a6ea115c058d1d9798029bd7fa1eaaa955mstarzinger@chromium.org                       : 0;
169068ea0a6ea115c058d1d9798029bd7fa1eaaa955mstarzinger@chromium.org
170068ea0a6ea115c058d1d9798029bd7fa1eaaa955mstarzinger@chromium.org  MemoryChunk* memory_chunk = memory_allocator->AllocateChunk(reserve_area_size,
171068ea0a6ea115c058d1d9798029bd7fa1eaaa955mstarzinger@chromium.org                                                              commit_area_size,
172068ea0a6ea115c058d1d9798029bd7fa1eaaa955mstarzinger@chromium.org                                                              executable,
173068ea0a6ea115c058d1d9798029bd7fa1eaaa955mstarzinger@chromium.org                                                              NULL);
1741845eb0120c7a870d7388de091246a7d1b48a4f8machenbach@chromium.org  size_t alignment = code_range != NULL && code_range->valid() ?
1755de0074a922429f5e0ec2cf140c2d2989bf88140yangguo@chromium.org                     MemoryChunk::kAlignment : v8::base::OS::CommitPageSize();
1765de0074a922429f5e0ec2cf140c2d2989bf88140yangguo@chromium.org  size_t reserved_size =
1775de0074a922429f5e0ec2cf140c2d2989bf88140yangguo@chromium.org      ((executable == EXECUTABLE))
1785de0074a922429f5e0ec2cf140c2d2989bf88140yangguo@chromium.org          ? RoundUp(header_size + guard_size + reserve_area_size + guard_size,
1795de0074a922429f5e0ec2cf140c2d2989bf88140yangguo@chromium.org                    alignment)
1805de0074a922429f5e0ec2cf140c2d2989bf88140yangguo@chromium.org          : RoundUp(header_size + reserve_area_size,
1815de0074a922429f5e0ec2cf140c2d2989bf88140yangguo@chromium.org                    v8::base::OS::CommitPageSize());
182068ea0a6ea115c058d1d9798029bd7fa1eaaa955mstarzinger@chromium.org  CHECK(memory_chunk->size() == reserved_size);
183068ea0a6ea115c058d1d9798029bd7fa1eaaa955mstarzinger@chromium.org  CHECK(memory_chunk->area_start() < memory_chunk->address() +
184068ea0a6ea115c058d1d9798029bd7fa1eaaa955mstarzinger@chromium.org                                     memory_chunk->size());
185068ea0a6ea115c058d1d9798029bd7fa1eaaa955mstarzinger@chromium.org  CHECK(memory_chunk->area_end() <= memory_chunk->address() +
186068ea0a6ea115c058d1d9798029bd7fa1eaaa955mstarzinger@chromium.org                                    memory_chunk->size());
187068ea0a6ea115c058d1d9798029bd7fa1eaaa955mstarzinger@chromium.org  CHECK(static_cast<size_t>(memory_chunk->area_size()) == commit_area_size);
188068ea0a6ea115c058d1d9798029bd7fa1eaaa955mstarzinger@chromium.org
189068ea0a6ea115c058d1d9798029bd7fa1eaaa955mstarzinger@chromium.org  Address area_start = memory_chunk->area_start();
190068ea0a6ea115c058d1d9798029bd7fa1eaaa955mstarzinger@chromium.org
191068ea0a6ea115c058d1d9798029bd7fa1eaaa955mstarzinger@chromium.org  memory_chunk->CommitArea(second_commit_area_size);
192068ea0a6ea115c058d1d9798029bd7fa1eaaa955mstarzinger@chromium.org  CHECK(area_start == memory_chunk->area_start());
193068ea0a6ea115c058d1d9798029bd7fa1eaaa955mstarzinger@chromium.org  CHECK(memory_chunk->area_start() < memory_chunk->address() +
194068ea0a6ea115c058d1d9798029bd7fa1eaaa955mstarzinger@chromium.org                                     memory_chunk->size());
195068ea0a6ea115c058d1d9798029bd7fa1eaaa955mstarzinger@chromium.org  CHECK(memory_chunk->area_end() <= memory_chunk->address() +
196068ea0a6ea115c058d1d9798029bd7fa1eaaa955mstarzinger@chromium.org                                    memory_chunk->size());
197068ea0a6ea115c058d1d9798029bd7fa1eaaa955mstarzinger@chromium.org  CHECK(static_cast<size_t>(memory_chunk->area_size()) ==
198068ea0a6ea115c058d1d9798029bd7fa1eaaa955mstarzinger@chromium.org      second_commit_area_size);
199068ea0a6ea115c058d1d9798029bd7fa1eaaa955mstarzinger@chromium.org
200068ea0a6ea115c058d1d9798029bd7fa1eaaa955mstarzinger@chromium.org  memory_allocator->Free(memory_chunk);
201068ea0a6ea115c058d1d9798029bd7fa1eaaa955mstarzinger@chromium.org  memory_allocator->TearDown();
202fa7f914e3bacba481b13da5cf2bc4c935567ebc4machenbach@chromium.org  delete memory_allocator;
203fa7f914e3bacba481b13da5cf2bc4c935567ebc4machenbach@chromium.org}
204fa7f914e3bacba481b13da5cf2bc4c935567ebc4machenbach@chromium.org
205fa7f914e3bacba481b13da5cf2bc4c935567ebc4machenbach@chromium.org
206fa7f914e3bacba481b13da5cf2bc4c935567ebc4machenbach@chromium.orgTEST(Regress3540) {
207fa7f914e3bacba481b13da5cf2bc4c935567ebc4machenbach@chromium.org  Isolate* isolate = CcTest::i_isolate();
208fa7f914e3bacba481b13da5cf2bc4c935567ebc4machenbach@chromium.org  Heap* heap = isolate->heap();
209fa7f914e3bacba481b13da5cf2bc4c935567ebc4machenbach@chromium.org  MemoryAllocator* memory_allocator = new MemoryAllocator(isolate);
210fa7f914e3bacba481b13da5cf2bc4c935567ebc4machenbach@chromium.org  CHECK(
211fa7f914e3bacba481b13da5cf2bc4c935567ebc4machenbach@chromium.org      memory_allocator->SetUp(heap->MaxReserved(), heap->MaxExecutableSize()));
212fa7f914e3bacba481b13da5cf2bc4c935567ebc4machenbach@chromium.org  TestMemoryAllocatorScope test_allocator_scope(isolate, memory_allocator);
213fa7f914e3bacba481b13da5cf2bc4c935567ebc4machenbach@chromium.org  CodeRange* code_range = new CodeRange(isolate);
214fa7f914e3bacba481b13da5cf2bc4c935567ebc4machenbach@chromium.org  const size_t code_range_size = 4 * MB;
215fa7f914e3bacba481b13da5cf2bc4c935567ebc4machenbach@chromium.org  if (!code_range->SetUp(code_range_size)) return;
216fa7f914e3bacba481b13da5cf2bc4c935567ebc4machenbach@chromium.org  Address address;
217fa7f914e3bacba481b13da5cf2bc4c935567ebc4machenbach@chromium.org  size_t size;
218fa7f914e3bacba481b13da5cf2bc4c935567ebc4machenbach@chromium.org  address = code_range->AllocateRawMemory(code_range_size - MB,
219fa7f914e3bacba481b13da5cf2bc4c935567ebc4machenbach@chromium.org                                          code_range_size - MB, &size);
220fa7f914e3bacba481b13da5cf2bc4c935567ebc4machenbach@chromium.org  CHECK(address != NULL);
221fa7f914e3bacba481b13da5cf2bc4c935567ebc4machenbach@chromium.org  Address null_address;
222fa7f914e3bacba481b13da5cf2bc4c935567ebc4machenbach@chromium.org  size_t null_size;
223fa7f914e3bacba481b13da5cf2bc4c935567ebc4machenbach@chromium.org  null_address = code_range->AllocateRawMemory(
224fa7f914e3bacba481b13da5cf2bc4c935567ebc4machenbach@chromium.org      code_range_size - MB, code_range_size - MB, &null_size);
225fa7f914e3bacba481b13da5cf2bc4c935567ebc4machenbach@chromium.org  CHECK(null_address == NULL);
226fa7f914e3bacba481b13da5cf2bc4c935567ebc4machenbach@chromium.org  code_range->FreeRawMemory(address, size);
227fa7f914e3bacba481b13da5cf2bc4c935567ebc4machenbach@chromium.org  delete code_range;
228fa7f914e3bacba481b13da5cf2bc4c935567ebc4machenbach@chromium.org  memory_allocator->TearDown();
229068ea0a6ea115c058d1d9798029bd7fa1eaaa955mstarzinger@chromium.org  delete memory_allocator;
230068ea0a6ea115c058d1d9798029bd7fa1eaaa955mstarzinger@chromium.org}
231068ea0a6ea115c058d1d9798029bd7fa1eaaa955mstarzinger@chromium.org
232068ea0a6ea115c058d1d9798029bd7fa1eaaa955mstarzinger@chromium.org
233068ea0a6ea115c058d1d9798029bd7fa1eaaa955mstarzinger@chromium.orgstatic unsigned int Pseudorandom() {
234068ea0a6ea115c058d1d9798029bd7fa1eaaa955mstarzinger@chromium.org  static uint32_t lo = 2345;
235068ea0a6ea115c058d1d9798029bd7fa1eaaa955mstarzinger@chromium.org  lo = 18273 * (lo & 0xFFFFF) + (lo >> 16);
236068ea0a6ea115c058d1d9798029bd7fa1eaaa955mstarzinger@chromium.org  return lo & 0xFFFFF;
237068ea0a6ea115c058d1d9798029bd7fa1eaaa955mstarzinger@chromium.org}
238068ea0a6ea115c058d1d9798029bd7fa1eaaa955mstarzinger@chromium.org
239068ea0a6ea115c058d1d9798029bd7fa1eaaa955mstarzinger@chromium.org
240068ea0a6ea115c058d1d9798029bd7fa1eaaa955mstarzinger@chromium.orgTEST(MemoryChunk) {
241528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org  Isolate* isolate = CcTest::i_isolate();
242068ea0a6ea115c058d1d9798029bd7fa1eaaa955mstarzinger@chromium.org  Heap* heap = isolate->heap();
243068ea0a6ea115c058d1d9798029bd7fa1eaaa955mstarzinger@chromium.org
244068ea0a6ea115c058d1d9798029bd7fa1eaaa955mstarzinger@chromium.org  size_t reserve_area_size = 1 * MB;
245068ea0a6ea115c058d1d9798029bd7fa1eaaa955mstarzinger@chromium.org  size_t initial_commit_area_size, second_commit_area_size;
246068ea0a6ea115c058d1d9798029bd7fa1eaaa955mstarzinger@chromium.org
247068ea0a6ea115c058d1d9798029bd7fa1eaaa955mstarzinger@chromium.org  for (int i = 0; i < 100; i++) {
248068ea0a6ea115c058d1d9798029bd7fa1eaaa955mstarzinger@chromium.org    initial_commit_area_size = Pseudorandom();
249068ea0a6ea115c058d1d9798029bd7fa1eaaa955mstarzinger@chromium.org    second_commit_area_size = Pseudorandom();
250068ea0a6ea115c058d1d9798029bd7fa1eaaa955mstarzinger@chromium.org
251068ea0a6ea115c058d1d9798029bd7fa1eaaa955mstarzinger@chromium.org    // With CodeRange.
252068ea0a6ea115c058d1d9798029bd7fa1eaaa955mstarzinger@chromium.org    CodeRange* code_range = new CodeRange(isolate);
25370ec1a2160dd946b9578d04d97d631a6d4ab4f8cbmeurer@chromium.org    const size_t code_range_size = 32 * MB;
254068ea0a6ea115c058d1d9798029bd7fa1eaaa955mstarzinger@chromium.org    if (!code_range->SetUp(code_range_size)) return;
255068ea0a6ea115c058d1d9798029bd7fa1eaaa955mstarzinger@chromium.org
256068ea0a6ea115c058d1d9798029bd7fa1eaaa955mstarzinger@chromium.org    VerifyMemoryChunk(isolate,
257068ea0a6ea115c058d1d9798029bd7fa1eaaa955mstarzinger@chromium.org                      heap,
258068ea0a6ea115c058d1d9798029bd7fa1eaaa955mstarzinger@chromium.org                      code_range,
259068ea0a6ea115c058d1d9798029bd7fa1eaaa955mstarzinger@chromium.org                      reserve_area_size,
260068ea0a6ea115c058d1d9798029bd7fa1eaaa955mstarzinger@chromium.org                      initial_commit_area_size,
261068ea0a6ea115c058d1d9798029bd7fa1eaaa955mstarzinger@chromium.org                      second_commit_area_size,
262068ea0a6ea115c058d1d9798029bd7fa1eaaa955mstarzinger@chromium.org                      EXECUTABLE);
263068ea0a6ea115c058d1d9798029bd7fa1eaaa955mstarzinger@chromium.org
264068ea0a6ea115c058d1d9798029bd7fa1eaaa955mstarzinger@chromium.org    VerifyMemoryChunk(isolate,
265068ea0a6ea115c058d1d9798029bd7fa1eaaa955mstarzinger@chromium.org                      heap,
266068ea0a6ea115c058d1d9798029bd7fa1eaaa955mstarzinger@chromium.org                      code_range,
267068ea0a6ea115c058d1d9798029bd7fa1eaaa955mstarzinger@chromium.org                      reserve_area_size,
268068ea0a6ea115c058d1d9798029bd7fa1eaaa955mstarzinger@chromium.org                      initial_commit_area_size,
269068ea0a6ea115c058d1d9798029bd7fa1eaaa955mstarzinger@chromium.org                      second_commit_area_size,
270068ea0a6ea115c058d1d9798029bd7fa1eaaa955mstarzinger@chromium.org                      NOT_EXECUTABLE);
271068ea0a6ea115c058d1d9798029bd7fa1eaaa955mstarzinger@chromium.org    delete code_range;
272068ea0a6ea115c058d1d9798029bd7fa1eaaa955mstarzinger@chromium.org
273068ea0a6ea115c058d1d9798029bd7fa1eaaa955mstarzinger@chromium.org    // Without CodeRange.
274068ea0a6ea115c058d1d9798029bd7fa1eaaa955mstarzinger@chromium.org    code_range = NULL;
275068ea0a6ea115c058d1d9798029bd7fa1eaaa955mstarzinger@chromium.org    VerifyMemoryChunk(isolate,
276068ea0a6ea115c058d1d9798029bd7fa1eaaa955mstarzinger@chromium.org                      heap,
277068ea0a6ea115c058d1d9798029bd7fa1eaaa955mstarzinger@chromium.org                      code_range,
278068ea0a6ea115c058d1d9798029bd7fa1eaaa955mstarzinger@chromium.org                      reserve_area_size,
279068ea0a6ea115c058d1d9798029bd7fa1eaaa955mstarzinger@chromium.org                      initial_commit_area_size,
280068ea0a6ea115c058d1d9798029bd7fa1eaaa955mstarzinger@chromium.org                      second_commit_area_size,
281068ea0a6ea115c058d1d9798029bd7fa1eaaa955mstarzinger@chromium.org                      EXECUTABLE);
282068ea0a6ea115c058d1d9798029bd7fa1eaaa955mstarzinger@chromium.org
283068ea0a6ea115c058d1d9798029bd7fa1eaaa955mstarzinger@chromium.org    VerifyMemoryChunk(isolate,
284068ea0a6ea115c058d1d9798029bd7fa1eaaa955mstarzinger@chromium.org                      heap,
285068ea0a6ea115c058d1d9798029bd7fa1eaaa955mstarzinger@chromium.org                      code_range,
286068ea0a6ea115c058d1d9798029bd7fa1eaaa955mstarzinger@chromium.org                      reserve_area_size,
287068ea0a6ea115c058d1d9798029bd7fa1eaaa955mstarzinger@chromium.org                      initial_commit_area_size,
288068ea0a6ea115c058d1d9798029bd7fa1eaaa955mstarzinger@chromium.org                      second_commit_area_size,
289068ea0a6ea115c058d1d9798029bd7fa1eaaa955mstarzinger@chromium.org                      NOT_EXECUTABLE);
290068ea0a6ea115c058d1d9798029bd7fa1eaaa955mstarzinger@chromium.org  }
291068ea0a6ea115c058d1d9798029bd7fa1eaaa955mstarzinger@chromium.org}
292068ea0a6ea115c058d1d9798029bd7fa1eaaa955mstarzinger@chromium.org
293068ea0a6ea115c058d1d9798029bd7fa1eaaa955mstarzinger@chromium.org
2949a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.comTEST(MemoryAllocator) {
295528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org  Isolate* isolate = CcTest::i_isolate();
2967c2628c3f0353f0558760c3ca442f934263ea766kmillikin@chromium.org  Heap* heap = isolate->heap();
297c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com
2987c2628c3f0353f0558760c3ca442f934263ea766kmillikin@chromium.org  MemoryAllocator* memory_allocator = new MemoryAllocator(isolate);
299f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com  CHECK(memory_allocator->SetUp(heap->MaxReserved(),
3007c2628c3f0353f0558760c3ca442f934263ea766kmillikin@chromium.org                                heap->MaxExecutableSize()));
3017c2628c3f0353f0558760c3ca442f934263ea766kmillikin@chromium.org
302c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com  int total_pages = 0;
3037c2628c3f0353f0558760c3ca442f934263ea766kmillikin@chromium.org  OldSpace faked_space(heap,
3047c2628c3f0353f0558760c3ca442f934263ea766kmillikin@chromium.org                       heap->MaxReserved(),
305ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org                       OLD_POINTER_SPACE,
306ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org                       NOT_EXECUTABLE);
3077d10be581a91ab5eefa1139ff0b86c64ac8f6e59fschneider@chromium.org  Page* first_page = memory_allocator->AllocatePage(
3087d10be581a91ab5eefa1139ff0b86c64ac8f6e59fschneider@chromium.org      faked_space.AreaSize(), &faked_space, NOT_EXECUTABLE);
309c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com
310c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com  first_page->InsertAfter(faked_space.anchor()->prev_page());
3119a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  CHECK(first_page->is_valid());
312c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com  CHECK(first_page->next_page() == faked_space.anchor());
313c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com  total_pages++;
3149a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
315c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com  for (Page* p = first_page; p != faked_space.anchor(); p = p->next_page()) {
316c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com    CHECK(p->owner() == &faked_space);
3179a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  }
3189a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
319a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  // Again, we should get n or n - 1 pages.
3207d10be581a91ab5eefa1139ff0b86c64ac8f6e59fschneider@chromium.org  Page* other = memory_allocator->AllocatePage(
3217d10be581a91ab5eefa1139ff0b86c64ac8f6e59fschneider@chromium.org      faked_space.AreaSize(), &faked_space, NOT_EXECUTABLE);
322c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com  CHECK(other->is_valid());
323c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com  total_pages++;
324c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com  other->InsertAfter(first_page);
3259a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  int page_count = 0;
326c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com  for (Page* p = first_page; p != faked_space.anchor(); p = p->next_page()) {
327c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com    CHECK(p->owner() == &faked_space);
3289a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com    page_count++;
3299a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  }
3309a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  CHECK(total_pages == page_count);
3319a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
3329a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  Page* second_page = first_page->next_page();
3339a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  CHECK(second_page->is_valid());
334c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com  memory_allocator->Free(first_page);
335c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com  memory_allocator->Free(second_page);
3367c2628c3f0353f0558760c3ca442f934263ea766kmillikin@chromium.org  memory_allocator->TearDown();
3377c2628c3f0353f0558760c3ca442f934263ea766kmillikin@chromium.org  delete memory_allocator;
3389a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com}
3399a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
3409a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
3419a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.comTEST(NewSpace) {
342528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org  Isolate* isolate = CcTest::i_isolate();
3437c2628c3f0353f0558760c3ca442f934263ea766kmillikin@chromium.org  Heap* heap = isolate->heap();
3447c2628c3f0353f0558760c3ca442f934263ea766kmillikin@chromium.org  MemoryAllocator* memory_allocator = new MemoryAllocator(isolate);
345f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com  CHECK(memory_allocator->SetUp(heap->MaxReserved(),
3467c2628c3f0353f0558760c3ca442f934263ea766kmillikin@chromium.org                                heap->MaxExecutableSize()));
3477c2628c3f0353f0558760c3ca442f934263ea766kmillikin@chromium.org  TestMemoryAllocatorScope test_scope(isolate, memory_allocator);
3489a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
3497c2628c3f0353f0558760c3ca442f934263ea766kmillikin@chromium.org  NewSpace new_space(heap);
3509a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
351528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org  CHECK(new_space.SetUp(CcTest::heap()->ReservedSemiSpaceSize(),
352528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org                        CcTest::heap()->ReservedSemiSpaceSize()));
353f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com  CHECK(new_space.HasBeenSetUp());
3549a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
355ef9a2b9208396fda21c01fdff922975fe35d9c4amachenbach@chromium.org  while (new_space.Available() >= Page::kMaxRegularHeapObjectSize) {
356a86d416fb652b1936026eee315eccd4f17ca1002machenbach@chromium.org    Object* obj = new_space.AllocateRaw(
357a86d416fb652b1936026eee315eccd4f17ca1002machenbach@chromium.org        Page::kMaxRegularHeapObjectSize).ToObjectChecked();
3585a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org    CHECK(new_space.Contains(HeapObject::cast(obj)));
3599a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  }
3609a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
3615a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org  new_space.TearDown();
3627c2628c3f0353f0558760c3ca442f934263ea766kmillikin@chromium.org  memory_allocator->TearDown();
3637c2628c3f0353f0558760c3ca442f934263ea766kmillikin@chromium.org  delete memory_allocator;
3649a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com}
3659a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
3669a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
3679a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.comTEST(OldSpace) {
368528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org  Isolate* isolate = CcTest::i_isolate();
3697c2628c3f0353f0558760c3ca442f934263ea766kmillikin@chromium.org  Heap* heap = isolate->heap();
3707c2628c3f0353f0558760c3ca442f934263ea766kmillikin@chromium.org  MemoryAllocator* memory_allocator = new MemoryAllocator(isolate);
371f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com  CHECK(memory_allocator->SetUp(heap->MaxReserved(),
3727c2628c3f0353f0558760c3ca442f934263ea766kmillikin@chromium.org                                heap->MaxExecutableSize()));
3737c2628c3f0353f0558760c3ca442f934263ea766kmillikin@chromium.org  TestMemoryAllocatorScope test_scope(isolate, memory_allocator);
3747c2628c3f0353f0558760c3ca442f934263ea766kmillikin@chromium.org
3757c2628c3f0353f0558760c3ca442f934263ea766kmillikin@chromium.org  OldSpace* s = new OldSpace(heap,
3767c2628c3f0353f0558760c3ca442f934263ea766kmillikin@chromium.org                             heap->MaxOldGenerationSize(),
3779258b6bc66e09368ada54001f619d53b4fc976d5ager@chromium.org                             OLD_POINTER_SPACE,
3789258b6bc66e09368ada54001f619d53b4fc976d5ager@chromium.org                             NOT_EXECUTABLE);
3799a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  CHECK(s != NULL);
3809a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
381f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com  CHECK(s->SetUp());
3829a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
3839a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  while (s->Available() > 0) {
384a86d416fb652b1936026eee315eccd4f17ca1002machenbach@chromium.org    s->AllocateRaw(Page::kMaxRegularHeapObjectSize).ToObjectChecked();
3859a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  }
3869a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
3879a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  s->TearDown();
3889a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  delete s;
3897c2628c3f0353f0558760c3ca442f934263ea766kmillikin@chromium.org  memory_allocator->TearDown();
3907c2628c3f0353f0558760c3ca442f934263ea766kmillikin@chromium.org  delete memory_allocator;
3919a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com}
3929a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
3939a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
3949a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.comTEST(LargeObjectSpace) {
3957c2628c3f0353f0558760c3ca442f934263ea766kmillikin@chromium.org  v8::V8::Initialize();
3969a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
397528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org  LargeObjectSpace* lo = CcTest::heap()->lo_space();
3989a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  CHECK(lo != NULL);
3999a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
4009a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  int lo_size = Page::kPageSize;
4019a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
402a86d416fb652b1936026eee315eccd4f17ca1002machenbach@chromium.org  Object* obj = lo->AllocateRaw(lo_size, NOT_EXECUTABLE).ToObjectChecked();
4039a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  CHECK(obj->IsHeapObject());
4049a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
4059a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  HeapObject* ho = HeapObject::cast(obj);
4069a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
4079a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  CHECK(lo->Contains(HeapObject::cast(obj)));
4089a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
4099a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  CHECK(lo->FindObject(ho->address()) == obj);
4109a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
4119a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  CHECK(lo->Contains(ho));
4129a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
4139a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  while (true) {
414f05f2913e034b9332e55c02c9395e701725c02c1kmillikin@chromium.org    intptr_t available = lo->Available();
415a86d416fb652b1936026eee315eccd4f17ca1002machenbach@chromium.org    { AllocationResult allocation = lo->AllocateRaw(lo_size, NOT_EXECUTABLE);
416a86d416fb652b1936026eee315eccd4f17ca1002machenbach@chromium.org      if (allocation.IsRetry()) break;
417303ada708275d2d425b846fb237f1ba7598ee239lrn@chromium.org    }
4189a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com    CHECK(lo->Available() < available);
4193c3c8d733702cb2b41471efa5eead1faf5b5711bmachenbach@chromium.org  }
4209a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
4219a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  CHECK(!lo->IsEmpty());
4229a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
423a86d416fb652b1936026eee315eccd4f17ca1002machenbach@chromium.org  CHECK(lo->AllocateRaw(lo_size, NOT_EXECUTABLE).IsRetry());
4249a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com}
425528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org
426528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org
427528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.orgTEST(SizeOfFirstPageIsLargeEnough) {
428528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org  if (i::FLAG_always_opt) return;
4295de0074a922429f5e0ec2cf140c2d2989bf88140yangguo@chromium.org  // Bootstrapping without a snapshot causes more allocations.
4305de0074a922429f5e0ec2cf140c2d2989bf88140yangguo@chromium.org  if (!i::Snapshot::HaveASnapshotToStartFrom()) return;
431528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org  CcTest::InitializeVM();
432528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org  Isolate* isolate = CcTest::i_isolate();
433528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org
434528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org  // Freshly initialized VM gets by with one page per space.
435528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org  for (int i = FIRST_PAGED_SPACE; i <= LAST_PAGED_SPACE; i++) {
4363c3c8d733702cb2b41471efa5eead1faf5b5711bmachenbach@chromium.org    // Debug code can be very large, so skip CODE_SPACE if we are generating it.
4373c3c8d733702cb2b41471efa5eead1faf5b5711bmachenbach@chromium.org    if (i == CODE_SPACE && i::FLAG_debug_code) continue;
438528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org    CHECK_EQ(1, isolate->heap()->paged_space(i)->CountTotalPages());
439528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org  }
440528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org
441528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org  // Executing the empty script gets by with one page per space.
442528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org  HandleScope scope(isolate);
443528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org  CompileRun("/*empty*/");
444528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org  for (int i = FIRST_PAGED_SPACE; i <= LAST_PAGED_SPACE; i++) {
4453c3c8d733702cb2b41471efa5eead1faf5b5711bmachenbach@chromium.org    // Debug code can be very large, so skip CODE_SPACE if we are generating it.
4463c3c8d733702cb2b41471efa5eead1faf5b5711bmachenbach@chromium.org    if (i == CODE_SPACE && i::FLAG_debug_code) continue;
447528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org    CHECK_EQ(1, isolate->heap()->paged_space(i)->CountTotalPages());
448528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org  }
449528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org
450528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org  // No large objects required to perform the above steps.
451528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org  CHECK(isolate->heap()->lo_space()->IsEmpty());
452528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org}
453