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