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

Side by Side Diff: src/heap/mark-compact.cc

Issue 1010803012: Merge cellspace into old pointer space (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: Created 5 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/heap/mark-compact.h ('k') | src/heap/objects-visiting-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/base/atomicops.h" 7 #include "src/base/atomicops.h"
8 #include "src/base/bits.h" 8 #include "src/base/bits.h"
9 #include "src/code-stubs.h" 9 #include "src/code-stubs.h"
10 #include "src/compilation-cache.h" 10 #include "src/compilation-cache.h"
(...skipping 119 matching lines...) Expand 10 before | Expand all | Expand 10 after
130 while (it.has_next()) { 130 while (it.has_next()) {
131 Page* p = it.next(); 131 Page* p = it.next();
132 VerifyMarking(space->heap(), p->area_start(), p->area_end()); 132 VerifyMarking(space->heap(), p->area_start(), p->area_end());
133 } 133 }
134 } 134 }
135 135
136 136
137 static void VerifyMarking(Heap* heap) { 137 static void VerifyMarking(Heap* heap) {
138 VerifyMarking(heap->old_space()); 138 VerifyMarking(heap->old_space());
139 VerifyMarking(heap->code_space()); 139 VerifyMarking(heap->code_space());
140 VerifyMarking(heap->cell_space());
141 VerifyMarking(heap->map_space()); 140 VerifyMarking(heap->map_space());
142 VerifyMarking(heap->new_space()); 141 VerifyMarking(heap->new_space());
143 142
144 VerifyMarkingVisitor visitor(heap); 143 VerifyMarkingVisitor visitor(heap);
145 144
146 LargeObjectIterator it(heap->lo_space()); 145 LargeObjectIterator it(heap->lo_space());
147 for (HeapObject* obj = it.Next(); obj != NULL; obj = it.Next()) { 146 for (HeapObject* obj = it.Next(); obj != NULL; obj = it.Next()) {
148 if (MarkCompactCollector::IsMarked(obj)) { 147 if (MarkCompactCollector::IsMarked(obj)) {
149 obj->Iterate(&visitor); 148 obj->Iterate(&visitor);
150 } 149 }
(...skipping 57 matching lines...) Expand 10 before | Expand all | Expand 10 after
208 Page* p = it.next(); 207 Page* p = it.next();
209 if (p->IsEvacuationCandidate()) continue; 208 if (p->IsEvacuationCandidate()) continue;
210 VerifyEvacuation(p); 209 VerifyEvacuation(p);
211 } 210 }
212 } 211 }
213 212
214 213
215 static void VerifyEvacuation(Heap* heap) { 214 static void VerifyEvacuation(Heap* heap) {
216 VerifyEvacuation(heap, heap->old_space()); 215 VerifyEvacuation(heap, heap->old_space());
217 VerifyEvacuation(heap, heap->code_space()); 216 VerifyEvacuation(heap, heap->code_space());
218 VerifyEvacuation(heap, heap->cell_space());
219 VerifyEvacuation(heap, heap->map_space()); 217 VerifyEvacuation(heap, heap->map_space());
220 VerifyEvacuation(heap->new_space()); 218 VerifyEvacuation(heap->new_space());
221 219
222 VerifyEvacuationVisitor visitor; 220 VerifyEvacuationVisitor visitor;
223 heap->IterateStrongRoots(&visitor, VISIT_ALL); 221 heap->IterateStrongRoots(&visitor, VISIT_ALL);
224 } 222 }
225 #endif // VERIFY_HEAP 223 #endif // VERIFY_HEAP
226 224
227 225
228 void MarkCompactCollector::SetUp() { 226 void MarkCompactCollector::SetUp() {
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after
261 259
262 if (FLAG_compact_code_space && (mode == NON_INCREMENTAL_COMPACTION || 260 if (FLAG_compact_code_space && (mode == NON_INCREMENTAL_COMPACTION ||
263 FLAG_incremental_code_compaction)) { 261 FLAG_incremental_code_compaction)) {
264 CollectEvacuationCandidates(heap()->code_space()); 262 CollectEvacuationCandidates(heap()->code_space());
265 } else if (FLAG_trace_fragmentation) { 263 } else if (FLAG_trace_fragmentation) {
266 TraceFragmentation(heap()->code_space()); 264 TraceFragmentation(heap()->code_space());
267 } 265 }
268 266
269 if (FLAG_trace_fragmentation) { 267 if (FLAG_trace_fragmentation) {
270 TraceFragmentation(heap()->map_space()); 268 TraceFragmentation(heap()->map_space());
271 TraceFragmentation(heap()->cell_space());
272 } 269 }
273 270
274 heap()->old_space()->EvictEvacuationCandidatesFromFreeLists(); 271 heap()->old_space()->EvictEvacuationCandidatesFromFreeLists();
275 heap()->code_space()->EvictEvacuationCandidatesFromFreeLists(); 272 heap()->code_space()->EvictEvacuationCandidatesFromFreeLists();
276 273
277 compacting_ = evacuation_candidates_.length() > 0; 274 compacting_ = evacuation_candidates_.length() > 0;
278 } 275 }
279 276
280 return compacting_; 277 return compacting_;
281 } 278 }
282 279
283 280
284 void MarkCompactCollector::ClearInvalidSlotsBufferEntries(PagedSpace* space) { 281 void MarkCompactCollector::ClearInvalidSlotsBufferEntries(PagedSpace* space) {
285 PageIterator it(space); 282 PageIterator it(space);
286 while (it.has_next()) { 283 while (it.has_next()) {
287 Page* p = it.next(); 284 Page* p = it.next();
288 SlotsBuffer::RemoveInvalidSlots(heap_, p->slots_buffer()); 285 SlotsBuffer::RemoveInvalidSlots(heap_, p->slots_buffer());
289 } 286 }
290 } 287 }
291 288
292 289
293 void MarkCompactCollector::ClearInvalidStoreAndSlotsBufferEntries() { 290 void MarkCompactCollector::ClearInvalidStoreAndSlotsBufferEntries() {
294 heap_->store_buffer()->ClearInvalidStoreBufferEntries(); 291 heap_->store_buffer()->ClearInvalidStoreBufferEntries();
295 292
296 ClearInvalidSlotsBufferEntries(heap_->old_space()); 293 ClearInvalidSlotsBufferEntries(heap_->old_space());
297 ClearInvalidSlotsBufferEntries(heap_->code_space()); 294 ClearInvalidSlotsBufferEntries(heap_->code_space());
298 ClearInvalidSlotsBufferEntries(heap_->cell_space());
299 ClearInvalidSlotsBufferEntries(heap_->map_space()); 295 ClearInvalidSlotsBufferEntries(heap_->map_space());
300 296
301 LargeObjectIterator it(heap_->lo_space()); 297 LargeObjectIterator it(heap_->lo_space());
302 for (HeapObject* object = it.Next(); object != NULL; object = it.Next()) { 298 for (HeapObject* object = it.Next(); object != NULL; object = it.Next()) {
303 MemoryChunk* chunk = MemoryChunk::FromAddress(object->address()); 299 MemoryChunk* chunk = MemoryChunk::FromAddress(object->address());
304 SlotsBuffer::RemoveInvalidSlots(heap_, chunk->slots_buffer()); 300 SlotsBuffer::RemoveInvalidSlots(heap_, chunk->slots_buffer());
305 } 301 }
306 } 302 }
307 303
308 304
309 #ifdef VERIFY_HEAP 305 #ifdef VERIFY_HEAP
310 static void VerifyValidSlotsBufferEntries(Heap* heap, PagedSpace* space) { 306 static void VerifyValidSlotsBufferEntries(Heap* heap, PagedSpace* space) {
311 PageIterator it(space); 307 PageIterator it(space);
312 while (it.has_next()) { 308 while (it.has_next()) {
313 Page* p = it.next(); 309 Page* p = it.next();
314 SlotsBuffer::VerifySlots(heap, p->slots_buffer()); 310 SlotsBuffer::VerifySlots(heap, p->slots_buffer());
315 } 311 }
316 } 312 }
317 313
318 314
319 static void VerifyValidStoreAndSlotsBufferEntries(Heap* heap) { 315 static void VerifyValidStoreAndSlotsBufferEntries(Heap* heap) {
320 heap->store_buffer()->VerifyValidStoreBufferEntries(); 316 heap->store_buffer()->VerifyValidStoreBufferEntries();
321 317
322 VerifyValidSlotsBufferEntries(heap, heap->old_space()); 318 VerifyValidSlotsBufferEntries(heap, heap->old_space());
323 VerifyValidSlotsBufferEntries(heap, heap->code_space()); 319 VerifyValidSlotsBufferEntries(heap, heap->code_space());
324 VerifyValidSlotsBufferEntries(heap, heap->cell_space());
325 VerifyValidSlotsBufferEntries(heap, heap->map_space()); 320 VerifyValidSlotsBufferEntries(heap, heap->map_space());
326 321
327 LargeObjectIterator it(heap->lo_space()); 322 LargeObjectIterator it(heap->lo_space());
328 for (HeapObject* object = it.Next(); object != NULL; object = it.Next()) { 323 for (HeapObject* object = it.Next(); object != NULL; object = it.Next()) {
329 MemoryChunk* chunk = MemoryChunk::FromAddress(object->address()); 324 MemoryChunk* chunk = MemoryChunk::FromAddress(object->address());
330 SlotsBuffer::VerifySlots(heap, chunk->slots_buffer()); 325 SlotsBuffer::VerifySlots(heap, chunk->slots_buffer());
331 } 326 }
332 } 327 }
333 #endif 328 #endif
334 329
(...skipping 70 matching lines...) Expand 10 before | Expand all | Expand 10 after
405 NewSpacePage* p = it.next(); 400 NewSpacePage* p = it.next();
406 CHECK(p->markbits()->IsClean()); 401 CHECK(p->markbits()->IsClean());
407 CHECK_EQ(0, p->LiveBytes()); 402 CHECK_EQ(0, p->LiveBytes());
408 } 403 }
409 } 404 }
410 405
411 406
412 void MarkCompactCollector::VerifyMarkbitsAreClean() { 407 void MarkCompactCollector::VerifyMarkbitsAreClean() {
413 VerifyMarkbitsAreClean(heap_->old_space()); 408 VerifyMarkbitsAreClean(heap_->old_space());
414 VerifyMarkbitsAreClean(heap_->code_space()); 409 VerifyMarkbitsAreClean(heap_->code_space());
415 VerifyMarkbitsAreClean(heap_->cell_space());
416 VerifyMarkbitsAreClean(heap_->map_space()); 410 VerifyMarkbitsAreClean(heap_->map_space());
417 VerifyMarkbitsAreClean(heap_->new_space()); 411 VerifyMarkbitsAreClean(heap_->new_space());
418 412
419 LargeObjectIterator it(heap_->lo_space()); 413 LargeObjectIterator it(heap_->lo_space());
420 for (HeapObject* obj = it.Next(); obj != NULL; obj = it.Next()) { 414 for (HeapObject* obj = it.Next(); obj != NULL; obj = it.Next()) {
421 MarkBit mark_bit = Marking::MarkBitFrom(obj); 415 MarkBit mark_bit = Marking::MarkBitFrom(obj);
422 CHECK(Marking::IsWhite(mark_bit)); 416 CHECK(Marking::IsWhite(mark_bit));
423 CHECK_EQ(0, Page::FromAddress(obj->address())->LiveBytes()); 417 CHECK_EQ(0, Page::FromAddress(obj->address())->LiveBytes());
424 } 418 }
425 } 419 }
(...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after
462 while (it.has_next()) { 456 while (it.has_next()) {
463 Bitmap::Clear(it.next()); 457 Bitmap::Clear(it.next());
464 } 458 }
465 } 459 }
466 460
467 461
468 void MarkCompactCollector::ClearMarkbits() { 462 void MarkCompactCollector::ClearMarkbits() {
469 ClearMarkbitsInPagedSpace(heap_->code_space()); 463 ClearMarkbitsInPagedSpace(heap_->code_space());
470 ClearMarkbitsInPagedSpace(heap_->map_space()); 464 ClearMarkbitsInPagedSpace(heap_->map_space());
471 ClearMarkbitsInPagedSpace(heap_->old_space()); 465 ClearMarkbitsInPagedSpace(heap_->old_space());
472 ClearMarkbitsInPagedSpace(heap_->cell_space());
473 ClearMarkbitsInNewSpace(heap_->new_space()); 466 ClearMarkbitsInNewSpace(heap_->new_space());
474 467
475 LargeObjectIterator it(heap_->lo_space()); 468 LargeObjectIterator it(heap_->lo_space());
476 for (HeapObject* obj = it.Next(); obj != NULL; obj = it.Next()) { 469 for (HeapObject* obj = it.Next(); obj != NULL; obj = it.Next()) {
477 MarkBit mark_bit = Marking::MarkBitFrom(obj); 470 MarkBit mark_bit = Marking::MarkBitFrom(obj);
478 mark_bit.Clear(); 471 mark_bit.Clear();
479 mark_bit.Next().Clear(); 472 mark_bit.Next().Clear();
480 Page::FromAddress(obj->address())->ResetProgressBar(); 473 Page::FromAddress(obj->address())->ResetProgressBar();
481 Page::FromAddress(obj->address())->ResetLiveBytes(); 474 Page::FromAddress(obj->address())->ResetLiveBytes();
482 } 475 }
(...skipping 123 matching lines...) Expand 10 before | Expand all | Expand 10 after
606 const char* AllocationSpaceName(AllocationSpace space) { 599 const char* AllocationSpaceName(AllocationSpace space) {
607 switch (space) { 600 switch (space) {
608 case NEW_SPACE: 601 case NEW_SPACE:
609 return "NEW_SPACE"; 602 return "NEW_SPACE";
610 case OLD_SPACE: 603 case OLD_SPACE:
611 return "OLD_SPACE"; 604 return "OLD_SPACE";
612 case CODE_SPACE: 605 case CODE_SPACE:
613 return "CODE_SPACE"; 606 return "CODE_SPACE";
614 case MAP_SPACE: 607 case MAP_SPACE:
615 return "MAP_SPACE"; 608 return "MAP_SPACE";
616 case CELL_SPACE:
617 return "CELL_SPACE";
618 case LO_SPACE: 609 case LO_SPACE:
619 return "LO_SPACE"; 610 return "LO_SPACE";
620 default: 611 default:
621 UNREACHABLE(); 612 UNREACHABLE();
622 } 613 }
623 614
624 return NULL; 615 return NULL;
625 } 616 }
626 617
627 618
(...skipping 1458 matching lines...) Expand 10 before | Expand all | Expand 10 after
2086 2077
2087 DiscoverGreyObjectsInSpace(heap(), &marking_deque_, heap()->old_space()); 2078 DiscoverGreyObjectsInSpace(heap(), &marking_deque_, heap()->old_space());
2088 if (marking_deque_.IsFull()) return; 2079 if (marking_deque_.IsFull()) return;
2089 2080
2090 DiscoverGreyObjectsInSpace(heap(), &marking_deque_, heap()->code_space()); 2081 DiscoverGreyObjectsInSpace(heap(), &marking_deque_, heap()->code_space());
2091 if (marking_deque_.IsFull()) return; 2082 if (marking_deque_.IsFull()) return;
2092 2083
2093 DiscoverGreyObjectsInSpace(heap(), &marking_deque_, heap()->map_space()); 2084 DiscoverGreyObjectsInSpace(heap(), &marking_deque_, heap()->map_space());
2094 if (marking_deque_.IsFull()) return; 2085 if (marking_deque_.IsFull()) return;
2095 2086
2096 DiscoverGreyObjectsInSpace(heap(), &marking_deque_, heap()->cell_space());
2097 if (marking_deque_.IsFull()) return;
2098
2099 LargeObjectIterator lo_it(heap()->lo_space()); 2087 LargeObjectIterator lo_it(heap()->lo_space());
2100 DiscoverGreyObjectsWithIterator(heap(), &marking_deque_, &lo_it); 2088 DiscoverGreyObjectsWithIterator(heap(), &marking_deque_, &lo_it);
2101 if (marking_deque_.IsFull()) return; 2089 if (marking_deque_.IsFull()) return;
2102 2090
2103 marking_deque_.ClearOverflowed(); 2091 marking_deque_.ClearOverflowed();
2104 } 2092 }
2105 2093
2106 2094
2107 // Mark all objects reachable (transitively) from objects on the marking 2095 // Mark all objects reachable (transitively) from objects on the marking
2108 // stack. Before: the marking stack contains zero or more heap object 2096 // stack. Before: the marking stack contains zero or more heap object
(...skipping 170 matching lines...) Expand 10 before | Expand all | Expand 10 after
2279 2267
2280 #ifdef DEBUG 2268 #ifdef DEBUG
2281 DCHECK(state_ == PREPARE_GC); 2269 DCHECK(state_ == PREPARE_GC);
2282 state_ = MARK_LIVE_OBJECTS; 2270 state_ = MARK_LIVE_OBJECTS;
2283 #endif 2271 #endif
2284 2272
2285 EnsureMarkingDequeIsCommittedAndInitialize(); 2273 EnsureMarkingDequeIsCommittedAndInitialize();
2286 2274
2287 PrepareForCodeFlushing(); 2275 PrepareForCodeFlushing();
2288 2276
2289 if (was_marked_incrementally_) {
2290 // There is no write barrier on cells so we have to scan them now at the end
2291 // of the incremental marking.
2292 {
2293 HeapObjectIterator cell_iterator(heap()->cell_space());
2294 HeapObject* cell;
2295 while ((cell = cell_iterator.Next()) != NULL) {
2296 DCHECK(cell->IsCell());
2297 if (IsMarked(cell)) {
2298 int offset = Cell::kValueOffset;
2299 MarkCompactMarkingVisitor::VisitPointer(
2300 heap(), reinterpret_cast<Object**>(cell->address() + offset));
2301 }
2302 }
2303 }
2304 }
2305
2306 RootMarkingVisitor root_visitor(heap()); 2277 RootMarkingVisitor root_visitor(heap());
2307 MarkRoots(&root_visitor); 2278 MarkRoots(&root_visitor);
2308 2279
2309 ProcessTopOptimizedFrame(&root_visitor); 2280 ProcessTopOptimizedFrame(&root_visitor);
2310 2281
2311 // Retaining dying maps should happen before or during ephemeral marking 2282 // Retaining dying maps should happen before or during ephemeral marking
2312 // because a map could keep the key of an ephemeron alive. Note that map 2283 // because a map could keep the key of an ephemeron alive. Note that map
2313 // aging is imprecise: maps that are kept alive only by ephemerons will age. 2284 // aging is imprecise: maps that are kept alive only by ephemerons will age.
2314 RetainMaps(); 2285 RetainMaps();
2315 2286
(...skipping 532 matching lines...) Expand 10 before | Expand all | Expand 10 after
2848 class PointersUpdatingVisitor : public ObjectVisitor { 2819 class PointersUpdatingVisitor : public ObjectVisitor {
2849 public: 2820 public:
2850 explicit PointersUpdatingVisitor(Heap* heap) : heap_(heap) {} 2821 explicit PointersUpdatingVisitor(Heap* heap) : heap_(heap) {}
2851 2822
2852 void VisitPointer(Object** p) { UpdatePointer(p); } 2823 void VisitPointer(Object** p) { UpdatePointer(p); }
2853 2824
2854 void VisitPointers(Object** start, Object** end) { 2825 void VisitPointers(Object** start, Object** end) {
2855 for (Object** p = start; p < end; p++) UpdatePointer(p); 2826 for (Object** p = start; p < end; p++) UpdatePointer(p);
2856 } 2827 }
2857 2828
2829 void VisitCell(RelocInfo* rinfo) {
2830 DCHECK(rinfo->rmode() == RelocInfo::CELL);
2831 Object* cell = rinfo->target_cell();
2832 Object* old_cell = cell;
2833 VisitPointer(&cell);
2834 if (cell != old_cell) {
2835 rinfo->set_target_cell(reinterpret_cast<Cell*>(cell));
2836 }
2837 }
2838
2858 void VisitEmbeddedPointer(RelocInfo* rinfo) { 2839 void VisitEmbeddedPointer(RelocInfo* rinfo) {
2859 DCHECK(rinfo->rmode() == RelocInfo::EMBEDDED_OBJECT); 2840 DCHECK(rinfo->rmode() == RelocInfo::EMBEDDED_OBJECT);
2860 Object* target = rinfo->target_object(); 2841 Object* target = rinfo->target_object();
2861 Object* old_target = target; 2842 Object* old_target = target;
2862 VisitPointer(&target); 2843 VisitPointer(&target);
2863 // Avoid unnecessary changes that might unnecessary flush the instruction 2844 // Avoid unnecessary changes that might unnecessary flush the instruction
2864 // cache. 2845 // cache.
2865 if (target != old_target) { 2846 if (target != old_target) {
2866 rinfo->set_target_object(target); 2847 rinfo->set_target_object(target);
2867 } 2848 }
(...skipping 88 matching lines...) Expand 10 before | Expand all | Expand 10 after
2956 if (heap->new_space()->ToSpaceContains(slot_address)) { 2937 if (heap->new_space()->ToSpaceContains(slot_address)) {
2957 space_owner_id = 1; 2938 space_owner_id = 1;
2958 } else if (heap->new_space()->FromSpaceContains(slot_address)) { 2939 } else if (heap->new_space()->FromSpaceContains(slot_address)) {
2959 space_owner_id = 2; 2940 space_owner_id = 2;
2960 } else if (heap->old_space()->ContainsSafe(slot_address)) { 2941 } else if (heap->old_space()->ContainsSafe(slot_address)) {
2961 space_owner_id = 3; 2942 space_owner_id = 3;
2962 } else if (heap->code_space()->ContainsSafe(slot_address)) { 2943 } else if (heap->code_space()->ContainsSafe(slot_address)) {
2963 space_owner_id = 4; 2944 space_owner_id = 4;
2964 } else if (heap->map_space()->ContainsSafe(slot_address)) { 2945 } else if (heap->map_space()->ContainsSafe(slot_address)) {
2965 space_owner_id = 5; 2946 space_owner_id = 5;
2966 } else if (heap->cell_space()->ContainsSafe(slot_address)) {
2967 space_owner_id = 6;
2968 } else { 2947 } else {
2969 // Lo space or other. 2948 // Lo space or other.
2970 space_owner_id = 7; 2949 space_owner_id = 6;
2971 } 2950 }
2972 data[index++] = space_owner_id; 2951 data[index++] = space_owner_id;
2973 data[index++] = 0x20aaaaaaaaUL; 2952 data[index++] = 0x20aaaaaaaaUL;
2974 2953
2975 // Find map word lying near before the slot address (usually the map word is 2954 // Find map word lying near before the slot address (usually the map word is
2976 // at -3 words from the slot but just in case we look up further. 2955 // at -3 words from the slot but just in case we look up further.
2977 Object** map_slot = slot; 2956 Object** map_slot = slot;
2978 bool found = false; 2957 bool found = false;
2979 const int kMaxDistanceToMap = 64; 2958 const int kMaxDistanceToMap = 64;
2980 for (int i = 0; i < kMaxDistanceToMap; i++, map_slot--) { 2959 for (int i = 0; i < kMaxDistanceToMap; i++, map_slot--) {
(...skipping 407 matching lines...) Expand 10 before | Expand all | Expand 10 after
3388 3367
3389 3368
3390 static inline void UpdateSlot(Isolate* isolate, ObjectVisitor* v, 3369 static inline void UpdateSlot(Isolate* isolate, ObjectVisitor* v,
3391 SlotsBuffer::SlotType slot_type, Address addr) { 3370 SlotsBuffer::SlotType slot_type, Address addr) {
3392 switch (slot_type) { 3371 switch (slot_type) {
3393 case SlotsBuffer::CODE_TARGET_SLOT: { 3372 case SlotsBuffer::CODE_TARGET_SLOT: {
3394 RelocInfo rinfo(addr, RelocInfo::CODE_TARGET, 0, NULL); 3373 RelocInfo rinfo(addr, RelocInfo::CODE_TARGET, 0, NULL);
3395 rinfo.Visit(isolate, v); 3374 rinfo.Visit(isolate, v);
3396 break; 3375 break;
3397 } 3376 }
3377 case SlotsBuffer::CELL_TARGET_SLOT: {
3378 RelocInfo rinfo(addr, RelocInfo::CELL, 0, NULL);
3379 rinfo.Visit(isolate, v);
3380 break;
3381 }
3398 case SlotsBuffer::CODE_ENTRY_SLOT: { 3382 case SlotsBuffer::CODE_ENTRY_SLOT: {
3399 v->VisitCodeEntry(addr); 3383 v->VisitCodeEntry(addr);
3400 break; 3384 break;
3401 } 3385 }
3402 case SlotsBuffer::RELOCATED_CODE_OBJECT: { 3386 case SlotsBuffer::RELOCATED_CODE_OBJECT: {
3403 HeapObject* obj = HeapObject::FromAddress(addr); 3387 HeapObject* obj = HeapObject::FromAddress(addr);
3404 Code::cast(obj)->CodeIterateBody(v); 3388 Code::cast(obj)->CodeIterateBody(v);
3405 break; 3389 break;
3406 } 3390 }
3407 case SlotsBuffer::DEBUG_TARGET_SLOT: { 3391 case SlotsBuffer::DEBUG_TARGET_SLOT: {
(...skipping 377 matching lines...) Expand 10 before | Expand all | Expand 10 after
3785 UNREACHABLE(); 3769 UNREACHABLE();
3786 break; 3770 break;
3787 } 3771 }
3788 } 3772 }
3789 } 3773 }
3790 } 3774 }
3791 3775
3792 GCTracer::Scope gc_scope(heap()->tracer(), 3776 GCTracer::Scope gc_scope(heap()->tracer(),
3793 GCTracer::Scope::MC_UPDATE_MISC_POINTERS); 3777 GCTracer::Scope::MC_UPDATE_MISC_POINTERS);
3794 3778
3795 // Update pointers from cells.
3796 HeapObjectIterator cell_iterator(heap_->cell_space());
3797 for (HeapObject* cell = cell_iterator.Next(); cell != NULL;
3798 cell = cell_iterator.Next()) {
3799 if (cell->IsCell()) {
3800 Cell::BodyDescriptor::IterateBody(cell, &updating_visitor);
3801 }
3802 }
3803
3804 heap_->string_table()->Iterate(&updating_visitor); 3779 heap_->string_table()->Iterate(&updating_visitor);
3805 3780
3806 // Update pointers from external string table. 3781 // Update pointers from external string table.
3807 heap_->UpdateReferencesInExternalStringTable( 3782 heap_->UpdateReferencesInExternalStringTable(
3808 &UpdateReferenceInExternalStringTableEntry); 3783 &UpdateReferenceInExternalStringTableEntry);
3809 3784
3810 EvacuationWeakObjectRetainer evacuation_object_retainer; 3785 EvacuationWeakObjectRetainer evacuation_object_retainer;
3811 heap()->ProcessAllWeakReferences(&evacuation_object_retainer); 3786 heap()->ProcessAllWeakReferences(&evacuation_object_retainer);
3812 3787
3813 // Collects callback info for handles that are pending (about to be 3788 // Collects callback info for handles that are pending (about to be
(...skipping 594 matching lines...) Expand 10 before | Expand all | Expand 10 after
4408 } 4383 }
4409 } 4384 }
4410 RemoveDeadInvalidatedCode(); 4385 RemoveDeadInvalidatedCode();
4411 4386
4412 { 4387 {
4413 GCTracer::Scope sweep_scope(heap()->tracer(), 4388 GCTracer::Scope sweep_scope(heap()->tracer(),
4414 GCTracer::Scope::MC_SWEEP_CODE); 4389 GCTracer::Scope::MC_SWEEP_CODE);
4415 SweepSpace(heap()->code_space(), SEQUENTIAL_SWEEPING); 4390 SweepSpace(heap()->code_space(), SEQUENTIAL_SWEEPING);
4416 } 4391 }
4417 4392
4418 {
4419 GCTracer::Scope sweep_scope(heap()->tracer(),
4420 GCTracer::Scope::MC_SWEEP_CELL);
4421 SweepSpace(heap()->cell_space(), SEQUENTIAL_SWEEPING);
4422 }
4423
4424 EvacuateNewSpaceAndCandidates(); 4393 EvacuateNewSpaceAndCandidates();
4425 4394
4426 // ClearNonLiveReferences depends on precise sweeping of map space to 4395 // ClearNonLiveReferences depends on precise sweeping of map space to
4427 // detect whether unmarked map became dead in this collection or in one 4396 // detect whether unmarked map became dead in this collection or in one
4428 // of the previous ones. 4397 // of the previous ones.
4429 { 4398 {
4430 GCTracer::Scope sweep_scope(heap()->tracer(), 4399 GCTracer::Scope sweep_scope(heap()->tracer(),
4431 GCTracer::Scope::MC_SWEEP_MAP); 4400 GCTracer::Scope::MC_SWEEP_MAP);
4432 SweepSpace(heap()->map_space(), SEQUENTIAL_SWEEPING); 4401 SweepSpace(heap()->map_space(), SEQUENTIAL_SWEEPING);
4433 } 4402 }
(...skipping 158 matching lines...) Expand 10 before | Expand all | Expand 10 after
4592 } 4561 }
4593 } 4562 }
4594 buffer = buffer->next(); 4563 buffer = buffer->next();
4595 } 4564 }
4596 } 4565 }
4597 4566
4598 4567
4599 static inline SlotsBuffer::SlotType SlotTypeForRMode(RelocInfo::Mode rmode) { 4568 static inline SlotsBuffer::SlotType SlotTypeForRMode(RelocInfo::Mode rmode) {
4600 if (RelocInfo::IsCodeTarget(rmode)) { 4569 if (RelocInfo::IsCodeTarget(rmode)) {
4601 return SlotsBuffer::CODE_TARGET_SLOT; 4570 return SlotsBuffer::CODE_TARGET_SLOT;
4571 } else if (RelocInfo::IsCell(rmode)) {
4572 return SlotsBuffer::CELL_TARGET_SLOT;
4602 } else if (RelocInfo::IsEmbeddedObject(rmode)) { 4573 } else if (RelocInfo::IsEmbeddedObject(rmode)) {
4603 return SlotsBuffer::EMBEDDED_OBJECT_SLOT; 4574 return SlotsBuffer::EMBEDDED_OBJECT_SLOT;
4604 } else if (RelocInfo::IsDebugBreakSlot(rmode)) { 4575 } else if (RelocInfo::IsDebugBreakSlot(rmode)) {
4605 return SlotsBuffer::DEBUG_TARGET_SLOT; 4576 return SlotsBuffer::DEBUG_TARGET_SLOT;
4606 } else if (RelocInfo::IsJSReturn(rmode)) { 4577 } else if (RelocInfo::IsJSReturn(rmode)) {
4607 return SlotsBuffer::JS_RETURN_SLOT; 4578 return SlotsBuffer::JS_RETURN_SLOT;
4608 } 4579 }
4609 UNREACHABLE(); 4580 UNREACHABLE();
4610 return SlotsBuffer::NUMBER_OF_SLOT_TYPES; 4581 return SlotsBuffer::NUMBER_OF_SLOT_TYPES;
4611 } 4582 }
(...skipping 138 matching lines...) Expand 10 before | Expand all | Expand 10 after
4750 SlotsBuffer* buffer = *buffer_address; 4721 SlotsBuffer* buffer = *buffer_address;
4751 while (buffer != NULL) { 4722 while (buffer != NULL) {
4752 SlotsBuffer* next_buffer = buffer->next(); 4723 SlotsBuffer* next_buffer = buffer->next();
4753 DeallocateBuffer(buffer); 4724 DeallocateBuffer(buffer);
4754 buffer = next_buffer; 4725 buffer = next_buffer;
4755 } 4726 }
4756 *buffer_address = NULL; 4727 *buffer_address = NULL;
4757 } 4728 }
4758 } 4729 }
4759 } // namespace v8::internal 4730 } // namespace v8::internal
OLDNEW
« no previous file with comments | « src/heap/mark-compact.h ('k') | src/heap/objects-visiting-inl.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698