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 "src/heap/mark-compact.h" | 5 #include "src/heap/mark-compact.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/base/sys-info.h" | 9 #include "src/base/sys-info.h" |
10 #include "src/code-stubs.h" | 10 #include "src/code-stubs.h" |
(...skipping 2180 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2191 void MarkCompactCollector::ClearNonLiveReferences() { | 2191 void MarkCompactCollector::ClearNonLiveReferences() { |
2192 GCTracer::Scope gc_scope(heap()->tracer(), | 2192 GCTracer::Scope gc_scope(heap()->tracer(), |
2193 GCTracer::Scope::MC_NONLIVEREFERENCES); | 2193 GCTracer::Scope::MC_NONLIVEREFERENCES); |
2194 // Iterate over the map space, setting map transitions that go from | 2194 // Iterate over the map space, setting map transitions that go from |
2195 // a marked map to an unmarked map to null transitions. This action | 2195 // a marked map to an unmarked map to null transitions. This action |
2196 // is carried out only on maps of JSObjects and related subtypes. | 2196 // is carried out only on maps of JSObjects and related subtypes. |
2197 HeapObjectIterator map_iterator(heap()->map_space()); | 2197 HeapObjectIterator map_iterator(heap()->map_space()); |
2198 for (HeapObject* obj = map_iterator.Next(); obj != NULL; | 2198 for (HeapObject* obj = map_iterator.Next(); obj != NULL; |
2199 obj = map_iterator.Next()) { | 2199 obj = map_iterator.Next()) { |
2200 Map* map = Map::cast(obj); | 2200 Map* map = Map::cast(obj); |
2201 | |
2202 if (!map->CanTransition()) continue; | 2201 if (!map->CanTransition()) continue; |
2203 | |
2204 MarkBit map_mark = Marking::MarkBitFrom(map); | 2202 MarkBit map_mark = Marking::MarkBitFrom(map); |
2205 ClearNonLivePrototypeTransitions(map); | 2203 bool alive = Marking::IsBlackOrGrey(map_mark); |
2206 ClearNonLiveMapTransitions(map, map_mark); | 2204 if (alive) { |
2207 | 2205 ClearNonLivePrototypeTransitions(map); |
2208 if (Marking::IsWhite(map_mark)) { | 2206 } else { |
| 2207 ClearNonLiveMapTransitions(map); |
2209 have_code_to_deoptimize_ |= | 2208 have_code_to_deoptimize_ |= |
2210 map->dependent_code()->MarkCodeForDeoptimization( | 2209 map->dependent_code()->MarkCodeForDeoptimization( |
2211 isolate(), DependentCode::kWeakCodeGroup); | 2210 isolate(), DependentCode::kWeakCodeGroup); |
2212 map->set_dependent_code(DependentCode::cast(heap()->empty_fixed_array())); | 2211 map->set_dependent_code(DependentCode::cast(heap()->empty_fixed_array())); |
2213 } | 2212 } |
2214 } | 2213 } |
2215 | 2214 |
2216 WeakHashTable* table = heap_->weak_object_to_code_table(); | 2215 WeakHashTable* table = heap_->weak_object_to_code_table(); |
2217 uint32_t capacity = table->Capacity(); | 2216 uint32_t capacity = table->Capacity(); |
2218 for (uint32_t i = 0; i < capacity; i++) { | 2217 for (uint32_t i = 0; i < capacity; i++) { |
(...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2260 new_number_of_transitions); | 2259 new_number_of_transitions); |
2261 } | 2260 } |
2262 | 2261 |
2263 // Fill slots that became free with undefined value. | 2262 // Fill slots that became free with undefined value. |
2264 for (int i = new_number_of_transitions; i < number_of_transitions; i++) { | 2263 for (int i = new_number_of_transitions; i < number_of_transitions; i++) { |
2265 prototype_transitions->set_undefined(header + i); | 2264 prototype_transitions->set_undefined(header + i); |
2266 } | 2265 } |
2267 } | 2266 } |
2268 | 2267 |
2269 | 2268 |
2270 void MarkCompactCollector::ClearNonLiveMapTransitions(Map* map, | 2269 void MarkCompactCollector::ClearNonLiveMapTransitions(Map* map) { |
2271 MarkBit map_mark) { | |
2272 Object* potential_parent = map->GetBackPointer(); | 2270 Object* potential_parent = map->GetBackPointer(); |
2273 if (!potential_parent->IsMap()) return; | 2271 if (!potential_parent->IsMap()) return; |
2274 Map* parent = Map::cast(potential_parent); | 2272 Map* parent = Map::cast(potential_parent); |
2275 | 2273 |
2276 // Follow back pointer, check whether we are dealing with a map transition | 2274 // Follow back pointer, check whether we are dealing with a map transition |
2277 // from a live map to a dead path and in case clear transitions of parent. | 2275 // from a live map to a dead path and in case clear transitions of parent. |
2278 bool current_is_alive = Marking::IsBlackOrGrey(map_mark); | 2276 DCHECK(!Marking::IsBlackOrGrey(Marking::MarkBitFrom(map))); |
2279 bool parent_is_alive = Marking::IsBlackOrGrey(Marking::MarkBitFrom(parent)); | 2277 bool parent_is_alive = Marking::IsBlackOrGrey(Marking::MarkBitFrom(parent)); |
2280 if (!current_is_alive && parent_is_alive) { | 2278 if (parent_is_alive) { |
2281 ClearMapTransitions(parent, map); | 2279 ClearMapTransitions(parent, map); |
2282 } | 2280 } |
2283 } | 2281 } |
2284 | 2282 |
2285 | 2283 |
2286 // Clear a possible back pointer in case the transition leads to a dead map. | 2284 // Clear a possible back pointer in case the transition leads to a dead map. |
2287 // Return true in case a back pointer has been cleared and false otherwise. | 2285 // Return true in case a back pointer has been cleared and false otherwise. |
2288 bool MarkCompactCollector::ClearMapBackPointer(Map* target) { | 2286 bool MarkCompactCollector::ClearMapBackPointer(Map* target) { |
2289 if (Marking::IsBlackOrGrey(Marking::MarkBitFrom(target))) return false; | 2287 if (Marking::IsBlackOrGrey(Marking::MarkBitFrom(target))) return false; |
2290 target->SetBackPointer(heap_->undefined_value(), SKIP_WRITE_BARRIER); | 2288 target->SetBackPointer(heap_->undefined_value(), SKIP_WRITE_BARRIER); |
(...skipping 2284 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4575 MarkBit mark_bit = Marking::MarkBitFrom(host); | 4573 MarkBit mark_bit = Marking::MarkBitFrom(host); |
4576 if (Marking::IsBlack(mark_bit)) { | 4574 if (Marking::IsBlack(mark_bit)) { |
4577 RelocInfo rinfo(pc, RelocInfo::CODE_TARGET, 0, host); | 4575 RelocInfo rinfo(pc, RelocInfo::CODE_TARGET, 0, host); |
4578 RecordRelocSlot(&rinfo, target); | 4576 RecordRelocSlot(&rinfo, target); |
4579 } | 4577 } |
4580 } | 4578 } |
4581 } | 4579 } |
4582 | 4580 |
4583 } // namespace internal | 4581 } // namespace internal |
4584 } // namespace v8 | 4582 } // namespace v8 |
OLD | NEW |