Index: src/mark-compact.cc |
diff --git a/src/mark-compact.cc b/src/mark-compact.cc |
index a9d0c166c8cc96fa440de8df46cc59ec99831cc9..0e6c59e0767cd2d8fd1f5b47625ad7045ce6b94a 100644 |
--- a/src/mark-compact.cc |
+++ b/src/mark-compact.cc |
@@ -1823,24 +1823,6 @@ template void Marker<MarkCompactCollector>::MarkMapContents(Map* map); |
template <class T> |
void Marker<T>::MarkMapContents(Map* map) { |
- // Mark prototype transitions array but don't push it into marking stack. |
- // This will make references from it weak. We will clean dead prototype |
- // transitions in ClearNonLiveTransitions. |
- Object** proto_trans_slot = |
- HeapObject::RawField(map, Map::kPrototypeTransitionsOrBackPointerOffset); |
- HeapObject* prototype_transitions = HeapObject::cast(*proto_trans_slot); |
- if (prototype_transitions->IsFixedArray()) { |
- mark_compact_collector()->RecordSlot(proto_trans_slot, |
- proto_trans_slot, |
- prototype_transitions); |
- MarkBit mark = Marking::MarkBitFrom(prototype_transitions); |
- if (!mark.Get()) { |
- mark.Set(); |
- MemoryChunk::IncrementLiveBytesFromGC(prototype_transitions->address(), |
- prototype_transitions->Size()); |
- } |
- } |
- |
// Make sure that the back pointer stored either in the map itself or inside |
// its prototype transitions array is marked. Treat pointers in the descriptor |
// array as weak and also mark that array to prevent visiting it later. |
@@ -1855,13 +1837,12 @@ void Marker<T>::MarkMapContents(Map* map) { |
// Mark the Object* fields of the Map. Since the descriptor array has been |
// marked already, it is fine that one of these fields contains a pointer |
- // to it. But make sure to skip back pointer and prototype transitions. |
+ // to it. But make sure to skip back pointer. |
STATIC_ASSERT(Map::kPointerFieldsEndOffset == |
- Map::kPrototypeTransitionsOrBackPointerOffset + kPointerSize); |
- Object** start_slot = HeapObject::RawField( |
- map, Map::kPointerFieldsBeginOffset); |
- Object** end_slot = HeapObject::RawField( |
- map, Map::kPrototypeTransitionsOrBackPointerOffset); |
+ Map::kBackPointerOffset + kPointerSize); |
+ Object** start_slot = |
+ HeapObject::RawField(map, Map::kPointerFieldsBeginOffset); |
+ Object** end_slot = HeapObject::RawField(map, Map::kBackPointerOffset); |
for (Object** slot = start_slot; slot < end_slot; slot++) { |
Object* obj = *slot; |
if (!obj->NonFailureIsHeapObject()) continue; |
@@ -1957,6 +1938,17 @@ void Marker<T>::MarkTransitionArray(TransitionArray* transitions) { |
transitions->elements_transition()); |
} |
+ if (transitions->HasPrototypeTransitions()) { |
+ // Mark prototype transitions array but don't push it into marking stack. |
+ // This will make references from it weak. We will clean dead prototype |
+ // transitions in ClearNonLiveTransitions. |
+ Object** proto_trans_slot = transitions->GetPrototypeTransitionsSlot(); |
+ HeapObject* prototype_transitions = HeapObject::cast(*proto_trans_slot); |
+ base_marker()->MarkObjectWithoutPush(prototype_transitions); |
+ mark_compact_collector()->RecordSlot( |
+ transitions_start, proto_trans_slot, prototype_transitions); |
+ } |
+ |
for (int i = 0; i < transitions->number_of_transitions(); ++i) { |
Object** key_slot = transitions->GetKeySlot(i); |
Object* key = *key_slot; |
@@ -2545,7 +2537,7 @@ void MarkCompactCollector::ClearNonLiveTransitions() { |
void MarkCompactCollector::ClearNonLivePrototypeTransitions(Map* map) { |
int number_of_transitions = map->NumberOfProtoTransitions(); |
- FixedArray* prototype_transitions = map->prototype_transitions(); |
+ FixedArray* prototype_transitions = map->GetPrototypeTransitions(); |
int new_number_of_transitions = 0; |
const int header = Map::kProtoTransitionHeaderSize; |