Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(75)

Side by Side Diff: test/cctest/heap/test-spaces.cc

Issue 1862653002: Move MemoryAllocator and CodeRange into Heap (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: Rebase Created 4 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « src/x64/assembler-x64-inl.h ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2011 the V8 project authors. All rights reserved. 1 // Copyright 2011 the V8 project authors. All rights reserved.
2 // Redistribution and use in source and binary forms, with or without 2 // Redistribution and use in source and binary forms, with or without
3 // modification, are permitted provided that the following conditions are 3 // modification, are permitted provided that the following conditions are
4 // met: 4 // met:
5 // 5 //
6 // * Redistributions of source code must retain the above copyright 6 // * Redistributions of source code must retain the above copyright
7 // notice, this list of conditions and the following disclaimer. 7 // notice, this list of conditions and the following disclaimer.
8 // * Redistributions in binary form must reproduce the above 8 // * Redistributions in binary form must reproduce the above
9 // copyright notice, this list of conditions and the following 9 // copyright notice, this list of conditions and the following
10 // disclaimer in the documentation and/or other materials provided 10 // disclaimer in the documentation and/or other materials provided
(...skipping 89 matching lines...) Expand 10 before | Expand all | Expand 10 after
100 100
101 DeleteArray(mem); 101 DeleteArray(mem);
102 } 102 }
103 #endif 103 #endif
104 104
105 105
106 // Temporarily sets a given allocator in an isolate. 106 // Temporarily sets a given allocator in an isolate.
107 class TestMemoryAllocatorScope { 107 class TestMemoryAllocatorScope {
108 public: 108 public:
109 TestMemoryAllocatorScope(Isolate* isolate, MemoryAllocator* allocator) 109 TestMemoryAllocatorScope(Isolate* isolate, MemoryAllocator* allocator)
110 : isolate_(isolate), 110 : isolate_(isolate), old_allocator_(isolate->heap()->memory_allocator()) {
111 old_allocator_(isolate->memory_allocator_) { 111 isolate->heap()->memory_allocator_ = allocator;
112 isolate->memory_allocator_ = allocator;
113 } 112 }
114 113
115 ~TestMemoryAllocatorScope() { 114 ~TestMemoryAllocatorScope() {
116 isolate_->memory_allocator_ = old_allocator_; 115 isolate_->heap()->memory_allocator_ = old_allocator_;
117 } 116 }
118 117
119 private: 118 private:
120 Isolate* isolate_; 119 Isolate* isolate_;
121 MemoryAllocator* old_allocator_; 120 MemoryAllocator* old_allocator_;
122 121
123 DISALLOW_COPY_AND_ASSIGN(TestMemoryAllocatorScope); 122 DISALLOW_COPY_AND_ASSIGN(TestMemoryAllocatorScope);
124 }; 123 };
125 124
126 125
127 // Temporarily sets a given code range in an isolate. 126 // Temporarily sets a given code range in an isolate.
128 class TestCodeRangeScope { 127 class TestCodeRangeScope {
129 public: 128 public:
130 TestCodeRangeScope(Isolate* isolate, CodeRange* code_range) 129 TestCodeRangeScope(Isolate* isolate, CodeRange* code_range)
131 : isolate_(isolate), 130 : isolate_(isolate),
132 old_code_range_(isolate->code_range_) { 131 old_code_range_(isolate->heap()->memory_allocator()->code_range()) {
133 isolate->code_range_ = code_range; 132 isolate->heap()->memory_allocator()->code_range_ = code_range;
134 } 133 }
135 134
136 ~TestCodeRangeScope() { 135 ~TestCodeRangeScope() {
137 isolate_->code_range_ = old_code_range_; 136 isolate_->heap()->memory_allocator()->code_range_ = old_code_range_;
138 } 137 }
139 138
140 private: 139 private:
141 Isolate* isolate_; 140 Isolate* isolate_;
142 CodeRange* old_code_range_; 141 CodeRange* old_code_range_;
143 142
144 DISALLOW_COPY_AND_ASSIGN(TestCodeRangeScope); 143 DISALLOW_COPY_AND_ASSIGN(TestCodeRangeScope);
145 }; 144 };
146 145
147 146
148 static void VerifyMemoryChunk(Isolate* isolate, 147 static void VerifyMemoryChunk(Isolate* isolate,
149 Heap* heap, 148 Heap* heap,
150 CodeRange* code_range, 149 CodeRange* code_range,
151 size_t reserve_area_size, 150 size_t reserve_area_size,
152 size_t commit_area_size, 151 size_t commit_area_size,
153 size_t second_commit_area_size, 152 size_t second_commit_area_size,
154 Executability executable) { 153 Executability executable) {
155 MemoryAllocator* memory_allocator = new MemoryAllocator(isolate); 154 MemoryAllocator* memory_allocator = new MemoryAllocator(isolate);
156 CHECK(memory_allocator->SetUp(heap->MaxReserved(), 155 CHECK(memory_allocator->SetUp(heap->MaxReserved(), heap->MaxExecutableSize(),
157 heap->MaxExecutableSize())); 156 0));
158 TestMemoryAllocatorScope test_allocator_scope(isolate, memory_allocator); 157 {
159 TestCodeRangeScope test_code_range_scope(isolate, code_range); 158 TestMemoryAllocatorScope test_allocator_scope(isolate, memory_allocator);
159 TestCodeRangeScope test_code_range_scope(isolate, code_range);
160 160
161 size_t header_size = (executable == EXECUTABLE) 161 size_t header_size = (executable == EXECUTABLE)
162 ? MemoryAllocator::CodePageGuardStartOffset() 162 ? MemoryAllocator::CodePageGuardStartOffset()
163 : MemoryChunk::kObjectStartOffset; 163 : MemoryChunk::kObjectStartOffset;
164 size_t guard_size = (executable == EXECUTABLE) 164 size_t guard_size =
165 ? MemoryAllocator::CodePageGuardSize() 165 (executable == EXECUTABLE) ? MemoryAllocator::CodePageGuardSize() : 0;
166 : 0;
167 166
168 MemoryChunk* memory_chunk = memory_allocator->AllocateChunk(reserve_area_size, 167 MemoryChunk* memory_chunk = memory_allocator->AllocateChunk(
169 commit_area_size, 168 reserve_area_size, commit_area_size, executable, NULL);
170 executable, 169 size_t alignment = code_range != NULL && code_range->valid()
171 NULL); 170 ? MemoryChunk::kAlignment
172 size_t alignment = code_range != NULL && code_range->valid() 171 : base::OS::CommitPageSize();
173 ? MemoryChunk::kAlignment 172 size_t reserved_size =
174 : base::OS::CommitPageSize(); 173 ((executable == EXECUTABLE))
175 size_t reserved_size = 174 ? RoundUp(header_size + guard_size + reserve_area_size + guard_size,
176 ((executable == EXECUTABLE)) 175 alignment)
177 ? RoundUp(header_size + guard_size + reserve_area_size + guard_size, 176 : RoundUp(header_size + reserve_area_size,
178 alignment) 177 base::OS::CommitPageSize());
179 : RoundUp(header_size + reserve_area_size, 178 CHECK(memory_chunk->size() == reserved_size);
180 base::OS::CommitPageSize()); 179 CHECK(memory_chunk->area_start() <
181 CHECK(memory_chunk->size() == reserved_size); 180 memory_chunk->address() + memory_chunk->size());
182 CHECK(memory_chunk->area_start() < memory_chunk->address() + 181 CHECK(memory_chunk->area_end() <=
183 memory_chunk->size()); 182 memory_chunk->address() + memory_chunk->size());
184 CHECK(memory_chunk->area_end() <= memory_chunk->address() + 183 CHECK(static_cast<size_t>(memory_chunk->area_size()) == commit_area_size);
185 memory_chunk->size());
186 CHECK(static_cast<size_t>(memory_chunk->area_size()) == commit_area_size);
187 184
188 Address area_start = memory_chunk->area_start(); 185 Address area_start = memory_chunk->area_start();
189 186
190 memory_chunk->CommitArea(second_commit_area_size); 187 memory_chunk->CommitArea(second_commit_area_size);
191 CHECK(area_start == memory_chunk->area_start()); 188 CHECK(area_start == memory_chunk->area_start());
192 CHECK(memory_chunk->area_start() < memory_chunk->address() + 189 CHECK(memory_chunk->area_start() <
193 memory_chunk->size()); 190 memory_chunk->address() + memory_chunk->size());
194 CHECK(memory_chunk->area_end() <= memory_chunk->address() + 191 CHECK(memory_chunk->area_end() <=
195 memory_chunk->size()); 192 memory_chunk->address() + memory_chunk->size());
196 CHECK(static_cast<size_t>(memory_chunk->area_size()) == 193 CHECK(static_cast<size_t>(memory_chunk->area_size()) ==
197 second_commit_area_size); 194 second_commit_area_size);
198 195
199 memory_allocator->Free(memory_chunk); 196 memory_allocator->Free(memory_chunk);
197 }
200 memory_allocator->TearDown(); 198 memory_allocator->TearDown();
201 delete memory_allocator; 199 delete memory_allocator;
202 } 200 }
203 201
204 202
205 TEST(Regress3540) { 203 TEST(Regress3540) {
206 Isolate* isolate = CcTest::i_isolate(); 204 Isolate* isolate = CcTest::i_isolate();
207 Heap* heap = isolate->heap(); 205 Heap* heap = isolate->heap();
208 const int pageSize = Page::kPageSize; 206 const int pageSize = Page::kPageSize;
209 MemoryAllocator* memory_allocator = new MemoryAllocator(isolate); 207 MemoryAllocator* memory_allocator = new MemoryAllocator(isolate);
210 CHECK( 208 CHECK(memory_allocator->SetUp(heap->MaxReserved(), heap->MaxExecutableSize(),
211 memory_allocator->SetUp(heap->MaxReserved(), heap->MaxExecutableSize())); 209 0));
212 TestMemoryAllocatorScope test_allocator_scope(isolate, memory_allocator); 210 TestMemoryAllocatorScope test_allocator_scope(isolate, memory_allocator);
213 CodeRange* code_range = new CodeRange(isolate); 211 CodeRange* code_range = new CodeRange(isolate);
214 const size_t code_range_size = 4 * pageSize; 212 const size_t code_range_size = 4 * pageSize;
215 if (!code_range->SetUp( 213 if (!code_range->SetUp(
216 code_range_size + 214 code_range_size +
217 RoundUp(v8::base::OS::CommitPageSize() * kReservedCodeRangePages, 215 RoundUp(v8::base::OS::CommitPageSize() * kReservedCodeRangePages,
218 MemoryChunk::kAlignment) + 216 MemoryChunk::kAlignment) +
219 v8::internal::MemoryAllocator::CodePageAreaSize())) { 217 v8::internal::MemoryAllocator::CodePageAreaSize())) {
220 return; 218 return;
221 } 219 }
(...skipping 81 matching lines...) Expand 10 before | Expand all | Expand 10 after
303 } 301 }
304 } 302 }
305 303
306 304
307 TEST(MemoryAllocator) { 305 TEST(MemoryAllocator) {
308 Isolate* isolate = CcTest::i_isolate(); 306 Isolate* isolate = CcTest::i_isolate();
309 Heap* heap = isolate->heap(); 307 Heap* heap = isolate->heap();
310 308
311 MemoryAllocator* memory_allocator = new MemoryAllocator(isolate); 309 MemoryAllocator* memory_allocator = new MemoryAllocator(isolate);
312 CHECK(memory_allocator != nullptr); 310 CHECK(memory_allocator != nullptr);
313 CHECK(memory_allocator->SetUp(heap->MaxReserved(), 311 CHECK(memory_allocator->SetUp(heap->MaxReserved(), heap->MaxExecutableSize(),
314 heap->MaxExecutableSize())); 312 0));
315 TestMemoryAllocatorScope test_scope(isolate, memory_allocator); 313 TestMemoryAllocatorScope test_scope(isolate, memory_allocator);
316 314
317 { 315 {
318 int total_pages = 0; 316 int total_pages = 0;
319 OldSpace faked_space(heap, OLD_SPACE, NOT_EXECUTABLE); 317 OldSpace faked_space(heap, OLD_SPACE, NOT_EXECUTABLE);
320 Page* first_page = memory_allocator->AllocatePage<Page>( 318 Page* first_page = memory_allocator->AllocatePage<Page>(
321 faked_space.AreaSize(), static_cast<PagedSpace*>(&faked_space), 319 faked_space.AreaSize(), static_cast<PagedSpace*>(&faked_space),
322 NOT_EXECUTABLE); 320 NOT_EXECUTABLE);
323 321
324 first_page->InsertAfter(faked_space.anchor()->prev_page()); 322 first_page->InsertAfter(faked_space.anchor()->prev_page());
(...skipping 26 matching lines...) Expand all
351 } 349 }
352 memory_allocator->TearDown(); 350 memory_allocator->TearDown();
353 delete memory_allocator; 351 delete memory_allocator;
354 } 352 }
355 353
356 354
357 TEST(NewSpace) { 355 TEST(NewSpace) {
358 Isolate* isolate = CcTest::i_isolate(); 356 Isolate* isolate = CcTest::i_isolate();
359 Heap* heap = isolate->heap(); 357 Heap* heap = isolate->heap();
360 MemoryAllocator* memory_allocator = new MemoryAllocator(isolate); 358 MemoryAllocator* memory_allocator = new MemoryAllocator(isolate);
361 CHECK(memory_allocator->SetUp(heap->MaxReserved(), 359 CHECK(memory_allocator->SetUp(heap->MaxReserved(), heap->MaxExecutableSize(),
362 heap->MaxExecutableSize())); 360 0));
363 TestMemoryAllocatorScope test_scope(isolate, memory_allocator); 361 TestMemoryAllocatorScope test_scope(isolate, memory_allocator);
364 362
365 NewSpace new_space(heap); 363 NewSpace new_space(heap);
366 364
367 CHECK(new_space.SetUp(CcTest::heap()->InitialSemiSpaceSize(), 365 CHECK(new_space.SetUp(CcTest::heap()->InitialSemiSpaceSize(),
368 CcTest::heap()->InitialSemiSpaceSize())); 366 CcTest::heap()->InitialSemiSpaceSize()));
369 CHECK(new_space.HasBeenSetUp()); 367 CHECK(new_space.HasBeenSetUp());
370 368
371 while (new_space.Available() >= Page::kMaxRegularHeapObjectSize) { 369 while (new_space.Available() >= Page::kMaxRegularHeapObjectSize) {
372 Object* obj = 370 Object* obj =
373 new_space.AllocateRawUnaligned(Page::kMaxRegularHeapObjectSize) 371 new_space.AllocateRawUnaligned(Page::kMaxRegularHeapObjectSize)
374 .ToObjectChecked(); 372 .ToObjectChecked();
375 CHECK(new_space.Contains(HeapObject::cast(obj))); 373 CHECK(new_space.Contains(HeapObject::cast(obj)));
376 } 374 }
377 375
378 new_space.TearDown(); 376 new_space.TearDown();
379 memory_allocator->TearDown(); 377 memory_allocator->TearDown();
380 delete memory_allocator; 378 delete memory_allocator;
381 } 379 }
382 380
383 381
384 TEST(OldSpace) { 382 TEST(OldSpace) {
385 Isolate* isolate = CcTest::i_isolate(); 383 Isolate* isolate = CcTest::i_isolate();
386 Heap* heap = isolate->heap(); 384 Heap* heap = isolate->heap();
387 MemoryAllocator* memory_allocator = new MemoryAllocator(isolate); 385 MemoryAllocator* memory_allocator = new MemoryAllocator(isolate);
388 CHECK(memory_allocator->SetUp(heap->MaxReserved(), 386 CHECK(memory_allocator->SetUp(heap->MaxReserved(), heap->MaxExecutableSize(),
389 heap->MaxExecutableSize())); 387 0));
390 TestMemoryAllocatorScope test_scope(isolate, memory_allocator); 388 TestMemoryAllocatorScope test_scope(isolate, memory_allocator);
391 389
392 OldSpace* s = new OldSpace(heap, OLD_SPACE, NOT_EXECUTABLE); 390 OldSpace* s = new OldSpace(heap, OLD_SPACE, NOT_EXECUTABLE);
393 CHECK(s != NULL); 391 CHECK(s != NULL);
394 392
395 CHECK(s->SetUp()); 393 CHECK(s->SetUp());
396 394
397 while (s->Available() > 0) { 395 while (s->Available() > 0) {
398 s->AllocateRawUnaligned(Page::kMaxRegularHeapObjectSize).ToObjectChecked(); 396 s->AllocateRawUnaligned(Page::kMaxRegularHeapObjectSize).ToObjectChecked();
399 } 397 }
400 398
401 delete s; 399 delete s;
402 memory_allocator->TearDown(); 400 memory_allocator->TearDown();
403 delete memory_allocator; 401 delete memory_allocator;
404 } 402 }
405 403
406 404
407 TEST(CompactionSpace) { 405 TEST(CompactionSpace) {
408 Isolate* isolate = CcTest::i_isolate(); 406 Isolate* isolate = CcTest::i_isolate();
409 Heap* heap = isolate->heap(); 407 Heap* heap = isolate->heap();
410 MemoryAllocator* memory_allocator = new MemoryAllocator(isolate); 408 MemoryAllocator* memory_allocator = new MemoryAllocator(isolate);
411 CHECK(memory_allocator != nullptr); 409 CHECK(memory_allocator != nullptr);
412 CHECK( 410 CHECK(memory_allocator->SetUp(heap->MaxReserved(), heap->MaxExecutableSize(),
413 memory_allocator->SetUp(heap->MaxReserved(), heap->MaxExecutableSize())); 411 0));
414 TestMemoryAllocatorScope test_scope(isolate, memory_allocator); 412 TestMemoryAllocatorScope test_scope(isolate, memory_allocator);
415 413
416 CompactionSpace* compaction_space = 414 CompactionSpace* compaction_space =
417 new CompactionSpace(heap, OLD_SPACE, NOT_EXECUTABLE); 415 new CompactionSpace(heap, OLD_SPACE, NOT_EXECUTABLE);
418 CHECK(compaction_space != NULL); 416 CHECK(compaction_space != NULL);
419 CHECK(compaction_space->SetUp()); 417 CHECK(compaction_space->SetUp());
420 418
421 OldSpace* old_space = new OldSpace(heap, OLD_SPACE, NOT_EXECUTABLE); 419 OldSpace* old_space = new OldSpace(heap, OLD_SPACE, NOT_EXECUTABLE);
422 CHECK(old_space != NULL); 420 CHECK(old_space != NULL);
423 CHECK(old_space->SetUp()); 421 CHECK(old_space->SetUp());
(...skipping 251 matching lines...) Expand 10 before | Expand all | Expand 10 after
675 new_space->RemoveAllocationObserver(&observer2); 673 new_space->RemoveAllocationObserver(&observer2);
676 674
677 CHECK_EQ(observer1.count(), 32); 675 CHECK_EQ(observer1.count(), 32);
678 CHECK_EQ(observer2.count(), 28); 676 CHECK_EQ(observer2.count(), 28);
679 } 677 }
680 isolate->Dispose(); 678 isolate->Dispose();
681 } 679 }
682 680
683 } // namespace internal 681 } // namespace internal
684 } // namespace v8 682 } // namespace v8
OLDNEW
« no previous file with comments | « src/x64/assembler-x64-inl.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698