OLD | NEW |
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 "v8.h" | 5 #include "v8.h" |
6 | 6 |
7 #include "code-stubs.h" | 7 #include "code-stubs.h" |
8 #include "compilation-cache.h" | 8 #include "compilation-cache.h" |
9 #include "cpu-profiler.h" | 9 #include "cpu-profiler.h" |
10 #include "deoptimizer.h" | 10 #include "deoptimizer.h" |
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
44 marking_parity_(ODD_MARKING_PARITY), | 44 marking_parity_(ODD_MARKING_PARITY), |
45 compacting_(false), | 45 compacting_(false), |
46 was_marked_incrementally_(false), | 46 was_marked_incrementally_(false), |
47 sweeping_pending_(false), | 47 sweeping_pending_(false), |
48 pending_sweeper_jobs_semaphore_(0), | 48 pending_sweeper_jobs_semaphore_(0), |
49 sequential_sweeping_(false), | 49 sequential_sweeping_(false), |
50 tracer_(NULL), | 50 tracer_(NULL), |
51 migration_slots_buffer_(NULL), | 51 migration_slots_buffer_(NULL), |
52 heap_(heap), | 52 heap_(heap), |
53 code_flusher_(NULL), | 53 code_flusher_(NULL), |
54 encountered_weak_collections_(NULL), | |
55 have_code_to_deoptimize_(false) { } | 54 have_code_to_deoptimize_(false) { } |
56 | 55 |
57 #ifdef VERIFY_HEAP | 56 #ifdef VERIFY_HEAP |
58 class VerifyMarkingVisitor: public ObjectVisitor { | 57 class VerifyMarkingVisitor: public ObjectVisitor { |
59 public: | 58 public: |
60 explicit VerifyMarkingVisitor(Heap* heap) : heap_(heap) {} | 59 explicit VerifyMarkingVisitor(Heap* heap) : heap_(heap) {} |
61 | 60 |
62 void VisitPointers(Object** start, Object** end) { | 61 void VisitPointers(Object** start, Object** end) { |
63 for (Object** current = start; current < end; current++) { | 62 for (Object** current = start; current < end; current++) { |
64 if ((*current)->IsHeapObject()) { | 63 if ((*current)->IsHeapObject()) { |
(...skipping 2666 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2731 new_number_of_entries += survived; | 2730 new_number_of_entries += survived; |
2732 } | 2731 } |
2733 for (int i = new_number_of_entries; i < number_of_entries; i++) { | 2732 for (int i = new_number_of_entries; i < number_of_entries; i++) { |
2734 entries->clear_at(i); | 2733 entries->clear_at(i); |
2735 } | 2734 } |
2736 } | 2735 } |
2737 | 2736 |
2738 | 2737 |
2739 void MarkCompactCollector::ProcessWeakCollections() { | 2738 void MarkCompactCollector::ProcessWeakCollections() { |
2740 GCTracer::Scope gc_scope(tracer_, GCTracer::Scope::MC_WEAKCOLLECTION_PROCESS); | 2739 GCTracer::Scope gc_scope(tracer_, GCTracer::Scope::MC_WEAKCOLLECTION_PROCESS); |
2741 Object* weak_collection_obj = encountered_weak_collections(); | 2740 Object* weak_collection_obj = heap()->encountered_weak_collections(); |
2742 while (weak_collection_obj != Smi::FromInt(0)) { | 2741 while (weak_collection_obj != Smi::FromInt(0)) { |
2743 JSWeakCollection* weak_collection = | 2742 JSWeakCollection* weak_collection = |
2744 reinterpret_cast<JSWeakCollection*>(weak_collection_obj); | 2743 reinterpret_cast<JSWeakCollection*>(weak_collection_obj); |
2745 ASSERT(MarkCompactCollector::IsMarked(weak_collection)); | 2744 ASSERT(MarkCompactCollector::IsMarked(weak_collection)); |
2746 if (weak_collection->table()->IsHashTable()) { | 2745 if (weak_collection->table()->IsHashTable()) { |
2747 ObjectHashTable* table = ObjectHashTable::cast(weak_collection->table()); | 2746 ObjectHashTable* table = ObjectHashTable::cast(weak_collection->table()); |
2748 Object** anchor = reinterpret_cast<Object**>(table->address()); | 2747 Object** anchor = reinterpret_cast<Object**>(table->address()); |
2749 for (int i = 0; i < table->Capacity(); i++) { | 2748 for (int i = 0; i < table->Capacity(); i++) { |
2750 if (MarkCompactCollector::IsMarked(HeapObject::cast(table->KeyAt(i)))) { | 2749 if (MarkCompactCollector::IsMarked(HeapObject::cast(table->KeyAt(i)))) { |
2751 Object** key_slot = | 2750 Object** key_slot = |
2752 table->RawFieldOfElementAt(ObjectHashTable::EntryToIndex(i)); | 2751 table->RawFieldOfElementAt(ObjectHashTable::EntryToIndex(i)); |
2753 RecordSlot(anchor, key_slot, *key_slot); | 2752 RecordSlot(anchor, key_slot, *key_slot); |
2754 Object** value_slot = | 2753 Object** value_slot = |
2755 table->RawFieldOfElementAt(ObjectHashTable::EntryToValueIndex(i)); | 2754 table->RawFieldOfElementAt(ObjectHashTable::EntryToValueIndex(i)); |
2756 MarkCompactMarkingVisitor::MarkObjectByPointer( | 2755 MarkCompactMarkingVisitor::MarkObjectByPointer( |
2757 this, anchor, value_slot); | 2756 this, anchor, value_slot); |
2758 } | 2757 } |
2759 } | 2758 } |
2760 } | 2759 } |
2761 weak_collection_obj = weak_collection->next(); | 2760 weak_collection_obj = weak_collection->next(); |
2762 } | 2761 } |
2763 } | 2762 } |
2764 | 2763 |
2765 | 2764 |
2766 void MarkCompactCollector::ClearWeakCollections() { | 2765 void MarkCompactCollector::ClearWeakCollections() { |
2767 GCTracer::Scope gc_scope(tracer_, GCTracer::Scope::MC_WEAKCOLLECTION_CLEAR); | 2766 GCTracer::Scope gc_scope(tracer_, GCTracer::Scope::MC_WEAKCOLLECTION_CLEAR); |
2768 Object* weak_collection_obj = encountered_weak_collections(); | 2767 Object* weak_collection_obj = heap()->encountered_weak_collections(); |
2769 while (weak_collection_obj != Smi::FromInt(0)) { | 2768 while (weak_collection_obj != Smi::FromInt(0)) { |
2770 JSWeakCollection* weak_collection = | 2769 JSWeakCollection* weak_collection = |
2771 reinterpret_cast<JSWeakCollection*>(weak_collection_obj); | 2770 reinterpret_cast<JSWeakCollection*>(weak_collection_obj); |
2772 ASSERT(MarkCompactCollector::IsMarked(weak_collection)); | 2771 ASSERT(MarkCompactCollector::IsMarked(weak_collection)); |
2773 if (weak_collection->table()->IsHashTable()) { | 2772 if (weak_collection->table()->IsHashTable()) { |
2774 ObjectHashTable* table = ObjectHashTable::cast(weak_collection->table()); | 2773 ObjectHashTable* table = ObjectHashTable::cast(weak_collection->table()); |
2775 for (int i = 0; i < table->Capacity(); i++) { | 2774 for (int i = 0; i < table->Capacity(); i++) { |
2776 HeapObject* key = HeapObject::cast(table->KeyAt(i)); | 2775 HeapObject* key = HeapObject::cast(table->KeyAt(i)); |
2777 if (!MarkCompactCollector::IsMarked(key)) { | 2776 if (!MarkCompactCollector::IsMarked(key)) { |
2778 table->RemoveEntry(i); | 2777 table->RemoveEntry(i); |
2779 } | 2778 } |
2780 } | 2779 } |
2781 } | 2780 } |
2782 weak_collection_obj = weak_collection->next(); | 2781 weak_collection_obj = weak_collection->next(); |
2783 weak_collection->set_next(heap()->undefined_value()); | 2782 weak_collection->set_next(heap()->undefined_value()); |
2784 } | 2783 } |
2785 set_encountered_weak_collections(Smi::FromInt(0)); | 2784 heap()->set_encountered_weak_collections(Smi::FromInt(0)); |
2786 } | 2785 } |
2787 | 2786 |
2788 | 2787 |
2789 // We scavange new space simultaneously with sweeping. This is done in two | 2788 // We scavange new space simultaneously with sweeping. This is done in two |
2790 // passes. | 2789 // passes. |
2791 // | 2790 // |
2792 // The first pass migrates all alive objects from one semispace to another or | 2791 // The first pass migrates all alive objects from one semispace to another or |
2793 // promotes them to old space. Forwarding address is written directly into | 2792 // promotes them to old space. Forwarding address is written directly into |
2794 // first word of object without any encoding. If object is dead we write | 2793 // first word of object without any encoding. If object is dead we write |
2795 // NULL as a forwarding address. | 2794 // NULL as a forwarding address. |
(...skipping 1669 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4465 while (buffer != NULL) { | 4464 while (buffer != NULL) { |
4466 SlotsBuffer* next_buffer = buffer->next(); | 4465 SlotsBuffer* next_buffer = buffer->next(); |
4467 DeallocateBuffer(buffer); | 4466 DeallocateBuffer(buffer); |
4468 buffer = next_buffer; | 4467 buffer = next_buffer; |
4469 } | 4468 } |
4470 *buffer_address = NULL; | 4469 *buffer_address = NULL; |
4471 } | 4470 } |
4472 | 4471 |
4473 | 4472 |
4474 } } // namespace v8::internal | 4473 } } // namespace v8::internal |
OLD | NEW |