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

Side by Side Diff: src/heap/heap.cc

Issue 1012023002: Merge old data and pointer space. (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: Created 5 years, 9 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/heap/heap.h ('k') | src/heap/heap-inl.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2012 the V8 project authors. All rights reserved. 1 // Copyright 2012 the V8 project authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "src/v8.h" 5 #include "src/v8.h"
6 6
7 #include "src/accessors.h" 7 #include "src/accessors.h"
8 #include "src/api.h" 8 #include "src/api.h"
9 #include "src/base/bits.h" 9 #include "src/base/bits.h"
10 #include "src/base/once.h" 10 #include "src/base/once.h"
(...skipping 66 matching lines...) Expand 10 before | Expand all | Expand 10 after
77 // generation can be aligned to its size. 77 // generation can be aligned to its size.
78 maximum_committed_(0), 78 maximum_committed_(0),
79 survived_since_last_expansion_(0), 79 survived_since_last_expansion_(0),
80 survived_last_scavenge_(0), 80 survived_last_scavenge_(0),
81 sweep_generation_(0), 81 sweep_generation_(0),
82 always_allocate_scope_depth_(0), 82 always_allocate_scope_depth_(0),
83 contexts_disposed_(0), 83 contexts_disposed_(0),
84 global_ic_age_(0), 84 global_ic_age_(0),
85 scan_on_scavenge_pages_(0), 85 scan_on_scavenge_pages_(0),
86 new_space_(this), 86 new_space_(this),
87 old_pointer_space_(NULL), 87 old_space_(NULL),
88 old_data_space_(NULL),
89 code_space_(NULL), 88 code_space_(NULL),
90 map_space_(NULL), 89 map_space_(NULL),
91 cell_space_(NULL), 90 cell_space_(NULL),
92 property_cell_space_(NULL), 91 property_cell_space_(NULL),
93 lo_space_(NULL), 92 lo_space_(NULL),
94 gc_state_(NOT_IN_GC), 93 gc_state_(NOT_IN_GC),
95 gc_post_processing_depth_(0), 94 gc_post_processing_depth_(0),
96 allocations_count_(0), 95 allocations_count_(0),
97 raw_allocations_hash_(0), 96 raw_allocations_hash_(0),
98 dump_allocations_hash_countdown_(FLAG_dump_allocations_digest_at_alloc), 97 dump_allocations_hash_countdown_(FLAG_dump_allocations_digest_at_alloc),
(...skipping 67 matching lines...) Expand 10 before | Expand all | Expand 10 after
166 // minidump even if there are no real unmapped pages. 165 // minidump even if there are no real unmapped pages.
167 RememberUnmappedPage(NULL, false); 166 RememberUnmappedPage(NULL, false);
168 167
169 ClearObjectStats(true); 168 ClearObjectStats(true);
170 } 169 }
171 170
172 171
173 intptr_t Heap::Capacity() { 172 intptr_t Heap::Capacity() {
174 if (!HasBeenSetUp()) return 0; 173 if (!HasBeenSetUp()) return 0;
175 174
176 return new_space_.Capacity() + old_pointer_space_->Capacity() + 175 return new_space_.Capacity() + old_space_->Capacity() +
177 old_data_space_->Capacity() + code_space_->Capacity() + 176 code_space_->Capacity() + map_space_->Capacity() +
178 map_space_->Capacity() + cell_space_->Capacity() + 177 cell_space_->Capacity() + property_cell_space_->Capacity();
179 property_cell_space_->Capacity();
180 } 178 }
181 179
182 180
183 intptr_t Heap::CommittedOldGenerationMemory() { 181 intptr_t Heap::CommittedOldGenerationMemory() {
184 if (!HasBeenSetUp()) return 0; 182 if (!HasBeenSetUp()) return 0;
185 183
186 return old_pointer_space_->CommittedMemory() + 184 return old_space_->CommittedMemory() + code_space_->CommittedMemory() +
187 old_data_space_->CommittedMemory() + code_space_->CommittedMemory() +
188 map_space_->CommittedMemory() + cell_space_->CommittedMemory() + 185 map_space_->CommittedMemory() + cell_space_->CommittedMemory() +
189 property_cell_space_->CommittedMemory() + lo_space_->Size(); 186 property_cell_space_->CommittedMemory() + lo_space_->Size();
190 } 187 }
191 188
192 189
193 intptr_t Heap::CommittedMemory() { 190 intptr_t Heap::CommittedMemory() {
194 if (!HasBeenSetUp()) return 0; 191 if (!HasBeenSetUp()) return 0;
195 192
196 return new_space_.CommittedMemory() + CommittedOldGenerationMemory(); 193 return new_space_.CommittedMemory() + CommittedOldGenerationMemory();
197 } 194 }
198 195
199 196
200 size_t Heap::CommittedPhysicalMemory() { 197 size_t Heap::CommittedPhysicalMemory() {
201 if (!HasBeenSetUp()) return 0; 198 if (!HasBeenSetUp()) return 0;
202 199
203 return new_space_.CommittedPhysicalMemory() + 200 return new_space_.CommittedPhysicalMemory() +
204 old_pointer_space_->CommittedPhysicalMemory() + 201 old_space_->CommittedPhysicalMemory() +
205 old_data_space_->CommittedPhysicalMemory() +
206 code_space_->CommittedPhysicalMemory() + 202 code_space_->CommittedPhysicalMemory() +
207 map_space_->CommittedPhysicalMemory() + 203 map_space_->CommittedPhysicalMemory() +
208 cell_space_->CommittedPhysicalMemory() + 204 cell_space_->CommittedPhysicalMemory() +
209 property_cell_space_->CommittedPhysicalMemory() + 205 property_cell_space_->CommittedPhysicalMemory() +
210 lo_space_->CommittedPhysicalMemory(); 206 lo_space_->CommittedPhysicalMemory();
211 } 207 }
212 208
213 209
214 intptr_t Heap::CommittedMemoryExecutable() { 210 intptr_t Heap::CommittedMemoryExecutable() {
215 if (!HasBeenSetUp()) return 0; 211 if (!HasBeenSetUp()) return 0;
216 212
217 return isolate()->memory_allocator()->SizeExecutable(); 213 return isolate()->memory_allocator()->SizeExecutable();
218 } 214 }
219 215
220 216
221 void Heap::UpdateMaximumCommitted() { 217 void Heap::UpdateMaximumCommitted() {
222 if (!HasBeenSetUp()) return; 218 if (!HasBeenSetUp()) return;
223 219
224 intptr_t current_committed_memory = CommittedMemory(); 220 intptr_t current_committed_memory = CommittedMemory();
225 if (current_committed_memory > maximum_committed_) { 221 if (current_committed_memory > maximum_committed_) {
226 maximum_committed_ = current_committed_memory; 222 maximum_committed_ = current_committed_memory;
227 } 223 }
228 } 224 }
229 225
230 226
231 intptr_t Heap::Available() { 227 intptr_t Heap::Available() {
232 if (!HasBeenSetUp()) return 0; 228 if (!HasBeenSetUp()) return 0;
233 229
234 return new_space_.Available() + old_pointer_space_->Available() + 230 return new_space_.Available() + old_space_->Available() +
235 old_data_space_->Available() + code_space_->Available() + 231 code_space_->Available() + map_space_->Available() +
236 map_space_->Available() + cell_space_->Available() + 232 cell_space_->Available() + property_cell_space_->Available();
237 property_cell_space_->Available();
238 } 233 }
239 234
240 235
241 bool Heap::HasBeenSetUp() { 236 bool Heap::HasBeenSetUp() {
242 return old_pointer_space_ != NULL && old_data_space_ != NULL && 237 return old_space_ != NULL && code_space_ != NULL && map_space_ != NULL &&
243 code_space_ != NULL && map_space_ != NULL && cell_space_ != NULL && 238 cell_space_ != NULL && property_cell_space_ != NULL &&
244 property_cell_space_ != NULL && lo_space_ != NULL; 239 lo_space_ != NULL;
245 } 240 }
246 241
247 242
248 int Heap::GcSafeSizeOfOldObject(HeapObject* object) { 243 int Heap::GcSafeSizeOfOldObject(HeapObject* object) {
249 if (IntrusiveMarking::IsMarked(object)) { 244 if (IntrusiveMarking::IsMarked(object)) {
250 return IntrusiveMarking::SizeOfMarkedObject(object); 245 return IntrusiveMarking::SizeOfMarkedObject(object);
251 } 246 }
252 return object->SizeFromMap(object->map()); 247 return object->SizeFromMap(object->map());
253 } 248 }
254 249
(...skipping 82 matching lines...) Expand 10 before | Expand all | Expand 10 after
337 ", available: %6" V8_PTR_PREFIX "d KB\n", 332 ", available: %6" V8_PTR_PREFIX "d KB\n",
338 isolate_->memory_allocator()->Size() / KB, 333 isolate_->memory_allocator()->Size() / KB,
339 isolate_->memory_allocator()->Available() / KB); 334 isolate_->memory_allocator()->Available() / KB);
340 PrintPID("New space, used: %6" V8_PTR_PREFIX 335 PrintPID("New space, used: %6" V8_PTR_PREFIX
341 "d KB" 336 "d KB"
342 ", available: %6" V8_PTR_PREFIX 337 ", available: %6" V8_PTR_PREFIX
343 "d KB" 338 "d KB"
344 ", committed: %6" V8_PTR_PREFIX "d KB\n", 339 ", committed: %6" V8_PTR_PREFIX "d KB\n",
345 new_space_.Size() / KB, new_space_.Available() / KB, 340 new_space_.Size() / KB, new_space_.Available() / KB,
346 new_space_.CommittedMemory() / KB); 341 new_space_.CommittedMemory() / KB);
347 PrintPID("Old pointers, used: %6" V8_PTR_PREFIX 342 PrintPID("Old space, used: %6" V8_PTR_PREFIX
348 "d KB" 343 "d KB"
349 ", available: %6" V8_PTR_PREFIX 344 ", available: %6" V8_PTR_PREFIX
350 "d KB" 345 "d KB"
351 ", committed: %6" V8_PTR_PREFIX "d KB\n", 346 ", committed: %6" V8_PTR_PREFIX "d KB\n",
352 old_pointer_space_->SizeOfObjects() / KB, 347 old_space_->SizeOfObjects() / KB, old_space_->Available() / KB,
353 old_pointer_space_->Available() / KB, 348 old_space_->CommittedMemory() / KB);
354 old_pointer_space_->CommittedMemory() / KB);
355 PrintPID("Old data space, used: %6" V8_PTR_PREFIX
356 "d KB"
357 ", available: %6" V8_PTR_PREFIX
358 "d KB"
359 ", committed: %6" V8_PTR_PREFIX "d KB\n",
360 old_data_space_->SizeOfObjects() / KB,
361 old_data_space_->Available() / KB,
362 old_data_space_->CommittedMemory() / KB);
363 PrintPID("Code space, used: %6" V8_PTR_PREFIX 349 PrintPID("Code space, used: %6" V8_PTR_PREFIX
364 "d KB" 350 "d KB"
365 ", available: %6" V8_PTR_PREFIX 351 ", available: %6" V8_PTR_PREFIX
366 "d KB" 352 "d KB"
367 ", committed: %6" V8_PTR_PREFIX "d KB\n", 353 ", committed: %6" V8_PTR_PREFIX "d KB\n",
368 code_space_->SizeOfObjects() / KB, code_space_->Available() / KB, 354 code_space_->SizeOfObjects() / KB, code_space_->Available() / KB,
369 code_space_->CommittedMemory() / KB); 355 code_space_->CommittedMemory() / KB);
370 PrintPID("Map space, used: %6" V8_PTR_PREFIX 356 PrintPID("Map space, used: %6" V8_PTR_PREFIX
371 "d KB" 357 "d KB"
372 ", available: %6" V8_PTR_PREFIX 358 ", available: %6" V8_PTR_PREFIX
(...skipping 283 matching lines...) Expand 10 before | Expand all | Expand 10 after
656 (crankshaft_codegen_bytes_generated_ + 642 (crankshaft_codegen_bytes_generated_ +
657 full_codegen_bytes_generated_))); 643 full_codegen_bytes_generated_)));
658 } 644 }
659 645
660 if (CommittedMemory() > 0) { 646 if (CommittedMemory() > 0) {
661 isolate_->counters()->external_fragmentation_total()->AddSample( 647 isolate_->counters()->external_fragmentation_total()->AddSample(
662 static_cast<int>(100 - (SizeOfObjects() * 100.0) / CommittedMemory())); 648 static_cast<int>(100 - (SizeOfObjects() * 100.0) / CommittedMemory()));
663 649
664 isolate_->counters()->heap_fraction_new_space()->AddSample(static_cast<int>( 650 isolate_->counters()->heap_fraction_new_space()->AddSample(static_cast<int>(
665 (new_space()->CommittedMemory() * 100.0) / CommittedMemory())); 651 (new_space()->CommittedMemory() * 100.0) / CommittedMemory()));
666 isolate_->counters()->heap_fraction_old_pointer_space()->AddSample( 652 isolate_->counters()->heap_fraction_old_space()->AddSample(static_cast<int>(
667 static_cast<int>((old_pointer_space()->CommittedMemory() * 100.0) / 653 (old_space()->CommittedMemory() * 100.0) / CommittedMemory()));
668 CommittedMemory()));
669 isolate_->counters()->heap_fraction_old_data_space()->AddSample(
670 static_cast<int>((old_data_space()->CommittedMemory() * 100.0) /
671 CommittedMemory()));
672 isolate_->counters()->heap_fraction_code_space()->AddSample( 654 isolate_->counters()->heap_fraction_code_space()->AddSample(
673 static_cast<int>((code_space()->CommittedMemory() * 100.0) / 655 static_cast<int>((code_space()->CommittedMemory() * 100.0) /
674 CommittedMemory())); 656 CommittedMemory()));
675 isolate_->counters()->heap_fraction_map_space()->AddSample(static_cast<int>( 657 isolate_->counters()->heap_fraction_map_space()->AddSample(static_cast<int>(
676 (map_space()->CommittedMemory() * 100.0) / CommittedMemory())); 658 (map_space()->CommittedMemory() * 100.0) / CommittedMemory()));
677 isolate_->counters()->heap_fraction_cell_space()->AddSample( 659 isolate_->counters()->heap_fraction_cell_space()->AddSample(
678 static_cast<int>((cell_space()->CommittedMemory() * 100.0) / 660 static_cast<int>((cell_space()->CommittedMemory() * 100.0) /
679 CommittedMemory())); 661 CommittedMemory()));
680 isolate_->counters()->heap_fraction_property_cell_space()->AddSample( 662 isolate_->counters()->heap_fraction_property_cell_space()->AddSample(
681 static_cast<int>((property_cell_space()->CommittedMemory() * 100.0) / 663 static_cast<int>((property_cell_space()->CommittedMemory() * 100.0) /
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after
714 isolate_->counters()->external_fragmentation_##space()->AddSample( \ 696 isolate_->counters()->external_fragmentation_##space()->AddSample( \
715 static_cast<int>(100 - \ 697 static_cast<int>(100 - \
716 (space()->SizeOfObjects() * 100.0) / \ 698 (space()->SizeOfObjects() * 100.0) / \
717 space()->CommittedMemory())); \ 699 space()->CommittedMemory())); \
718 } 700 }
719 #define UPDATE_COUNTERS_AND_FRAGMENTATION_FOR_SPACE(space) \ 701 #define UPDATE_COUNTERS_AND_FRAGMENTATION_FOR_SPACE(space) \
720 UPDATE_COUNTERS_FOR_SPACE(space) \ 702 UPDATE_COUNTERS_FOR_SPACE(space) \
721 UPDATE_FRAGMENTATION_FOR_SPACE(space) 703 UPDATE_FRAGMENTATION_FOR_SPACE(space)
722 704
723 UPDATE_COUNTERS_FOR_SPACE(new_space) 705 UPDATE_COUNTERS_FOR_SPACE(new_space)
724 UPDATE_COUNTERS_AND_FRAGMENTATION_FOR_SPACE(old_pointer_space) 706 UPDATE_COUNTERS_AND_FRAGMENTATION_FOR_SPACE(old_space)
725 UPDATE_COUNTERS_AND_FRAGMENTATION_FOR_SPACE(old_data_space)
726 UPDATE_COUNTERS_AND_FRAGMENTATION_FOR_SPACE(code_space) 707 UPDATE_COUNTERS_AND_FRAGMENTATION_FOR_SPACE(code_space)
727 UPDATE_COUNTERS_AND_FRAGMENTATION_FOR_SPACE(map_space) 708 UPDATE_COUNTERS_AND_FRAGMENTATION_FOR_SPACE(map_space)
728 UPDATE_COUNTERS_AND_FRAGMENTATION_FOR_SPACE(cell_space) 709 UPDATE_COUNTERS_AND_FRAGMENTATION_FOR_SPACE(cell_space)
729 UPDATE_COUNTERS_AND_FRAGMENTATION_FOR_SPACE(property_cell_space) 710 UPDATE_COUNTERS_AND_FRAGMENTATION_FOR_SPACE(property_cell_space)
730 UPDATE_COUNTERS_AND_FRAGMENTATION_FOR_SPACE(lo_space) 711 UPDATE_COUNTERS_AND_FRAGMENTATION_FOR_SPACE(lo_space)
731 #undef UPDATE_COUNTERS_FOR_SPACE 712 #undef UPDATE_COUNTERS_FOR_SPACE
732 #undef UPDATE_FRAGMENTATION_FOR_SPACE 713 #undef UPDATE_FRAGMENTATION_FOR_SPACE
733 #undef UPDATE_COUNTERS_AND_FRAGMENTATION_FOR_SPACE 714 #undef UPDATE_COUNTERS_AND_FRAGMENTATION_FOR_SPACE
734 715
735 #ifdef DEBUG 716 #ifdef DEBUG
(...skipping 57 matching lines...) Expand 10 before | Expand all | Expand 10 after
793 } 774 }
794 } 775 }
795 776
796 777
797 void Heap::CollectAllGarbage(int flags, const char* gc_reason, 778 void Heap::CollectAllGarbage(int flags, const char* gc_reason,
798 const v8::GCCallbackFlags gc_callback_flags) { 779 const v8::GCCallbackFlags gc_callback_flags) {
799 // Since we are ignoring the return value, the exact choice of space does 780 // Since we are ignoring the return value, the exact choice of space does
800 // not matter, so long as we do not specify NEW_SPACE, which would not 781 // not matter, so long as we do not specify NEW_SPACE, which would not
801 // cause a full GC. 782 // cause a full GC.
802 mark_compact_collector_.SetFlags(flags); 783 mark_compact_collector_.SetFlags(flags);
803 CollectGarbage(OLD_POINTER_SPACE, gc_reason, gc_callback_flags); 784 CollectGarbage(OLD_SPACE, gc_reason, gc_callback_flags);
804 mark_compact_collector_.SetFlags(kNoGCFlags); 785 mark_compact_collector_.SetFlags(kNoGCFlags);
805 } 786 }
806 787
807 788
808 void Heap::CollectAllAvailableGarbage(const char* gc_reason) { 789 void Heap::CollectAllAvailableGarbage(const char* gc_reason) {
809 // Since we are ignoring the return value, the exact choice of space does 790 // Since we are ignoring the return value, the exact choice of space does
810 // not matter, so long as we do not specify NEW_SPACE, which would not 791 // not matter, so long as we do not specify NEW_SPACE, which would not
811 // cause a full GC. 792 // cause a full GC.
812 // Major GC would invoke weak handle callbacks on weakly reachable 793 // Major GC would invoke weak handle callbacks on weakly reachable
813 // handles, but won't collect weakly reachable objects until next 794 // handles, but won't collect weakly reachable objects until next
(...skipping 562 matching lines...) Expand 10 before | Expand all | Expand 10 after
1376 1357
1377 1358
1378 static void VerifyNonPointerSpacePointers(Heap* heap) { 1359 static void VerifyNonPointerSpacePointers(Heap* heap) {
1379 // Verify that there are no pointers to new space in spaces where we 1360 // Verify that there are no pointers to new space in spaces where we
1380 // do not expect them. 1361 // do not expect them.
1381 VerifyNonPointerSpacePointersVisitor v(heap); 1362 VerifyNonPointerSpacePointersVisitor v(heap);
1382 HeapObjectIterator code_it(heap->code_space()); 1363 HeapObjectIterator code_it(heap->code_space());
1383 for (HeapObject* object = code_it.Next(); object != NULL; 1364 for (HeapObject* object = code_it.Next(); object != NULL;
1384 object = code_it.Next()) 1365 object = code_it.Next())
1385 object->Iterate(&v); 1366 object->Iterate(&v);
1386
1387 HeapObjectIterator data_it(heap->old_data_space());
1388 for (HeapObject* object = data_it.Next(); object != NULL;
1389 object = data_it.Next())
1390 object->Iterate(&v);
1391 } 1367 }
1392 #endif // VERIFY_HEAP 1368 #endif // VERIFY_HEAP
1393 1369
1394 1370
1395 void Heap::CheckNewSpaceExpansionCriteria() { 1371 void Heap::CheckNewSpaceExpansionCriteria() {
1396 if (FLAG_experimental_new_space_growth_heuristic) { 1372 if (FLAG_experimental_new_space_growth_heuristic) {
1397 if (new_space_.TotalCapacity() < new_space_.MaximumCapacity() && 1373 if (new_space_.TotalCapacity() < new_space_.MaximumCapacity() &&
1398 survived_last_scavenge_ * 100 / new_space_.TotalCapacity() >= 10) { 1374 survived_last_scavenge_ * 100 / new_space_.TotalCapacity() >= 10) {
1399 // Grow the size of new space if there is room to grow, and more than 10% 1375 // Grow the size of new space if there is room to grow, and more than 10%
1400 // have survived the last scavenge. 1376 // have survived the last scavenge.
(...skipping 776 matching lines...) Expand 10 before | Expand all | Expand 10 after
2177 HeapObject* object, int object_size) { 2153 HeapObject* object, int object_size) {
2178 Heap* heap = map->GetHeap(); 2154 Heap* heap = map->GetHeap();
2179 2155
2180 int allocation_size = object_size; 2156 int allocation_size = object_size;
2181 if (alignment != kObjectAlignment) { 2157 if (alignment != kObjectAlignment) {
2182 DCHECK(alignment == kDoubleAlignment); 2158 DCHECK(alignment == kDoubleAlignment);
2183 allocation_size += kPointerSize; 2159 allocation_size += kPointerSize;
2184 } 2160 }
2185 2161
2186 AllocationResult allocation; 2162 AllocationResult allocation;
2187 if (object_contents == DATA_OBJECT) { 2163 allocation = heap->old_space()->AllocateRaw(allocation_size);
2188 DCHECK(heap->AllowedToBeMigrated(object, OLD_DATA_SPACE));
2189 allocation = heap->old_data_space()->AllocateRaw(allocation_size);
2190 } else {
2191 DCHECK(heap->AllowedToBeMigrated(object, OLD_POINTER_SPACE));
2192 allocation = heap->old_pointer_space()->AllocateRaw(allocation_size);
2193 }
2194 2164
2195 HeapObject* target = NULL; // Initialization to please compiler. 2165 HeapObject* target = NULL; // Initialization to please compiler.
2196 if (allocation.To(&target)) { 2166 if (allocation.To(&target)) {
2197 if (alignment != kObjectAlignment) { 2167 if (alignment != kObjectAlignment) {
2198 target = EnsureDoubleAligned(heap, target, allocation_size); 2168 target = EnsureDoubleAligned(heap, target, allocation_size);
2199 } 2169 }
2200 MigrateObject(heap, object, target, object_size); 2170 MigrateObject(heap, object, target, object_size);
2201 2171
2202 // Update slot to new target. 2172 // Update slot to new target.
2203 *slot = target; 2173 *slot = target;
(...skipping 395 matching lines...) Expand 10 before | Expand all | Expand 10 after
2599 } 2569 }
2600 2570
2601 // Allocate the empty array. 2571 // Allocate the empty array.
2602 { 2572 {
2603 AllocationResult allocation = AllocateEmptyFixedArray(); 2573 AllocationResult allocation = AllocateEmptyFixedArray();
2604 if (!allocation.To(&obj)) return false; 2574 if (!allocation.To(&obj)) return false;
2605 } 2575 }
2606 set_empty_fixed_array(FixedArray::cast(obj)); 2576 set_empty_fixed_array(FixedArray::cast(obj));
2607 2577
2608 { 2578 {
2609 AllocationResult allocation = Allocate(null_map(), OLD_POINTER_SPACE); 2579 AllocationResult allocation = Allocate(null_map(), OLD_SPACE);
2610 if (!allocation.To(&obj)) return false; 2580 if (!allocation.To(&obj)) return false;
2611 } 2581 }
2612 set_null_value(Oddball::cast(obj)); 2582 set_null_value(Oddball::cast(obj));
2613 Oddball::cast(obj)->set_kind(Oddball::kNull); 2583 Oddball::cast(obj)->set_kind(Oddball::kNull);
2614 2584
2615 { 2585 {
2616 AllocationResult allocation = Allocate(undefined_map(), OLD_POINTER_SPACE); 2586 AllocationResult allocation = Allocate(undefined_map(), OLD_SPACE);
2617 if (!allocation.To(&obj)) return false; 2587 if (!allocation.To(&obj)) return false;
2618 } 2588 }
2619 set_undefined_value(Oddball::cast(obj)); 2589 set_undefined_value(Oddball::cast(obj));
2620 Oddball::cast(obj)->set_kind(Oddball::kUndefined); 2590 Oddball::cast(obj)->set_kind(Oddball::kUndefined);
2621 DCHECK(!InNewSpace(undefined_value())); 2591 DCHECK(!InNewSpace(undefined_value()));
2622 2592
2623 // Set preliminary exception sentinel value before actually initializing it. 2593 // Set preliminary exception sentinel value before actually initializing it.
2624 set_exception(null_value()); 2594 set_exception(null_value());
2625 2595
2626 // Allocate the empty descriptor array. 2596 // Allocate the empty descriptor array.
(...skipping 216 matching lines...) Expand 10 before | Expand all | Expand 10 after
2843 } 2813 }
2844 2814
2845 2815
2846 AllocationResult Heap::AllocateHeapNumber(double value, MutableMode mode, 2816 AllocationResult Heap::AllocateHeapNumber(double value, MutableMode mode,
2847 PretenureFlag pretenure) { 2817 PretenureFlag pretenure) {
2848 // Statically ensure that it is safe to allocate heap numbers in paged 2818 // Statically ensure that it is safe to allocate heap numbers in paged
2849 // spaces. 2819 // spaces.
2850 int size = HeapNumber::kSize; 2820 int size = HeapNumber::kSize;
2851 STATIC_ASSERT(HeapNumber::kSize <= Page::kMaxRegularHeapObjectSize); 2821 STATIC_ASSERT(HeapNumber::kSize <= Page::kMaxRegularHeapObjectSize);
2852 2822
2853 AllocationSpace space = SelectSpace(size, OLD_DATA_SPACE, pretenure); 2823 AllocationSpace space = SelectSpace(size, pretenure);
2854 2824
2855 HeapObject* result; 2825 HeapObject* result;
2856 { 2826 {
2857 AllocationResult allocation = AllocateRaw(size, space, OLD_DATA_SPACE); 2827 AllocationResult allocation = AllocateRaw(size, space, OLD_SPACE);
2858 if (!allocation.To(&result)) return allocation; 2828 if (!allocation.To(&result)) return allocation;
2859 } 2829 }
2860 2830
2861 Map* map = mode == MUTABLE ? mutable_heap_number_map() : heap_number_map(); 2831 Map* map = mode == MUTABLE ? mutable_heap_number_map() : heap_number_map();
2862 HeapObject::cast(result)->set_map_no_write_barrier(map); 2832 HeapObject::cast(result)->set_map_no_write_barrier(map);
2863 HeapNumber::cast(result)->set_value(value); 2833 HeapNumber::cast(result)->set_value(value);
2864 return result; 2834 return result;
2865 } 2835 }
2866 2836
2867 2837
(...skipping 29 matching lines...) Expand all
2897 cell->set_type(HeapType::None()); 2867 cell->set_type(HeapType::None());
2898 return result; 2868 return result;
2899 } 2869 }
2900 2870
2901 2871
2902 AllocationResult Heap::AllocateWeakCell(HeapObject* value) { 2872 AllocationResult Heap::AllocateWeakCell(HeapObject* value) {
2903 int size = WeakCell::kSize; 2873 int size = WeakCell::kSize;
2904 STATIC_ASSERT(WeakCell::kSize <= Page::kMaxRegularHeapObjectSize); 2874 STATIC_ASSERT(WeakCell::kSize <= Page::kMaxRegularHeapObjectSize);
2905 HeapObject* result; 2875 HeapObject* result;
2906 { 2876 {
2907 AllocationResult allocation = 2877 AllocationResult allocation = AllocateRaw(size, OLD_SPACE, OLD_SPACE);
2908 AllocateRaw(size, OLD_POINTER_SPACE, OLD_POINTER_SPACE);
2909 if (!allocation.To(&result)) return allocation; 2878 if (!allocation.To(&result)) return allocation;
2910 } 2879 }
2911 result->set_map_no_write_barrier(weak_cell_map()); 2880 result->set_map_no_write_barrier(weak_cell_map());
2912 WeakCell::cast(result)->initialize(value); 2881 WeakCell::cast(result)->initialize(value);
2913 WeakCell::cast(result)->set_next(undefined_value(), SKIP_WRITE_BARRIER); 2882 WeakCell::cast(result)->set_next(undefined_value(), SKIP_WRITE_BARRIER);
2914 return result; 2883 return result;
2915 } 2884 }
2916 2885
2917 2886
2918 void Heap::CreateApiObjects() { 2887 void Heap::CreateApiObjects() {
(...skipping 534 matching lines...) Expand 10 before | Expand all | Expand 10 after
3453 FixedTypedArrayBase* Heap::EmptyFixedTypedArrayForMap(Map* map) { 3422 FixedTypedArrayBase* Heap::EmptyFixedTypedArrayForMap(Map* map) {
3454 return FixedTypedArrayBase::cast( 3423 return FixedTypedArrayBase::cast(
3455 roots_[RootIndexForEmptyFixedTypedArray(map->elements_kind())]); 3424 roots_[RootIndexForEmptyFixedTypedArray(map->elements_kind())]);
3456 } 3425 }
3457 3426
3458 3427
3459 AllocationResult Heap::AllocateForeign(Address address, 3428 AllocationResult Heap::AllocateForeign(Address address,
3460 PretenureFlag pretenure) { 3429 PretenureFlag pretenure) {
3461 // Statically ensure that it is safe to allocate foreigns in paged spaces. 3430 // Statically ensure that it is safe to allocate foreigns in paged spaces.
3462 STATIC_ASSERT(Foreign::kSize <= Page::kMaxRegularHeapObjectSize); 3431 STATIC_ASSERT(Foreign::kSize <= Page::kMaxRegularHeapObjectSize);
3463 AllocationSpace space = (pretenure == TENURED) ? OLD_DATA_SPACE : NEW_SPACE; 3432 AllocationSpace space = (pretenure == TENURED) ? OLD_SPACE : NEW_SPACE;
3464 Foreign* result; 3433 Foreign* result;
3465 AllocationResult allocation = Allocate(foreign_map(), space); 3434 AllocationResult allocation = Allocate(foreign_map(), space);
3466 if (!allocation.To(&result)) return allocation; 3435 if (!allocation.To(&result)) return allocation;
3467 result->set_foreign_address(address); 3436 result->set_foreign_address(address);
3468 return result; 3437 return result;
3469 } 3438 }
3470 3439
3471 3440
3472 AllocationResult Heap::AllocateByteArray(int length, PretenureFlag pretenure) { 3441 AllocationResult Heap::AllocateByteArray(int length, PretenureFlag pretenure) {
3473 if (length < 0 || length > ByteArray::kMaxLength) { 3442 if (length < 0 || length > ByteArray::kMaxLength) {
3474 v8::internal::Heap::FatalProcessOutOfMemory("invalid array length", true); 3443 v8::internal::Heap::FatalProcessOutOfMemory("invalid array length", true);
3475 } 3444 }
3476 int size = ByteArray::SizeFor(length); 3445 int size = ByteArray::SizeFor(length);
3477 AllocationSpace space = SelectSpace(size, OLD_DATA_SPACE, pretenure); 3446 AllocationSpace space = SelectSpace(size, pretenure);
3478 HeapObject* result; 3447 HeapObject* result;
3479 { 3448 {
3480 AllocationResult allocation = AllocateRaw(size, space, OLD_DATA_SPACE); 3449 AllocationResult allocation = AllocateRaw(size, space, OLD_SPACE);
3481 if (!allocation.To(&result)) return allocation; 3450 if (!allocation.To(&result)) return allocation;
3482 } 3451 }
3483 3452
3484 result->set_map_no_write_barrier(byte_array_map()); 3453 result->set_map_no_write_barrier(byte_array_map());
3485 ByteArray::cast(result)->set_length(length); 3454 ByteArray::cast(result)->set_length(length);
3486 return result; 3455 return result;
3487 } 3456 }
3488 3457
3489 3458
3490 void Heap::CreateFillerObjectAt(Address addr, int size) { 3459 void Heap::CreateFillerObjectAt(Address addr, int size) {
(...skipping 10 matching lines...) Expand all
3501 } else { 3470 } else {
3502 filler->set_map_no_write_barrier(raw_unchecked_free_space_map()); 3471 filler->set_map_no_write_barrier(raw_unchecked_free_space_map());
3503 DCHECK(filler->map() == NULL || filler->map() == free_space_map()); 3472 DCHECK(filler->map() == NULL || filler->map() == free_space_map());
3504 FreeSpace::cast(filler)->nobarrier_set_size(size); 3473 FreeSpace::cast(filler)->nobarrier_set_size(size);
3505 } 3474 }
3506 } 3475 }
3507 3476
3508 3477
3509 bool Heap::CanMoveObjectStart(HeapObject* object) { 3478 bool Heap::CanMoveObjectStart(HeapObject* object) {
3510 Address address = object->address(); 3479 Address address = object->address();
3511 bool is_in_old_pointer_space = InOldPointerSpace(address);
3512 bool is_in_old_data_space = InOldDataSpace(address);
3513 3480
3514 if (lo_space()->Contains(object)) return false; 3481 if (lo_space()->Contains(object)) return false;
3515 3482
3516 Page* page = Page::FromAddress(address); 3483 Page* page = Page::FromAddress(address);
3517 // We can move the object start if: 3484 // We can move the object start if:
3518 // (1) the object is not in old pointer or old data space, 3485 // (1) the object is not in old space,
3519 // (2) the page of the object was already swept, 3486 // (2) the page of the object was already swept,
3520 // (3) the page was already concurrently swept. This case is an optimization 3487 // (3) the page was already concurrently swept. This case is an optimization
3521 // for concurrent sweeping. The WasSwept predicate for concurrently swept 3488 // for concurrent sweeping. The WasSwept predicate for concurrently swept
3522 // pages is set after sweeping all pages. 3489 // pages is set after sweeping all pages.
3523 return (!is_in_old_pointer_space && !is_in_old_data_space) || 3490 return !InOldSpace(address) || page->WasSwept() || page->SweepingCompleted();
3524 page->WasSwept() || page->SweepingCompleted();
3525 } 3491 }
3526 3492
3527 3493
3528 void Heap::AdjustLiveBytes(Address address, int by, InvocationMode mode) { 3494 void Heap::AdjustLiveBytes(Address address, int by, InvocationMode mode) {
3529 if (incremental_marking()->IsMarking() && 3495 if (incremental_marking()->IsMarking() &&
3530 Marking::IsBlack(Marking::MarkBitFrom(address))) { 3496 Marking::IsBlack(Marking::MarkBitFrom(address))) {
3531 if (mode == FROM_GC) { 3497 if (mode == FROM_GC) {
3532 MemoryChunk::IncrementLiveBytesFromGC(address, by); 3498 MemoryChunk::IncrementLiveBytesFromGC(address, by);
3533 } else { 3499 } else {
3534 MemoryChunk::IncrementLiveBytesFromMutator(address, by); 3500 MemoryChunk::IncrementLiveBytesFromMutator(address, by);
(...skipping 96 matching lines...) Expand 10 before | Expand all | Expand 10 after
3631 profiler->UpdateObjectSizeEvent(object->address(), object->Size()); 3597 profiler->UpdateObjectSizeEvent(object->address(), object->Size());
3632 } 3598 }
3633 } 3599 }
3634 3600
3635 3601
3636 AllocationResult Heap::AllocateExternalArray(int length, 3602 AllocationResult Heap::AllocateExternalArray(int length,
3637 ExternalArrayType array_type, 3603 ExternalArrayType array_type,
3638 void* external_pointer, 3604 void* external_pointer,
3639 PretenureFlag pretenure) { 3605 PretenureFlag pretenure) {
3640 int size = ExternalArray::kAlignedSize; 3606 int size = ExternalArray::kAlignedSize;
3641 AllocationSpace space = SelectSpace(size, OLD_DATA_SPACE, pretenure); 3607 AllocationSpace space = SelectSpace(size, pretenure);
3642 HeapObject* result; 3608 HeapObject* result;
3643 { 3609 {
3644 AllocationResult allocation = AllocateRaw(size, space, OLD_DATA_SPACE); 3610 AllocationResult allocation = AllocateRaw(size, space, OLD_SPACE);
3645 if (!allocation.To(&result)) return allocation; 3611 if (!allocation.To(&result)) return allocation;
3646 } 3612 }
3647 3613
3648 result->set_map_no_write_barrier(MapForExternalArrayType(array_type)); 3614 result->set_map_no_write_barrier(MapForExternalArrayType(array_type));
3649 ExternalArray::cast(result)->set_length(length); 3615 ExternalArray::cast(result)->set_length(length);
3650 ExternalArray::cast(result)->set_external_pointer(external_pointer); 3616 ExternalArray::cast(result)->set_external_pointer(external_pointer);
3651 return result; 3617 return result;
3652 } 3618 }
3653 3619
3654 static void ForFixedTypedArray(ExternalArrayType array_type, int* element_size, 3620 static void ForFixedTypedArray(ExternalArrayType array_type, int* element_size,
(...skipping 22 matching lines...) Expand all
3677 int element_size; 3643 int element_size;
3678 ElementsKind elements_kind; 3644 ElementsKind elements_kind;
3679 ForFixedTypedArray(array_type, &element_size, &elements_kind); 3645 ForFixedTypedArray(array_type, &element_size, &elements_kind);
3680 int size = OBJECT_POINTER_ALIGN(length * element_size + 3646 int size = OBJECT_POINTER_ALIGN(length * element_size +
3681 FixedTypedArrayBase::kDataOffset); 3647 FixedTypedArrayBase::kDataOffset);
3682 #ifndef V8_HOST_ARCH_64_BIT 3648 #ifndef V8_HOST_ARCH_64_BIT
3683 if (array_type == kExternalFloat64Array) { 3649 if (array_type == kExternalFloat64Array) {
3684 size += kPointerSize; 3650 size += kPointerSize;
3685 } 3651 }
3686 #endif 3652 #endif
3687 AllocationSpace space = SelectSpace(size, OLD_DATA_SPACE, pretenure); 3653 AllocationSpace space = SelectSpace(size, pretenure);
3688 3654
3689 HeapObject* object; 3655 HeapObject* object;
3690 AllocationResult allocation = AllocateRaw(size, space, OLD_DATA_SPACE); 3656 AllocationResult allocation = AllocateRaw(size, space, OLD_SPACE);
3691 if (!allocation.To(&object)) return allocation; 3657 if (!allocation.To(&object)) return allocation;
3692 3658
3693 if (array_type == kExternalFloat64Array) { 3659 if (array_type == kExternalFloat64Array) {
3694 object = EnsureDoubleAligned(this, object, size); 3660 object = EnsureDoubleAligned(this, object, size);
3695 } 3661 }
3696 3662
3697 object->set_map(MapForFixedTypedArray(array_type)); 3663 object->set_map(MapForFixedTypedArray(array_type));
3698 FixedTypedArrayBase* elements = FixedTypedArrayBase::cast(object); 3664 FixedTypedArrayBase* elements = FixedTypedArrayBase::cast(object);
3699 elements->set_length(length); 3665 elements->set_length(length);
3700 memset(elements->DataPtr(), 0, elements->DataSize()); 3666 memset(elements->DataPtr(), 0, elements->DataSize());
(...skipping 143 matching lines...) Expand 10 before | Expand all | Expand 10 after
3844 } 3810 }
3845 } 3811 }
3846 3812
3847 3813
3848 AllocationResult Heap::Allocate(Map* map, AllocationSpace space, 3814 AllocationResult Heap::Allocate(Map* map, AllocationSpace space,
3849 AllocationSite* allocation_site) { 3815 AllocationSite* allocation_site) {
3850 DCHECK(gc_state_ == NOT_IN_GC); 3816 DCHECK(gc_state_ == NOT_IN_GC);
3851 DCHECK(map->instance_type() != MAP_TYPE); 3817 DCHECK(map->instance_type() != MAP_TYPE);
3852 // If allocation failures are disallowed, we may allocate in a different 3818 // If allocation failures are disallowed, we may allocate in a different
3853 // space when new space is full and the object is not a large object. 3819 // space when new space is full and the object is not a large object.
3854 AllocationSpace retry_space = 3820 AllocationSpace retry_space = (space != NEW_SPACE) ? space : OLD_SPACE;
3855 (space != NEW_SPACE) ? space : TargetSpaceId(map->instance_type());
3856 int size = map->instance_size(); 3821 int size = map->instance_size();
3857 if (allocation_site != NULL) { 3822 if (allocation_site != NULL) {
3858 size += AllocationMemento::kSize; 3823 size += AllocationMemento::kSize;
3859 } 3824 }
3860 HeapObject* result; 3825 HeapObject* result;
3861 AllocationResult allocation = AllocateRaw(size, space, retry_space); 3826 AllocationResult allocation = AllocateRaw(size, space, retry_space);
3862 if (!allocation.To(&result)) return allocation; 3827 if (!allocation.To(&result)) return allocation;
3863 // No need for write barrier since object is white and map is in old space. 3828 // No need for write barrier since object is white and map is in old space.
3864 result->set_map_no_write_barrier(map); 3829 result->set_map_no_write_barrier(map);
3865 if (allocation_site != NULL) { 3830 if (allocation_site != NULL) {
(...skipping 56 matching lines...) Expand 10 before | Expand all | Expand 10 after
3922 { 3887 {
3923 AllocationResult allocation = AllocateFixedArray(prop_size, pretenure); 3888 AllocationResult allocation = AllocateFixedArray(prop_size, pretenure);
3924 if (!allocation.To(&properties)) return allocation; 3889 if (!allocation.To(&properties)) return allocation;
3925 } 3890 }
3926 } else { 3891 } else {
3927 properties = empty_fixed_array(); 3892 properties = empty_fixed_array();
3928 } 3893 }
3929 3894
3930 // Allocate the JSObject. 3895 // Allocate the JSObject.
3931 int size = map->instance_size(); 3896 int size = map->instance_size();
3932 AllocationSpace space = SelectSpace(size, OLD_POINTER_SPACE, pretenure); 3897 AllocationSpace space = SelectSpace(size, pretenure);
3933 JSObject* js_obj; 3898 JSObject* js_obj;
3934 AllocationResult allocation = Allocate(map, space, allocation_site); 3899 AllocationResult allocation = Allocate(map, space, allocation_site);
3935 if (!allocation.To(&js_obj)) return allocation; 3900 if (!allocation.To(&js_obj)) return allocation;
3936 3901
3937 // Initialize the JSObject. 3902 // Initialize the JSObject.
3938 InitializeJSObjectFromMap(js_obj, properties, map); 3903 InitializeJSObjectFromMap(js_obj, properties, map);
3939 DCHECK(js_obj->HasFastElements() || js_obj->HasExternalArrayElements() || 3904 DCHECK(js_obj->HasFastElements() || js_obj->HasExternalArrayElements() ||
3940 js_obj->HasFixedTypedArrayElements()); 3905 js_obj->HasFixedTypedArrayElements());
3941 return js_obj; 3906 return js_obj;
3942 } 3907 }
(...skipping 30 matching lines...) Expand all
3973 3938
3974 DCHECK(site == NULL || AllocationSite::CanTrack(map->instance_type())); 3939 DCHECK(site == NULL || AllocationSite::CanTrack(map->instance_type()));
3975 3940
3976 WriteBarrierMode wb_mode = UPDATE_WRITE_BARRIER; 3941 WriteBarrierMode wb_mode = UPDATE_WRITE_BARRIER;
3977 3942
3978 // If we're forced to always allocate, we use the general allocation 3943 // If we're forced to always allocate, we use the general allocation
3979 // functions which may leave us with an object in old space. 3944 // functions which may leave us with an object in old space.
3980 if (always_allocate()) { 3945 if (always_allocate()) {
3981 { 3946 {
3982 AllocationResult allocation = 3947 AllocationResult allocation =
3983 AllocateRaw(object_size, NEW_SPACE, OLD_POINTER_SPACE); 3948 AllocateRaw(object_size, NEW_SPACE, OLD_SPACE);
3984 if (!allocation.To(&clone)) return allocation; 3949 if (!allocation.To(&clone)) return allocation;
3985 } 3950 }
3986 Address clone_address = clone->address(); 3951 Address clone_address = clone->address();
3987 CopyBlock(clone_address, source->address(), object_size); 3952 CopyBlock(clone_address, source->address(), object_size);
3988 3953
3989 // Update write barrier for all tagged fields that lie beyond the header. 3954 // Update write barrier for all tagged fields that lie beyond the header.
3990 const int start_offset = JSObject::kHeaderSize; 3955 const int start_offset = JSObject::kHeaderSize;
3991 const int end_offset = object_size; 3956 const int end_offset = object_size;
3992 3957
3993 #if V8_DOUBLE_FIELDS_UNBOXING 3958 #if V8_DOUBLE_FIELDS_UNBOXING
(...skipping 130 matching lines...) Expand 10 before | Expand all | Expand 10 after
4124 4089
4125 DCHECK_LE(0, chars); 4090 DCHECK_LE(0, chars);
4126 DCHECK_GE(String::kMaxLength, chars); 4091 DCHECK_GE(String::kMaxLength, chars);
4127 if (is_one_byte) { 4092 if (is_one_byte) {
4128 map = one_byte_internalized_string_map(); 4093 map = one_byte_internalized_string_map();
4129 size = SeqOneByteString::SizeFor(chars); 4094 size = SeqOneByteString::SizeFor(chars);
4130 } else { 4095 } else {
4131 map = internalized_string_map(); 4096 map = internalized_string_map();
4132 size = SeqTwoByteString::SizeFor(chars); 4097 size = SeqTwoByteString::SizeFor(chars);
4133 } 4098 }
4134 AllocationSpace space = SelectSpace(size, OLD_DATA_SPACE, TENURED); 4099 AllocationSpace space = SelectSpace(size, TENURED);
4135 4100
4136 // Allocate string. 4101 // Allocate string.
4137 HeapObject* result; 4102 HeapObject* result;
4138 { 4103 {
4139 AllocationResult allocation = AllocateRaw(size, space, OLD_DATA_SPACE); 4104 AllocationResult allocation = AllocateRaw(size, space, OLD_SPACE);
4140 if (!allocation.To(&result)) return allocation; 4105 if (!allocation.To(&result)) return allocation;
4141 } 4106 }
4142 4107
4143 result->set_map_no_write_barrier(map); 4108 result->set_map_no_write_barrier(map);
4144 // Set length and hash fields of the allocated string. 4109 // Set length and hash fields of the allocated string.
4145 String* answer = String::cast(result); 4110 String* answer = String::cast(result);
4146 answer->set_length(chars); 4111 answer->set_length(chars);
4147 answer->set_hash_field(hash_field); 4112 answer->set_hash_field(hash_field);
4148 4113
4149 DCHECK_EQ(size, answer->Size()); 4114 DCHECK_EQ(size, answer->Size());
(...skipping 17 matching lines...) Expand all
4167 template AllocationResult Heap::AllocateInternalizedStringImpl<false>( 4132 template AllocationResult Heap::AllocateInternalizedStringImpl<false>(
4168 Vector<const char>, int, uint32_t); 4133 Vector<const char>, int, uint32_t);
4169 4134
4170 4135
4171 AllocationResult Heap::AllocateRawOneByteString(int length, 4136 AllocationResult Heap::AllocateRawOneByteString(int length,
4172 PretenureFlag pretenure) { 4137 PretenureFlag pretenure) {
4173 DCHECK_LE(0, length); 4138 DCHECK_LE(0, length);
4174 DCHECK_GE(String::kMaxLength, length); 4139 DCHECK_GE(String::kMaxLength, length);
4175 int size = SeqOneByteString::SizeFor(length); 4140 int size = SeqOneByteString::SizeFor(length);
4176 DCHECK(size <= SeqOneByteString::kMaxSize); 4141 DCHECK(size <= SeqOneByteString::kMaxSize);
4177 AllocationSpace space = SelectSpace(size, OLD_DATA_SPACE, pretenure); 4142 AllocationSpace space = SelectSpace(size, pretenure);
4178 4143
4179 HeapObject* result; 4144 HeapObject* result;
4180 { 4145 {
4181 AllocationResult allocation = AllocateRaw(size, space, OLD_DATA_SPACE); 4146 AllocationResult allocation = AllocateRaw(size, space, OLD_SPACE);
4182 if (!allocation.To(&result)) return allocation; 4147 if (!allocation.To(&result)) return allocation;
4183 } 4148 }
4184 4149
4185 // Partially initialize the object. 4150 // Partially initialize the object.
4186 result->set_map_no_write_barrier(one_byte_string_map()); 4151 result->set_map_no_write_barrier(one_byte_string_map());
4187 String::cast(result)->set_length(length); 4152 String::cast(result)->set_length(length);
4188 String::cast(result)->set_hash_field(String::kEmptyHashField); 4153 String::cast(result)->set_hash_field(String::kEmptyHashField);
4189 DCHECK_EQ(size, HeapObject::cast(result)->Size()); 4154 DCHECK_EQ(size, HeapObject::cast(result)->Size());
4190 4155
4191 return result; 4156 return result;
4192 } 4157 }
4193 4158
4194 4159
4195 AllocationResult Heap::AllocateRawTwoByteString(int length, 4160 AllocationResult Heap::AllocateRawTwoByteString(int length,
4196 PretenureFlag pretenure) { 4161 PretenureFlag pretenure) {
4197 DCHECK_LE(0, length); 4162 DCHECK_LE(0, length);
4198 DCHECK_GE(String::kMaxLength, length); 4163 DCHECK_GE(String::kMaxLength, length);
4199 int size = SeqTwoByteString::SizeFor(length); 4164 int size = SeqTwoByteString::SizeFor(length);
4200 DCHECK(size <= SeqTwoByteString::kMaxSize); 4165 DCHECK(size <= SeqTwoByteString::kMaxSize);
4201 AllocationSpace space = SelectSpace(size, OLD_DATA_SPACE, pretenure); 4166 AllocationSpace space = SelectSpace(size, pretenure);
4202 4167
4203 HeapObject* result; 4168 HeapObject* result;
4204 { 4169 {
4205 AllocationResult allocation = AllocateRaw(size, space, OLD_DATA_SPACE); 4170 AllocationResult allocation = AllocateRaw(size, space, OLD_SPACE);
4206 if (!allocation.To(&result)) return allocation; 4171 if (!allocation.To(&result)) return allocation;
4207 } 4172 }
4208 4173
4209 // Partially initialize the object. 4174 // Partially initialize the object.
4210 result->set_map_no_write_barrier(string_map()); 4175 result->set_map_no_write_barrier(string_map());
4211 String::cast(result)->set_length(length); 4176 String::cast(result)->set_length(length);
4212 String::cast(result)->set_hash_field(String::kEmptyHashField); 4177 String::cast(result)->set_hash_field(String::kEmptyHashField);
4213 DCHECK_EQ(size, HeapObject::cast(result)->Size()); 4178 DCHECK_EQ(size, HeapObject::cast(result)->Size());
4214 return result; 4179 return result;
4215 } 4180 }
4216 4181
4217 4182
4218 AllocationResult Heap::AllocateEmptyFixedArray() { 4183 AllocationResult Heap::AllocateEmptyFixedArray() {
4219 int size = FixedArray::SizeFor(0); 4184 int size = FixedArray::SizeFor(0);
4220 HeapObject* result; 4185 HeapObject* result;
4221 { 4186 {
4222 AllocationResult allocation = 4187 AllocationResult allocation = AllocateRaw(size, OLD_SPACE, OLD_SPACE);
4223 AllocateRaw(size, OLD_DATA_SPACE, OLD_DATA_SPACE);
4224 if (!allocation.To(&result)) return allocation; 4188 if (!allocation.To(&result)) return allocation;
4225 } 4189 }
4226 // Initialize the object. 4190 // Initialize the object.
4227 result->set_map_no_write_barrier(fixed_array_map()); 4191 result->set_map_no_write_barrier(fixed_array_map());
4228 FixedArray::cast(result)->set_length(0); 4192 FixedArray::cast(result)->set_length(0);
4229 return result; 4193 return result;
4230 } 4194 }
4231 4195
4232 4196
4233 AllocationResult Heap::AllocateEmptyExternalArray( 4197 AllocationResult Heap::AllocateEmptyExternalArray(
(...skipping 101 matching lines...) Expand 10 before | Expand all | Expand 10 after
4335 return obj; 4299 return obj;
4336 } 4300 }
4337 4301
4338 4302
4339 AllocationResult Heap::AllocateRawFixedArray(int length, 4303 AllocationResult Heap::AllocateRawFixedArray(int length,
4340 PretenureFlag pretenure) { 4304 PretenureFlag pretenure) {
4341 if (length < 0 || length > FixedArray::kMaxLength) { 4305 if (length < 0 || length > FixedArray::kMaxLength) {
4342 v8::internal::Heap::FatalProcessOutOfMemory("invalid array length", true); 4306 v8::internal::Heap::FatalProcessOutOfMemory("invalid array length", true);
4343 } 4307 }
4344 int size = FixedArray::SizeFor(length); 4308 int size = FixedArray::SizeFor(length);
4345 AllocationSpace space = SelectSpace(size, OLD_POINTER_SPACE, pretenure); 4309 AllocationSpace space = SelectSpace(size, pretenure);
4346 4310
4347 return AllocateRaw(size, space, OLD_POINTER_SPACE); 4311 return AllocateRaw(size, space, OLD_SPACE);
4348 } 4312 }
4349 4313
4350 4314
4351 AllocationResult Heap::AllocateFixedArrayWithFiller(int length, 4315 AllocationResult Heap::AllocateFixedArrayWithFiller(int length,
4352 PretenureFlag pretenure, 4316 PretenureFlag pretenure,
4353 Object* filler) { 4317 Object* filler) {
4354 DCHECK(length >= 0); 4318 DCHECK(length >= 0);
4355 DCHECK(empty_fixed_array()->IsFixedArray()); 4319 DCHECK(empty_fixed_array()->IsFixedArray());
4356 if (length == 0) return empty_fixed_array(); 4320 if (length == 0) return empty_fixed_array();
4357 4321
(...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after
4406 4370
4407 AllocationResult Heap::AllocateRawFixedDoubleArray(int length, 4371 AllocationResult Heap::AllocateRawFixedDoubleArray(int length,
4408 PretenureFlag pretenure) { 4372 PretenureFlag pretenure) {
4409 if (length < 0 || length > FixedDoubleArray::kMaxLength) { 4373 if (length < 0 || length > FixedDoubleArray::kMaxLength) {
4410 v8::internal::Heap::FatalProcessOutOfMemory("invalid array length", true); 4374 v8::internal::Heap::FatalProcessOutOfMemory("invalid array length", true);
4411 } 4375 }
4412 int size = FixedDoubleArray::SizeFor(length); 4376 int size = FixedDoubleArray::SizeFor(length);
4413 #ifndef V8_HOST_ARCH_64_BIT 4377 #ifndef V8_HOST_ARCH_64_BIT
4414 size += kPointerSize; 4378 size += kPointerSize;
4415 #endif 4379 #endif
4416 AllocationSpace space = SelectSpace(size, OLD_DATA_SPACE, pretenure); 4380 AllocationSpace space = SelectSpace(size, pretenure);
4417 4381
4418 HeapObject* object; 4382 HeapObject* object;
4419 { 4383 {
4420 AllocationResult allocation = AllocateRaw(size, space, OLD_DATA_SPACE); 4384 AllocationResult allocation = AllocateRaw(size, space, OLD_SPACE);
4421 if (!allocation.To(&object)) return allocation; 4385 if (!allocation.To(&object)) return allocation;
4422 } 4386 }
4423 4387
4424 return EnsureDoubleAligned(this, object, size); 4388 return EnsureDoubleAligned(this, object, size);
4425 } 4389 }
4426 4390
4427 4391
4428 AllocationResult Heap::AllocateConstantPoolArray( 4392 AllocationResult Heap::AllocateConstantPoolArray(
4429 const ConstantPoolArray::NumberOfEntries& small) { 4393 const ConstantPoolArray::NumberOfEntries& small) {
4430 CHECK(small.are_in_range(0, ConstantPoolArray::kMaxSmallEntriesPerType)); 4394 CHECK(small.are_in_range(0, ConstantPoolArray::kMaxSmallEntriesPerType));
4431 int size = ConstantPoolArray::SizeFor(small); 4395 int size = ConstantPoolArray::SizeFor(small);
4432 #ifndef V8_HOST_ARCH_64_BIT 4396 #ifndef V8_HOST_ARCH_64_BIT
4433 size += kPointerSize; 4397 size += kPointerSize;
4434 #endif 4398 #endif
4435 AllocationSpace space = SelectSpace(size, OLD_POINTER_SPACE, TENURED); 4399 AllocationSpace space = SelectSpace(size, TENURED);
4436 4400
4437 HeapObject* object; 4401 HeapObject* object;
4438 { 4402 {
4439 AllocationResult allocation = AllocateRaw(size, space, OLD_POINTER_SPACE); 4403 AllocationResult allocation = AllocateRaw(size, space, OLD_SPACE);
4440 if (!allocation.To(&object)) return allocation; 4404 if (!allocation.To(&object)) return allocation;
4441 } 4405 }
4442 object = EnsureDoubleAligned(this, object, size); 4406 object = EnsureDoubleAligned(this, object, size);
4443 object->set_map_no_write_barrier(constant_pool_array_map()); 4407 object->set_map_no_write_barrier(constant_pool_array_map());
4444 4408
4445 ConstantPoolArray* constant_pool = ConstantPoolArray::cast(object); 4409 ConstantPoolArray* constant_pool = ConstantPoolArray::cast(object);
4446 constant_pool->Init(small); 4410 constant_pool->Init(small);
4447 constant_pool->ClearPtrEntries(isolate()); 4411 constant_pool->ClearPtrEntries(isolate());
4448 return constant_pool; 4412 return constant_pool;
4449 } 4413 }
4450 4414
4451 4415
4452 AllocationResult Heap::AllocateExtendedConstantPoolArray( 4416 AllocationResult Heap::AllocateExtendedConstantPoolArray(
4453 const ConstantPoolArray::NumberOfEntries& small, 4417 const ConstantPoolArray::NumberOfEntries& small,
4454 const ConstantPoolArray::NumberOfEntries& extended) { 4418 const ConstantPoolArray::NumberOfEntries& extended) {
4455 CHECK(small.are_in_range(0, ConstantPoolArray::kMaxSmallEntriesPerType)); 4419 CHECK(small.are_in_range(0, ConstantPoolArray::kMaxSmallEntriesPerType));
4456 CHECK(extended.are_in_range(0, kMaxInt)); 4420 CHECK(extended.are_in_range(0, kMaxInt));
4457 int size = ConstantPoolArray::SizeForExtended(small, extended); 4421 int size = ConstantPoolArray::SizeForExtended(small, extended);
4458 #ifndef V8_HOST_ARCH_64_BIT 4422 #ifndef V8_HOST_ARCH_64_BIT
4459 size += kPointerSize; 4423 size += kPointerSize;
4460 #endif 4424 #endif
4461 AllocationSpace space = SelectSpace(size, OLD_POINTER_SPACE, TENURED); 4425 AllocationSpace space = SelectSpace(size, TENURED);
4462 4426
4463 HeapObject* object; 4427 HeapObject* object;
4464 { 4428 {
4465 AllocationResult allocation = AllocateRaw(size, space, OLD_POINTER_SPACE); 4429 AllocationResult allocation = AllocateRaw(size, space, OLD_SPACE);
4466 if (!allocation.To(&object)) return allocation; 4430 if (!allocation.To(&object)) return allocation;
4467 } 4431 }
4468 object = EnsureDoubleAligned(this, object, size); 4432 object = EnsureDoubleAligned(this, object, size);
4469 object->set_map_no_write_barrier(constant_pool_array_map()); 4433 object->set_map_no_write_barrier(constant_pool_array_map());
4470 4434
4471 ConstantPoolArray* constant_pool = ConstantPoolArray::cast(object); 4435 ConstantPoolArray* constant_pool = ConstantPoolArray::cast(object);
4472 constant_pool->InitExtended(small, extended); 4436 constant_pool->InitExtended(small, extended);
4473 constant_pool->ClearPtrEntries(isolate()); 4437 constant_pool->ClearPtrEntries(isolate());
4474 return constant_pool; 4438 return constant_pool;
4475 } 4439 }
4476 4440
4477 4441
4478 AllocationResult Heap::AllocateEmptyConstantPoolArray() { 4442 AllocationResult Heap::AllocateEmptyConstantPoolArray() {
4479 ConstantPoolArray::NumberOfEntries small(0, 0, 0, 0); 4443 ConstantPoolArray::NumberOfEntries small(0, 0, 0, 0);
4480 int size = ConstantPoolArray::SizeFor(small); 4444 int size = ConstantPoolArray::SizeFor(small);
4481 HeapObject* result; 4445 HeapObject* result;
4482 { 4446 {
4483 AllocationResult allocation = 4447 AllocationResult allocation = AllocateRaw(size, OLD_SPACE, OLD_SPACE);
4484 AllocateRaw(size, OLD_DATA_SPACE, OLD_DATA_SPACE);
4485 if (!allocation.To(&result)) return allocation; 4448 if (!allocation.To(&result)) return allocation;
4486 } 4449 }
4487 result->set_map_no_write_barrier(constant_pool_array_map()); 4450 result->set_map_no_write_barrier(constant_pool_array_map());
4488 ConstantPoolArray::cast(result)->Init(small); 4451 ConstantPoolArray::cast(result)->Init(small);
4489 return result; 4452 return result;
4490 } 4453 }
4491 4454
4492 4455
4493 AllocationResult Heap::AllocateSymbol() { 4456 AllocationResult Heap::AllocateSymbol() {
4494 // Statically ensure that it is safe to allocate symbols in paged spaces. 4457 // Statically ensure that it is safe to allocate symbols in paged spaces.
4495 STATIC_ASSERT(Symbol::kSize <= Page::kMaxRegularHeapObjectSize); 4458 STATIC_ASSERT(Symbol::kSize <= Page::kMaxRegularHeapObjectSize);
4496 4459
4497 HeapObject* result; 4460 HeapObject* result;
4498 AllocationResult allocation = 4461 AllocationResult allocation =
4499 AllocateRaw(Symbol::kSize, OLD_POINTER_SPACE, OLD_POINTER_SPACE); 4462 AllocateRaw(Symbol::kSize, OLD_SPACE, OLD_SPACE);
4500 if (!allocation.To(&result)) return allocation; 4463 if (!allocation.To(&result)) return allocation;
4501 4464
4502 result->set_map_no_write_barrier(symbol_map()); 4465 result->set_map_no_write_barrier(symbol_map());
4503 4466
4504 // Generate a random hash value. 4467 // Generate a random hash value.
4505 int hash; 4468 int hash;
4506 int attempts = 0; 4469 int attempts = 0;
4507 do { 4470 do {
4508 hash = isolate()->random_number_generator()->NextInt() & Name::kHashBitMask; 4471 hash = isolate()->random_number_generator()->NextInt() & Name::kHashBitMask;
4509 attempts++; 4472 attempts++;
(...skipping 17 matching lines...) Expand all
4527 case NAME##_TYPE: \ 4490 case NAME##_TYPE: \
4528 map = name##_map(); \ 4491 map = name##_map(); \
4529 break; 4492 break;
4530 STRUCT_LIST(MAKE_CASE) 4493 STRUCT_LIST(MAKE_CASE)
4531 #undef MAKE_CASE 4494 #undef MAKE_CASE
4532 default: 4495 default:
4533 UNREACHABLE(); 4496 UNREACHABLE();
4534 return exception(); 4497 return exception();
4535 } 4498 }
4536 int size = map->instance_size(); 4499 int size = map->instance_size();
4537 AllocationSpace space = SelectSpace(size, OLD_POINTER_SPACE, TENURED); 4500 AllocationSpace space = SelectSpace(size, TENURED);
4538 Struct* result; 4501 Struct* result;
4539 { 4502 {
4540 AllocationResult allocation = Allocate(map, space); 4503 AllocationResult allocation = Allocate(map, space);
4541 if (!allocation.To(&result)) return allocation; 4504 if (!allocation.To(&result)) return allocation;
4542 } 4505 }
4543 result->InitializeBody(size); 4506 result->InitializeBody(size);
4544 return result; 4507 return result;
4545 } 4508 }
4546 4509
4547 4510
(...skipping 243 matching lines...) Expand 10 before | Expand all | Expand 10 after
4791 4754
4792 PrintF("\n"); 4755 PrintF("\n");
4793 PrintF("Number of handles : %d\n", HandleScope::NumberOfHandles(isolate_)); 4756 PrintF("Number of handles : %d\n", HandleScope::NumberOfHandles(isolate_));
4794 isolate_->global_handles()->PrintStats(); 4757 isolate_->global_handles()->PrintStats();
4795 PrintF("\n"); 4758 PrintF("\n");
4796 4759
4797 PrintF("Heap statistics : "); 4760 PrintF("Heap statistics : ");
4798 isolate_->memory_allocator()->ReportStatistics(); 4761 isolate_->memory_allocator()->ReportStatistics();
4799 PrintF("To space : "); 4762 PrintF("To space : ");
4800 new_space_.ReportStatistics(); 4763 new_space_.ReportStatistics();
4801 PrintF("Old pointer space : "); 4764 PrintF("Old space : ");
4802 old_pointer_space_->ReportStatistics(); 4765 old_space_->ReportStatistics();
4803 PrintF("Old data space : ");
4804 old_data_space_->ReportStatistics();
4805 PrintF("Code space : "); 4766 PrintF("Code space : ");
4806 code_space_->ReportStatistics(); 4767 code_space_->ReportStatistics();
4807 PrintF("Map space : "); 4768 PrintF("Map space : ");
4808 map_space_->ReportStatistics(); 4769 map_space_->ReportStatistics();
4809 PrintF("Cell space : "); 4770 PrintF("Cell space : ");
4810 cell_space_->ReportStatistics(); 4771 cell_space_->ReportStatistics();
4811 PrintF("PropertyCell space : "); 4772 PrintF("PropertyCell space : ");
4812 property_cell_space_->ReportStatistics(); 4773 property_cell_space_->ReportStatistics();
4813 PrintF("Large object space : "); 4774 PrintF("Large object space : ");
4814 lo_space_->ReportStatistics(); 4775 lo_space_->ReportStatistics();
4815 PrintF(">>>>>> ========================================= >>>>>>\n"); 4776 PrintF(">>>>>> ========================================= >>>>>>\n");
4816 } 4777 }
4817 4778
4818 #endif // DEBUG 4779 #endif // DEBUG
4819 4780
4820 bool Heap::Contains(HeapObject* value) { return Contains(value->address()); } 4781 bool Heap::Contains(HeapObject* value) { return Contains(value->address()); }
4821 4782
4822 4783
4823 bool Heap::Contains(Address addr) { 4784 bool Heap::Contains(Address addr) {
4824 if (isolate_->memory_allocator()->IsOutsideAllocatedSpace(addr)) return false; 4785 if (isolate_->memory_allocator()->IsOutsideAllocatedSpace(addr)) return false;
4825 return HasBeenSetUp() && 4786 return HasBeenSetUp() &&
4826 (new_space_.ToSpaceContains(addr) || 4787 (new_space_.ToSpaceContains(addr) || old_space_->Contains(addr) ||
4827 old_pointer_space_->Contains(addr) || 4788 code_space_->Contains(addr) || map_space_->Contains(addr) ||
4828 old_data_space_->Contains(addr) || code_space_->Contains(addr) || 4789 cell_space_->Contains(addr) || property_cell_space_->Contains(addr) ||
4829 map_space_->Contains(addr) || cell_space_->Contains(addr) ||
4830 property_cell_space_->Contains(addr) ||
4831 lo_space_->SlowContains(addr)); 4790 lo_space_->SlowContains(addr));
4832 } 4791 }
4833 4792
4834 4793
4835 bool Heap::InSpace(HeapObject* value, AllocationSpace space) { 4794 bool Heap::InSpace(HeapObject* value, AllocationSpace space) {
4836 return InSpace(value->address(), space); 4795 return InSpace(value->address(), space);
4837 } 4796 }
4838 4797
4839 4798
4840 bool Heap::InSpace(Address addr, AllocationSpace space) { 4799 bool Heap::InSpace(Address addr, AllocationSpace space) {
4841 if (isolate_->memory_allocator()->IsOutsideAllocatedSpace(addr)) return false; 4800 if (isolate_->memory_allocator()->IsOutsideAllocatedSpace(addr)) return false;
4842 if (!HasBeenSetUp()) return false; 4801 if (!HasBeenSetUp()) return false;
4843 4802
4844 switch (space) { 4803 switch (space) {
4845 case NEW_SPACE: 4804 case NEW_SPACE:
4846 return new_space_.ToSpaceContains(addr); 4805 return new_space_.ToSpaceContains(addr);
4847 case OLD_POINTER_SPACE: 4806 case OLD_SPACE:
4848 return old_pointer_space_->Contains(addr); 4807 return old_space_->Contains(addr);
4849 case OLD_DATA_SPACE:
4850 return old_data_space_->Contains(addr);
4851 case CODE_SPACE: 4808 case CODE_SPACE:
4852 return code_space_->Contains(addr); 4809 return code_space_->Contains(addr);
4853 case MAP_SPACE: 4810 case MAP_SPACE:
4854 return map_space_->Contains(addr); 4811 return map_space_->Contains(addr);
4855 case CELL_SPACE: 4812 case CELL_SPACE:
4856 return cell_space_->Contains(addr); 4813 return cell_space_->Contains(addr);
4857 case PROPERTY_CELL_SPACE: 4814 case PROPERTY_CELL_SPACE:
4858 return property_cell_space_->Contains(addr); 4815 return property_cell_space_->Contains(addr);
4859 case LO_SPACE: 4816 case LO_SPACE:
4860 return lo_space_->SlowContains(addr); 4817 return lo_space_->SlowContains(addr);
(...skipping 29 matching lines...) Expand all
4890 } 4847 }
4891 4848
4892 VerifyPointersVisitor visitor; 4849 VerifyPointersVisitor visitor;
4893 IterateRoots(&visitor, VISIT_ONLY_STRONG); 4850 IterateRoots(&visitor, VISIT_ONLY_STRONG);
4894 4851
4895 VerifySmisVisitor smis_visitor; 4852 VerifySmisVisitor smis_visitor;
4896 IterateSmiRoots(&smis_visitor); 4853 IterateSmiRoots(&smis_visitor);
4897 4854
4898 new_space_.Verify(); 4855 new_space_.Verify();
4899 4856
4900 old_pointer_space_->Verify(&visitor); 4857 old_space_->Verify(&visitor);
4901 map_space_->Verify(&visitor); 4858 map_space_->Verify(&visitor);
4902 4859
4903 VerifyPointersVisitor no_dirty_regions_visitor; 4860 VerifyPointersVisitor no_dirty_regions_visitor;
4904 old_data_space_->Verify(&no_dirty_regions_visitor);
4905 code_space_->Verify(&no_dirty_regions_visitor); 4861 code_space_->Verify(&no_dirty_regions_visitor);
4906 cell_space_->Verify(&no_dirty_regions_visitor); 4862 cell_space_->Verify(&no_dirty_regions_visitor);
4907 property_cell_space_->Verify(&no_dirty_regions_visitor); 4863 property_cell_space_->Verify(&no_dirty_regions_visitor);
4908 4864
4909 lo_space_->Verify(); 4865 lo_space_->Verify();
4910 } 4866 }
4911 #endif 4867 #endif
4912 4868
4913 4869
4914 void Heap::ZapFromSpace() { 4870 void Heap::ZapFromSpace() {
(...skipping 297 matching lines...) Expand 10 before | Expand all | Expand 10 after
5212 5168
5213 5169
5214 bool Heap::ConfigureHeapDefault() { return ConfigureHeap(0, 0, 0, 0); } 5170 bool Heap::ConfigureHeapDefault() { return ConfigureHeap(0, 0, 0, 0); }
5215 5171
5216 5172
5217 void Heap::RecordStats(HeapStats* stats, bool take_snapshot) { 5173 void Heap::RecordStats(HeapStats* stats, bool take_snapshot) {
5218 *stats->start_marker = HeapStats::kStartMarker; 5174 *stats->start_marker = HeapStats::kStartMarker;
5219 *stats->end_marker = HeapStats::kEndMarker; 5175 *stats->end_marker = HeapStats::kEndMarker;
5220 *stats->new_space_size = new_space_.SizeAsInt(); 5176 *stats->new_space_size = new_space_.SizeAsInt();
5221 *stats->new_space_capacity = static_cast<int>(new_space_.Capacity()); 5177 *stats->new_space_capacity = static_cast<int>(new_space_.Capacity());
5222 *stats->old_pointer_space_size = old_pointer_space_->SizeOfObjects(); 5178 *stats->old_space_size = old_space_->SizeOfObjects();
5223 *stats->old_pointer_space_capacity = old_pointer_space_->Capacity(); 5179 *stats->old_space_capacity = old_space_->Capacity();
5224 *stats->old_data_space_size = old_data_space_->SizeOfObjects();
5225 *stats->old_data_space_capacity = old_data_space_->Capacity();
5226 *stats->code_space_size = code_space_->SizeOfObjects(); 5180 *stats->code_space_size = code_space_->SizeOfObjects();
5227 *stats->code_space_capacity = code_space_->Capacity(); 5181 *stats->code_space_capacity = code_space_->Capacity();
5228 *stats->map_space_size = map_space_->SizeOfObjects(); 5182 *stats->map_space_size = map_space_->SizeOfObjects();
5229 *stats->map_space_capacity = map_space_->Capacity(); 5183 *stats->map_space_capacity = map_space_->Capacity();
5230 *stats->cell_space_size = cell_space_->SizeOfObjects(); 5184 *stats->cell_space_size = cell_space_->SizeOfObjects();
5231 *stats->cell_space_capacity = cell_space_->Capacity(); 5185 *stats->cell_space_capacity = cell_space_->Capacity();
5232 *stats->property_cell_space_size = property_cell_space_->SizeOfObjects(); 5186 *stats->property_cell_space_size = property_cell_space_->SizeOfObjects();
5233 *stats->property_cell_space_capacity = property_cell_space_->Capacity(); 5187 *stats->property_cell_space_capacity = property_cell_space_->Capacity();
5234 *stats->lo_space_size = lo_space_->Size(); 5188 *stats->lo_space_size = lo_space_->Size();
5235 isolate_->global_handles()->RecordStats(stats); 5189 isolate_->global_handles()->RecordStats(stats);
(...skipping 10 matching lines...) Expand all
5246 InstanceType type = obj->map()->instance_type(); 5200 InstanceType type = obj->map()->instance_type();
5247 DCHECK(0 <= type && type <= LAST_TYPE); 5201 DCHECK(0 <= type && type <= LAST_TYPE);
5248 stats->objects_per_type[type]++; 5202 stats->objects_per_type[type]++;
5249 stats->size_per_type[type] += obj->Size(); 5203 stats->size_per_type[type] += obj->Size();
5250 } 5204 }
5251 } 5205 }
5252 } 5206 }
5253 5207
5254 5208
5255 intptr_t Heap::PromotedSpaceSizeOfObjects() { 5209 intptr_t Heap::PromotedSpaceSizeOfObjects() {
5256 return old_pointer_space_->SizeOfObjects() + 5210 return old_space_->SizeOfObjects() + code_space_->SizeOfObjects() +
5257 old_data_space_->SizeOfObjects() + code_space_->SizeOfObjects() +
5258 map_space_->SizeOfObjects() + cell_space_->SizeOfObjects() + 5211 map_space_->SizeOfObjects() + cell_space_->SizeOfObjects() +
5259 property_cell_space_->SizeOfObjects() + lo_space_->SizeOfObjects(); 5212 property_cell_space_->SizeOfObjects() + lo_space_->SizeOfObjects();
5260 } 5213 }
5261 5214
5262 5215
5263 int64_t Heap::PromotedExternalMemorySize() { 5216 int64_t Heap::PromotedExternalMemorySize() {
5264 if (amount_of_external_allocated_memory_ <= 5217 if (amount_of_external_allocated_memory_ <=
5265 amount_of_external_allocated_memory_at_last_global_gc_) 5218 amount_of_external_allocated_memory_at_last_global_gc_)
5266 return 0; 5219 return 0;
5267 return amount_of_external_allocated_memory_ - 5220 return amount_of_external_allocated_memory_ -
(...skipping 103 matching lines...) Expand 10 before | Expand all | Expand 10 after
5371 // Set up memory allocator. 5324 // Set up memory allocator.
5372 if (!isolate_->memory_allocator()->SetUp(MaxReserved(), MaxExecutableSize())) 5325 if (!isolate_->memory_allocator()->SetUp(MaxReserved(), MaxExecutableSize()))
5373 return false; 5326 return false;
5374 5327
5375 // Set up new space. 5328 // Set up new space.
5376 if (!new_space_.SetUp(reserved_semispace_size_, max_semi_space_size_)) { 5329 if (!new_space_.SetUp(reserved_semispace_size_, max_semi_space_size_)) {
5377 return false; 5330 return false;
5378 } 5331 }
5379 new_space_top_after_last_gc_ = new_space()->top(); 5332 new_space_top_after_last_gc_ = new_space()->top();
5380 5333
5381 // Initialize old pointer space. 5334 // Initialize old space.
5382 old_pointer_space_ = new OldSpace(this, max_old_generation_size_, 5335 old_space_ =
5383 OLD_POINTER_SPACE, NOT_EXECUTABLE); 5336 new OldSpace(this, max_old_generation_size_, OLD_SPACE, NOT_EXECUTABLE);
5384 if (old_pointer_space_ == NULL) return false; 5337 if (old_space_ == NULL) return false;
5385 if (!old_pointer_space_->SetUp()) return false; 5338 if (!old_space_->SetUp()) return false;
5386
5387 // Initialize old data space.
5388 old_data_space_ = new OldSpace(this, max_old_generation_size_, OLD_DATA_SPACE,
5389 NOT_EXECUTABLE);
5390 if (old_data_space_ == NULL) return false;
5391 if (!old_data_space_->SetUp()) return false;
5392 5339
5393 if (!isolate_->code_range()->SetUp(code_range_size_)) return false; 5340 if (!isolate_->code_range()->SetUp(code_range_size_)) return false;
5394 5341
5395 // Initialize the code space, set its maximum capacity to the old 5342 // Initialize the code space, set its maximum capacity to the old
5396 // generation size. It needs executable memory. 5343 // generation size. It needs executable memory.
5397 code_space_ = 5344 code_space_ =
5398 new OldSpace(this, max_old_generation_size_, CODE_SPACE, EXECUTABLE); 5345 new OldSpace(this, max_old_generation_size_, CODE_SPACE, EXECUTABLE);
5399 if (code_space_ == NULL) return false; 5346 if (code_space_ == NULL) return false;
5400 if (!code_space_->SetUp()) return false; 5347 if (!code_space_->SetUp()) return false;
5401 5348
(...skipping 108 matching lines...) Expand 10 before | Expand all | Expand 10 after
5510 PrintF("total_sweeping_time=%.1f ", tracer_.cumulative_sweeping_duration()); 5457 PrintF("total_sweeping_time=%.1f ", tracer_.cumulative_sweeping_duration());
5511 PrintF("\n\n"); 5458 PrintF("\n\n");
5512 } 5459 }
5513 5460
5514 if (FLAG_print_max_heap_committed) { 5461 if (FLAG_print_max_heap_committed) {
5515 PrintF("\n"); 5462 PrintF("\n");
5516 PrintF("maximum_committed_by_heap=%" V8_PTR_PREFIX "d ", 5463 PrintF("maximum_committed_by_heap=%" V8_PTR_PREFIX "d ",
5517 MaximumCommittedMemory()); 5464 MaximumCommittedMemory());
5518 PrintF("maximum_committed_by_new_space=%" V8_PTR_PREFIX "d ", 5465 PrintF("maximum_committed_by_new_space=%" V8_PTR_PREFIX "d ",
5519 new_space_.MaximumCommittedMemory()); 5466 new_space_.MaximumCommittedMemory());
5520 PrintF("maximum_committed_by_old_pointer_space=%" V8_PTR_PREFIX "d ", 5467 PrintF("maximum_committed_by_old_space=%" V8_PTR_PREFIX "d ",
5521 old_data_space_->MaximumCommittedMemory()); 5468 old_space_->MaximumCommittedMemory());
5522 PrintF("maximum_committed_by_old_data_space=%" V8_PTR_PREFIX "d ",
5523 old_pointer_space_->MaximumCommittedMemory());
5524 PrintF("maximum_committed_by_old_data_space=%" V8_PTR_PREFIX "d ",
5525 old_pointer_space_->MaximumCommittedMemory());
5526 PrintF("maximum_committed_by_code_space=%" V8_PTR_PREFIX "d ", 5469 PrintF("maximum_committed_by_code_space=%" V8_PTR_PREFIX "d ",
5527 code_space_->MaximumCommittedMemory()); 5470 code_space_->MaximumCommittedMemory());
5528 PrintF("maximum_committed_by_map_space=%" V8_PTR_PREFIX "d ", 5471 PrintF("maximum_committed_by_map_space=%" V8_PTR_PREFIX "d ",
5529 map_space_->MaximumCommittedMemory()); 5472 map_space_->MaximumCommittedMemory());
5530 PrintF("maximum_committed_by_cell_space=%" V8_PTR_PREFIX "d ", 5473 PrintF("maximum_committed_by_cell_space=%" V8_PTR_PREFIX "d ",
5531 cell_space_->MaximumCommittedMemory()); 5474 cell_space_->MaximumCommittedMemory());
5532 PrintF("maximum_committed_by_property_space=%" V8_PTR_PREFIX "d ", 5475 PrintF("maximum_committed_by_property_space=%" V8_PTR_PREFIX "d ",
5533 property_cell_space_->MaximumCommittedMemory()); 5476 property_cell_space_->MaximumCommittedMemory());
5534 PrintF("maximum_committed_by_lo_space=%" V8_PTR_PREFIX "d ", 5477 PrintF("maximum_committed_by_lo_space=%" V8_PTR_PREFIX "d ",
5535 lo_space_->MaximumCommittedMemory()); 5478 lo_space_->MaximumCommittedMemory());
5536 PrintF("\n\n"); 5479 PrintF("\n\n");
5537 } 5480 }
5538 5481
5539 if (FLAG_verify_predictable) { 5482 if (FLAG_verify_predictable) {
5540 PrintAlloctionsHash(); 5483 PrintAlloctionsHash();
5541 } 5484 }
5542 5485
5543 TearDownArrayBuffers(); 5486 TearDownArrayBuffers();
5544 5487
5545 isolate_->global_handles()->TearDown(); 5488 isolate_->global_handles()->TearDown();
5546 5489
5547 external_string_table_.TearDown(); 5490 external_string_table_.TearDown();
5548 5491
5549 mark_compact_collector()->TearDown(); 5492 mark_compact_collector()->TearDown();
5550 5493
5551 new_space_.TearDown(); 5494 new_space_.TearDown();
5552 5495
5553 if (old_pointer_space_ != NULL) { 5496 if (old_space_ != NULL) {
5554 old_pointer_space_->TearDown(); 5497 old_space_->TearDown();
5555 delete old_pointer_space_; 5498 delete old_space_;
5556 old_pointer_space_ = NULL; 5499 old_space_ = NULL;
5557 }
5558
5559 if (old_data_space_ != NULL) {
5560 old_data_space_->TearDown();
5561 delete old_data_space_;
5562 old_data_space_ = NULL;
5563 } 5500 }
5564 5501
5565 if (code_space_ != NULL) { 5502 if (code_space_ != NULL) {
5566 code_space_->TearDown(); 5503 code_space_->TearDown();
5567 delete code_space_; 5504 delete code_space_;
5568 code_space_ = NULL; 5505 code_space_ = NULL;
5569 } 5506 }
5570 5507
5571 if (map_space_ != NULL) { 5508 if (map_space_ != NULL) {
5572 map_space_->TearDown(); 5509 map_space_->TearDown();
(...skipping 121 matching lines...) Expand 10 before | Expand all | Expand 10 after
5694 isolate_->handle_scope_implementer()->Iterate(&v); 5631 isolate_->handle_scope_implementer()->Iterate(&v);
5695 } 5632 }
5696 5633
5697 #endif 5634 #endif
5698 5635
5699 5636
5700 Space* AllSpaces::next() { 5637 Space* AllSpaces::next() {
5701 switch (counter_++) { 5638 switch (counter_++) {
5702 case NEW_SPACE: 5639 case NEW_SPACE:
5703 return heap_->new_space(); 5640 return heap_->new_space();
5704 case OLD_POINTER_SPACE: 5641 case OLD_SPACE:
5705 return heap_->old_pointer_space(); 5642 return heap_->old_space();
5706 case OLD_DATA_SPACE:
5707 return heap_->old_data_space();
5708 case CODE_SPACE: 5643 case CODE_SPACE:
5709 return heap_->code_space(); 5644 return heap_->code_space();
5710 case MAP_SPACE: 5645 case MAP_SPACE:
5711 return heap_->map_space(); 5646 return heap_->map_space();
5712 case CELL_SPACE: 5647 case CELL_SPACE:
5713 return heap_->cell_space(); 5648 return heap_->cell_space();
5714 case PROPERTY_CELL_SPACE: 5649 case PROPERTY_CELL_SPACE:
5715 return heap_->property_cell_space(); 5650 return heap_->property_cell_space();
5716 case LO_SPACE: 5651 case LO_SPACE:
5717 return heap_->lo_space(); 5652 return heap_->lo_space();
5718 default: 5653 default:
5719 return NULL; 5654 return NULL;
5720 } 5655 }
5721 } 5656 }
5722 5657
5723 5658
5724 PagedSpace* PagedSpaces::next() { 5659 PagedSpace* PagedSpaces::next() {
5725 switch (counter_++) { 5660 switch (counter_++) {
5726 case OLD_POINTER_SPACE: 5661 case OLD_SPACE:
5727 return heap_->old_pointer_space(); 5662 return heap_->old_space();
5728 case OLD_DATA_SPACE:
5729 return heap_->old_data_space();
5730 case CODE_SPACE: 5663 case CODE_SPACE:
5731 return heap_->code_space(); 5664 return heap_->code_space();
5732 case MAP_SPACE: 5665 case MAP_SPACE:
5733 return heap_->map_space(); 5666 return heap_->map_space();
5734 case CELL_SPACE: 5667 case CELL_SPACE:
5735 return heap_->cell_space(); 5668 return heap_->cell_space();
5736 case PROPERTY_CELL_SPACE: 5669 case PROPERTY_CELL_SPACE:
5737 return heap_->property_cell_space(); 5670 return heap_->property_cell_space();
5738 default: 5671 default:
5739 return NULL; 5672 return NULL;
5740 } 5673 }
5741 } 5674 }
5742 5675
5743 5676
5744 OldSpace* OldSpaces::next() { 5677 OldSpace* OldSpaces::next() {
5745 switch (counter_++) { 5678 switch (counter_++) {
5746 case OLD_POINTER_SPACE: 5679 case OLD_SPACE:
5747 return heap_->old_pointer_space(); 5680 return heap_->old_space();
5748 case OLD_DATA_SPACE:
5749 return heap_->old_data_space();
5750 case CODE_SPACE: 5681 case CODE_SPACE:
5751 return heap_->code_space(); 5682 return heap_->code_space();
5752 default: 5683 default:
5753 return NULL; 5684 return NULL;
5754 } 5685 }
5755 } 5686 }
5756 5687
5757 5688
5758 SpaceIterator::SpaceIterator(Heap* heap) 5689 SpaceIterator::SpaceIterator(Heap* heap)
5759 : heap_(heap), 5690 : heap_(heap),
(...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after
5798 5729
5799 5730
5800 // Create an iterator for the space to iterate. 5731 // Create an iterator for the space to iterate.
5801 ObjectIterator* SpaceIterator::CreateIterator() { 5732 ObjectIterator* SpaceIterator::CreateIterator() {
5802 DCHECK(iterator_ == NULL); 5733 DCHECK(iterator_ == NULL);
5803 5734
5804 switch (current_space_) { 5735 switch (current_space_) {
5805 case NEW_SPACE: 5736 case NEW_SPACE:
5806 iterator_ = new SemiSpaceIterator(heap_->new_space(), size_func_); 5737 iterator_ = new SemiSpaceIterator(heap_->new_space(), size_func_);
5807 break; 5738 break;
5808 case OLD_POINTER_SPACE: 5739 case OLD_SPACE:
5809 iterator_ = 5740 iterator_ = new HeapObjectIterator(heap_->old_space(), size_func_);
5810 new HeapObjectIterator(heap_->old_pointer_space(), size_func_);
5811 break;
5812 case OLD_DATA_SPACE:
5813 iterator_ = new HeapObjectIterator(heap_->old_data_space(), size_func_);
5814 break; 5741 break;
5815 case CODE_SPACE: 5742 case CODE_SPACE:
5816 iterator_ = new HeapObjectIterator(heap_->code_space(), size_func_); 5743 iterator_ = new HeapObjectIterator(heap_->code_space(), size_func_);
5817 break; 5744 break;
5818 case MAP_SPACE: 5745 case MAP_SPACE:
5819 iterator_ = new HeapObjectIterator(heap_->map_space(), size_func_); 5746 iterator_ = new HeapObjectIterator(heap_->map_space(), size_func_);
5820 break; 5747 break;
5821 case CELL_SPACE: 5748 case CELL_SPACE:
5822 iterator_ = new HeapObjectIterator(heap_->cell_space(), size_func_); 5749 iterator_ = new HeapObjectIterator(heap_->cell_space(), size_func_);
5823 break; 5750 break;
(...skipping 625 matching lines...) Expand 10 before | Expand all | Expand 10 after
6449 static_cast<int>(object_sizes_last_time_[index])); 6376 static_cast<int>(object_sizes_last_time_[index]));
6450 CODE_AGE_LIST_COMPLETE(ADJUST_LAST_TIME_OBJECT_COUNT) 6377 CODE_AGE_LIST_COMPLETE(ADJUST_LAST_TIME_OBJECT_COUNT)
6451 #undef ADJUST_LAST_TIME_OBJECT_COUNT 6378 #undef ADJUST_LAST_TIME_OBJECT_COUNT
6452 6379
6453 MemCopy(object_counts_last_time_, object_counts_, sizeof(object_counts_)); 6380 MemCopy(object_counts_last_time_, object_counts_, sizeof(object_counts_));
6454 MemCopy(object_sizes_last_time_, object_sizes_, sizeof(object_sizes_)); 6381 MemCopy(object_sizes_last_time_, object_sizes_, sizeof(object_sizes_));
6455 ClearObjectStats(); 6382 ClearObjectStats();
6456 } 6383 }
6457 } 6384 }
6458 } // namespace v8::internal 6385 } // namespace v8::internal
OLDNEW
« no previous file with comments | « src/heap/heap.h ('k') | src/heap/heap-inl.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698