OLD | NEW |
1 // Copyright 2011 the V8 project authors. All rights reserved. | 1 // Copyright 2011 the V8 project authors. All rights reserved. |
2 // Redistribution and use in source and binary forms, with or without | 2 // Redistribution and use in source and binary forms, with or without |
3 // modification, are permitted provided that the following conditions are | 3 // modification, are permitted provided that the following conditions are |
4 // met: | 4 // met: |
5 // | 5 // |
6 // * Redistributions of source code must retain the above copyright | 6 // * Redistributions of source code must retain the above copyright |
7 // notice, this list of conditions and the following disclaimer. | 7 // notice, this list of conditions and the following disclaimer. |
8 // * Redistributions in binary form must reproduce the above | 8 // * Redistributions in binary form must reproduce the above |
9 // copyright notice, this list of conditions and the following | 9 // copyright notice, this list of conditions and the following |
10 // disclaimer in the documentation and/or other materials provided | 10 // disclaimer in the documentation and/or other materials provided |
(...skipping 449 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
460 } | 460 } |
461 compacting_ = false; | 461 compacting_ = false; |
462 evacuation_candidates_.Rewind(0); | 462 evacuation_candidates_.Rewind(0); |
463 invalidated_code_.Rewind(0); | 463 invalidated_code_.Rewind(0); |
464 } | 464 } |
465 ASSERT_EQ(0, evacuation_candidates_.length()); | 465 ASSERT_EQ(0, evacuation_candidates_.length()); |
466 } | 466 } |
467 | 467 |
468 | 468 |
469 void MarkCompactCollector::Prepare(GCTracer* tracer) { | 469 void MarkCompactCollector::Prepare(GCTracer* tracer) { |
470 FLAG_flush_code = false; | |
471 | |
472 was_marked_incrementally_ = heap()->incremental_marking()->IsMarking(); | 470 was_marked_incrementally_ = heap()->incremental_marking()->IsMarking(); |
473 | 471 |
474 // Disable collection of maps if incremental marking is enabled. | 472 // Disable collection of maps if incremental marking is enabled. |
475 // Map collection algorithm relies on a special map transition tree traversal | 473 // Map collection algorithm relies on a special map transition tree traversal |
476 // order which is not implemented for incremental marking. | 474 // order which is not implemented for incremental marking. |
477 collect_maps_ = FLAG_collect_maps && !was_marked_incrementally_; | 475 collect_maps_ = FLAG_collect_maps && !was_marked_incrementally_; |
478 | 476 |
479 // Rather than passing the tracer around we stash it in a static member | 477 // Rather than passing the tracer around we stash it in a static member |
480 // variable. | 478 // variable. |
481 tracer_ = tracer; | 479 tracer_ = tracer; |
482 | 480 |
483 #ifdef DEBUG | 481 #ifdef DEBUG |
484 ASSERT(state_ == IDLE); | 482 ASSERT(state_ == IDLE); |
485 state_ = PREPARE_GC; | 483 state_ = PREPARE_GC; |
486 #endif | 484 #endif |
487 | 485 |
488 // TODO(1726) Revert this into an assertion when compaction is enabled. | |
489 ASSERT(!FLAG_never_compact || !FLAG_always_compact); | 486 ASSERT(!FLAG_never_compact || !FLAG_always_compact); |
490 | 487 |
491 if (collect_maps_) CreateBackPointers(); | 488 if (collect_maps_) CreateBackPointers(); |
492 #ifdef ENABLE_GDB_JIT_INTERFACE | 489 #ifdef ENABLE_GDB_JIT_INTERFACE |
493 if (FLAG_gdbjit) { | 490 if (FLAG_gdbjit) { |
494 // If GDBJIT interface is active disable compaction. | 491 // If GDBJIT interface is active disable compaction. |
495 compacting_collection_ = false; | 492 compacting_collection_ = false; |
496 } | 493 } |
497 #endif | 494 #endif |
498 | 495 |
(...skipping 916 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1415 } | 1412 } |
1416 | 1413 |
1417 private: | 1414 private: |
1418 MarkCompactCollector* collector_; | 1415 MarkCompactCollector* collector_; |
1419 }; | 1416 }; |
1420 | 1417 |
1421 | 1418 |
1422 void MarkCompactCollector::PrepareForCodeFlushing() { | 1419 void MarkCompactCollector::PrepareForCodeFlushing() { |
1423 ASSERT(heap() == Isolate::Current()->heap()); | 1420 ASSERT(heap() == Isolate::Current()->heap()); |
1424 | 1421 |
1425 if (!FLAG_flush_code) { | 1422 // TODO(1609) Currently incremental marker does not support code flushing. |
| 1423 if (!FLAG_flush_code || was_marked_incrementally_) { |
1426 EnableCodeFlushing(false); | 1424 EnableCodeFlushing(false); |
1427 return; | 1425 return; |
1428 } | 1426 } |
1429 | 1427 |
1430 #ifdef ENABLE_DEBUGGER_SUPPORT | 1428 #ifdef ENABLE_DEBUGGER_SUPPORT |
1431 if (heap()->isolate()->debug()->IsLoaded() || | 1429 if (heap()->isolate()->debug()->IsLoaded() || |
1432 heap()->isolate()->debug()->has_break_points()) { | 1430 heap()->isolate()->debug()->has_break_points()) { |
1433 EnableCodeFlushing(false); | 1431 EnableCodeFlushing(false); |
1434 return; | 1432 return; |
1435 } | 1433 } |
1436 #endif | 1434 #endif |
| 1435 |
1437 EnableCodeFlushing(true); | 1436 EnableCodeFlushing(true); |
1438 | 1437 |
1439 // Ensure that empty descriptor array is marked. Method MarkDescriptorArray | 1438 // Ensure that empty descriptor array is marked. Method MarkDescriptorArray |
1440 // relies on it being marked before any other descriptor array. | 1439 // relies on it being marked before any other descriptor array. |
1441 HeapObject* descriptor_array = heap()->empty_descriptor_array(); | 1440 HeapObject* descriptor_array = heap()->empty_descriptor_array(); |
1442 MarkBit descriptor_array_mark = Marking::MarkBitFrom(descriptor_array); | 1441 MarkBit descriptor_array_mark = Marking::MarkBitFrom(descriptor_array); |
1443 MarkObject(descriptor_array, descriptor_array_mark); | 1442 MarkObject(descriptor_array, descriptor_array_mark); |
1444 | 1443 |
1445 // Make sure we are not referencing the code from the stack. | 1444 // Make sure we are not referencing the code from the stack. |
1446 ASSERT(this == heap()->mark_compact_collector()); | 1445 ASSERT(this == heap()->mark_compact_collector()); |
(...skipping 2233 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3680 // of the previous ones. | 3679 // of the previous ones. |
3681 SweepSpace(heap()->map_space(), PRECISE); | 3680 SweepSpace(heap()->map_space(), PRECISE); |
3682 | 3681 |
3683 ASSERT(live_map_objects_size_ <= heap()->map_space()->Size()); | 3682 ASSERT(live_map_objects_size_ <= heap()->map_space()->Size()); |
3684 | 3683 |
3685 // Deallocate unmarked objects and clear marked bits for marked objects. | 3684 // Deallocate unmarked objects and clear marked bits for marked objects. |
3686 heap_->lo_space()->FreeUnmarkedObjects(); | 3685 heap_->lo_space()->FreeUnmarkedObjects(); |
3687 } | 3686 } |
3688 | 3687 |
3689 | 3688 |
3690 // TODO(1466) ReportDeleteIfNeeded is not called currently. | |
3691 // Our profiling tools do not expect intersections between | |
3692 // code objects. We should either reenable it or change our tools. | |
3693 void MarkCompactCollector::EnableCodeFlushing(bool enable) { | 3689 void MarkCompactCollector::EnableCodeFlushing(bool enable) { |
3694 if (enable) { | 3690 if (enable) { |
3695 if (code_flusher_ != NULL) return; | 3691 if (code_flusher_ != NULL) return; |
3696 code_flusher_ = new CodeFlusher(heap()->isolate()); | 3692 code_flusher_ = new CodeFlusher(heap()->isolate()); |
3697 } else { | 3693 } else { |
3698 if (code_flusher_ == NULL) return; | 3694 if (code_flusher_ == NULL) return; |
3699 delete code_flusher_; | 3695 delete code_flusher_; |
3700 code_flusher_ = NULL; | 3696 code_flusher_ = NULL; |
3701 } | 3697 } |
3702 } | 3698 } |
3703 | 3699 |
3704 | 3700 |
| 3701 // TODO(1466) ReportDeleteIfNeeded is not called currently. |
| 3702 // Our profiling tools do not expect intersections between |
| 3703 // code objects. We should either reenable it or change our tools. |
3705 void MarkCompactCollector::ReportDeleteIfNeeded(HeapObject* obj, | 3704 void MarkCompactCollector::ReportDeleteIfNeeded(HeapObject* obj, |
3706 Isolate* isolate) { | 3705 Isolate* isolate) { |
3707 #ifdef ENABLE_GDB_JIT_INTERFACE | 3706 #ifdef ENABLE_GDB_JIT_INTERFACE |
3708 if (obj->IsCode()) { | 3707 if (obj->IsCode()) { |
3709 GDBJITInterface::RemoveCode(reinterpret_cast<Code*>(obj)); | 3708 GDBJITInterface::RemoveCode(reinterpret_cast<Code*>(obj)); |
3710 } | 3709 } |
3711 #endif | 3710 #endif |
3712 if (obj->IsCode()) { | 3711 if (obj->IsCode()) { |
3713 PROFILE(isolate, CodeDeleteEvent(obj->address())); | 3712 PROFILE(isolate, CodeDeleteEvent(obj->address())); |
3714 } | 3713 } |
(...skipping 139 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3854 while (buffer != NULL) { | 3853 while (buffer != NULL) { |
3855 SlotsBuffer* next_buffer = buffer->next(); | 3854 SlotsBuffer* next_buffer = buffer->next(); |
3856 DeallocateBuffer(buffer); | 3855 DeallocateBuffer(buffer); |
3857 buffer = next_buffer; | 3856 buffer = next_buffer; |
3858 } | 3857 } |
3859 *buffer_address = NULL; | 3858 *buffer_address = NULL; |
3860 } | 3859 } |
3861 | 3860 |
3862 | 3861 |
3863 } } // namespace v8::internal | 3862 } } // namespace v8::internal |
OLD | NEW |