| OLD | NEW |
| 1 // Copyright 2012 the V8 project authors. All rights reserved. | 1 // Copyright 2012 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 61 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 72 tracer_(NULL), | 72 tracer_(NULL), |
| 73 migration_slots_buffer_(NULL), | 73 migration_slots_buffer_(NULL), |
| 74 heap_(NULL), | 74 heap_(NULL), |
| 75 code_flusher_(NULL), | 75 code_flusher_(NULL), |
| 76 encountered_weak_collections_(NULL), | 76 encountered_weak_collections_(NULL), |
| 77 have_code_to_deoptimize_(false) { } | 77 have_code_to_deoptimize_(false) { } |
| 78 | 78 |
| 79 #ifdef VERIFY_HEAP | 79 #ifdef VERIFY_HEAP |
| 80 class VerifyMarkingVisitor: public ObjectVisitor { | 80 class VerifyMarkingVisitor: public ObjectVisitor { |
| 81 public: | 81 public: |
| 82 explicit VerifyMarkingVisitor(Heap* heap) : heap_(heap) {} |
| 83 |
| 82 void VisitPointers(Object** start, Object** end) { | 84 void VisitPointers(Object** start, Object** end) { |
| 83 for (Object** current = start; current < end; current++) { | 85 for (Object** current = start; current < end; current++) { |
| 84 if ((*current)->IsHeapObject()) { | 86 if ((*current)->IsHeapObject()) { |
| 85 HeapObject* object = HeapObject::cast(*current); | 87 HeapObject* object = HeapObject::cast(*current); |
| 86 CHECK(HEAP->mark_compact_collector()->IsMarked(object)); | 88 CHECK(heap_->mark_compact_collector()->IsMarked(object)); |
| 87 } | 89 } |
| 88 } | 90 } |
| 89 } | 91 } |
| 90 | 92 |
| 91 void VisitEmbeddedPointer(RelocInfo* rinfo) { | 93 void VisitEmbeddedPointer(RelocInfo* rinfo) { |
| 92 ASSERT(rinfo->rmode() == RelocInfo::EMBEDDED_OBJECT); | 94 ASSERT(rinfo->rmode() == RelocInfo::EMBEDDED_OBJECT); |
| 93 if (!FLAG_weak_embedded_maps_in_optimized_code || !FLAG_collect_maps || | 95 if (!FLAG_weak_embedded_maps_in_optimized_code || !FLAG_collect_maps || |
| 94 rinfo->host()->kind() != Code::OPTIMIZED_FUNCTION || | 96 rinfo->host()->kind() != Code::OPTIMIZED_FUNCTION || |
| 95 !rinfo->target_object()->IsMap() || | 97 !rinfo->target_object()->IsMap() || |
| 96 !Map::cast(rinfo->target_object())->CanTransition()) { | 98 !Map::cast(rinfo->target_object())->CanTransition()) { |
| 97 VisitPointer(rinfo->target_object_address()); | 99 VisitPointer(rinfo->target_object_address()); |
| 98 } | 100 } |
| 99 } | 101 } |
| 102 |
| 103 private: |
| 104 Heap* heap_; |
| 100 }; | 105 }; |
| 101 | 106 |
| 102 | 107 |
| 103 static void VerifyMarking(Address bottom, Address top) { | 108 static void VerifyMarking(Heap* heap, Address bottom, Address top) { |
| 104 VerifyMarkingVisitor visitor; | 109 VerifyMarkingVisitor visitor(heap); |
| 105 HeapObject* object; | 110 HeapObject* object; |
| 106 Address next_object_must_be_here_or_later = bottom; | 111 Address next_object_must_be_here_or_later = bottom; |
| 107 | 112 |
| 108 for (Address current = bottom; | 113 for (Address current = bottom; |
| 109 current < top; | 114 current < top; |
| 110 current += kPointerSize) { | 115 current += kPointerSize) { |
| 111 object = HeapObject::FromAddress(current); | 116 object = HeapObject::FromAddress(current); |
| 112 if (MarkCompactCollector::IsMarked(object)) { | 117 if (MarkCompactCollector::IsMarked(object)) { |
| 113 CHECK(current >= next_object_must_be_here_or_later); | 118 CHECK(current >= next_object_must_be_here_or_later); |
| 114 object->Iterate(&visitor); | 119 object->Iterate(&visitor); |
| 115 next_object_must_be_here_or_later = current + object->Size(); | 120 next_object_must_be_here_or_later = current + object->Size(); |
| 116 } | 121 } |
| 117 } | 122 } |
| 118 } | 123 } |
| 119 | 124 |
| 120 | 125 |
| 121 static void VerifyMarking(NewSpace* space) { | 126 static void VerifyMarking(NewSpace* space) { |
| 122 Address end = space->top(); | 127 Address end = space->top(); |
| 123 NewSpacePageIterator it(space->bottom(), end); | 128 NewSpacePageIterator it(space->bottom(), end); |
| 124 // The bottom position is at the start of its page. Allows us to use | 129 // The bottom position is at the start of its page. Allows us to use |
| 125 // page->area_start() as start of range on all pages. | 130 // page->area_start() as start of range on all pages. |
| 126 CHECK_EQ(space->bottom(), | 131 CHECK_EQ(space->bottom(), |
| 127 NewSpacePage::FromAddress(space->bottom())->area_start()); | 132 NewSpacePage::FromAddress(space->bottom())->area_start()); |
| 128 while (it.has_next()) { | 133 while (it.has_next()) { |
| 129 NewSpacePage* page = it.next(); | 134 NewSpacePage* page = it.next(); |
| 130 Address limit = it.has_next() ? page->area_end() : end; | 135 Address limit = it.has_next() ? page->area_end() : end; |
| 131 CHECK(limit == end || !page->Contains(end)); | 136 CHECK(limit == end || !page->Contains(end)); |
| 132 VerifyMarking(page->area_start(), limit); | 137 VerifyMarking(space->heap(), page->area_start(), limit); |
| 133 } | 138 } |
| 134 } | 139 } |
| 135 | 140 |
| 136 | 141 |
| 137 static void VerifyMarking(PagedSpace* space) { | 142 static void VerifyMarking(PagedSpace* space) { |
| 138 PageIterator it(space); | 143 PageIterator it(space); |
| 139 | 144 |
| 140 while (it.has_next()) { | 145 while (it.has_next()) { |
| 141 Page* p = it.next(); | 146 Page* p = it.next(); |
| 142 VerifyMarking(p->area_start(), p->area_end()); | 147 VerifyMarking(space->heap(), p->area_start(), p->area_end()); |
| 143 } | 148 } |
| 144 } | 149 } |
| 145 | 150 |
| 146 | 151 |
| 147 static void VerifyMarking(Heap* heap) { | 152 static void VerifyMarking(Heap* heap) { |
| 148 VerifyMarking(heap->old_pointer_space()); | 153 VerifyMarking(heap->old_pointer_space()); |
| 149 VerifyMarking(heap->old_data_space()); | 154 VerifyMarking(heap->old_data_space()); |
| 150 VerifyMarking(heap->code_space()); | 155 VerifyMarking(heap->code_space()); |
| 151 VerifyMarking(heap->cell_space()); | 156 VerifyMarking(heap->cell_space()); |
| 152 VerifyMarking(heap->property_cell_space()); | 157 VerifyMarking(heap->property_cell_space()); |
| 153 VerifyMarking(heap->map_space()); | 158 VerifyMarking(heap->map_space()); |
| 154 VerifyMarking(heap->new_space()); | 159 VerifyMarking(heap->new_space()); |
| 155 | 160 |
| 156 VerifyMarkingVisitor visitor; | 161 VerifyMarkingVisitor visitor(heap); |
| 157 | 162 |
| 158 LargeObjectIterator it(heap->lo_space()); | 163 LargeObjectIterator it(heap->lo_space()); |
| 159 for (HeapObject* obj = it.Next(); obj != NULL; obj = it.Next()) { | 164 for (HeapObject* obj = it.Next(); obj != NULL; obj = it.Next()) { |
| 160 if (MarkCompactCollector::IsMarked(obj)) { | 165 if (MarkCompactCollector::IsMarked(obj)) { |
| 161 obj->Iterate(&visitor); | 166 obj->Iterate(&visitor); |
| 162 } | 167 } |
| 163 } | 168 } |
| 164 | 169 |
| 165 heap->IterateStrongRoots(&visitor, VISIT_ONLY_STRONG); | 170 heap->IterateStrongRoots(&visitor, VISIT_ONLY_STRONG); |
| 166 } | 171 } |
| (...skipping 1235 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1402 MarkBit mark = Marking::MarkBitFrom(object); | 1407 MarkBit mark = Marking::MarkBitFrom(object); |
| 1403 collector->MarkObject(object, mark); | 1408 collector->MarkObject(object, mark); |
| 1404 } | 1409 } |
| 1405 | 1410 |
| 1406 | 1411 |
| 1407 // Visit an unmarked object. | 1412 // Visit an unmarked object. |
| 1408 INLINE(static void VisitUnmarkedObject(MarkCompactCollector* collector, | 1413 INLINE(static void VisitUnmarkedObject(MarkCompactCollector* collector, |
| 1409 HeapObject* obj)) { | 1414 HeapObject* obj)) { |
| 1410 #ifdef DEBUG | 1415 #ifdef DEBUG |
| 1411 ASSERT(collector->heap()->Contains(obj)); | 1416 ASSERT(collector->heap()->Contains(obj)); |
| 1412 ASSERT(!HEAP->mark_compact_collector()->IsMarked(obj)); | 1417 ASSERT(!collector->heap()->mark_compact_collector()->IsMarked(obj)); |
| 1413 #endif | 1418 #endif |
| 1414 Map* map = obj->map(); | 1419 Map* map = obj->map(); |
| 1415 Heap* heap = obj->GetHeap(); | 1420 Heap* heap = obj->GetHeap(); |
| 1416 MarkBit mark = Marking::MarkBitFrom(obj); | 1421 MarkBit mark = Marking::MarkBitFrom(obj); |
| 1417 heap->mark_compact_collector()->SetMark(obj, mark); | 1422 heap->mark_compact_collector()->SetMark(obj, mark); |
| 1418 // Mark the map pointer and the body. | 1423 // Mark the map pointer and the body. |
| 1419 MarkBit map_mark = Marking::MarkBitFrom(map); | 1424 MarkBit map_mark = Marking::MarkBitFrom(map); |
| 1420 heap->mark_compact_collector()->MarkObject(map, map_mark); | 1425 heap->mark_compact_collector()->MarkObject(map, map_mark); |
| 1421 IterateBody(map, obj); | 1426 IterateBody(map, obj); |
| 1422 } | 1427 } |
| (...skipping 2886 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 4309 while (buffer != NULL) { | 4314 while (buffer != NULL) { |
| 4310 SlotsBuffer* next_buffer = buffer->next(); | 4315 SlotsBuffer* next_buffer = buffer->next(); |
| 4311 DeallocateBuffer(buffer); | 4316 DeallocateBuffer(buffer); |
| 4312 buffer = next_buffer; | 4317 buffer = next_buffer; |
| 4313 } | 4318 } |
| 4314 *buffer_address = NULL; | 4319 *buffer_address = NULL; |
| 4315 } | 4320 } |
| 4316 | 4321 |
| 4317 | 4322 |
| 4318 } } // namespace v8::internal | 4323 } } // namespace v8::internal |
| OLD | NEW |