Index: src/mark-compact.cc |
diff --git a/src/mark-compact.cc b/src/mark-compact.cc |
index 93614aceba272263c529d86ed1982be323c68c74..1af1b632ab2a672c526d5e0de252a47fe7cfbcba 100644 |
--- a/src/mark-compact.cc |
+++ b/src/mark-compact.cc |
@@ -1672,6 +1672,32 @@ void MarkCompactCollector::MarkMapContents(Map* map) { |
} |
+bool MarkCompactCollector::MarkUnmarked(Object* value) { |
Michael Starzinger
2012/01/24 13:28:30
The name is kind of misleading, because it not onl
|
+ HeapObject* object = HeapObject::cast(value); |
+ MarkBit mark = Marking::MarkBitFrom(object); |
+ bool old_mark = mark.Get(); |
+ if (!old_mark) SetMark(object, mark); |
+ return old_mark; |
+} |
+ |
+ |
+bool MarkCompactCollector::MarkUnmarkedAndPush(Object* value) { |
Michael Starzinger
2012/01/24 13:28:30
Boolean return value is never used, can we drop it
|
+ bool old_mark = MarkUnmarked(value); |
+ if (!old_mark) marking_deque_.PushBlack(HeapObject::cast(value)); |
+ return old_mark; |
+} |
+ |
+ |
+void MarkCompactCollector::MarkAccessorPairSlot(AccessorPair* accessors, |
+ int offset) { |
+ Object** slot = HeapObject::RawField(accessors, offset); |
+ Object* accessor = *slot; |
+ if (accessor->IsMap()) return; |
+ RecordSlot(slot, slot, accessor); |
+ MarkUnmarkedAndPush(accessor); |
+} |
+ |
+ |
void MarkCompactCollector::MarkDescriptorArray( |
DescriptorArray* descriptors) { |
MarkBit descriptors_mark = Marking::MarkBitFrom(descriptors); |
@@ -1704,22 +1730,33 @@ void MarkCompactCollector::MarkDescriptorArray( |
RecordSlot(slot, slot, *slot); |
- if (details.IsProperty()) { |
- HeapObject* object = HeapObject::cast(value); |
- MarkBit mark = Marking::MarkBitFrom(HeapObject::cast(object)); |
- if (!mark.Get()) { |
- SetMark(HeapObject::cast(object), mark); |
- marking_deque_.PushBlack(object); |
- } |
- } else if (details.type() == ELEMENTS_TRANSITION && value->IsFixedArray()) { |
- // For maps with multiple elements transitions, the transition maps are |
- // stored in a FixedArray. Keep the fixed array alive but not the maps |
- // that it refers to. |
- HeapObject* object = HeapObject::cast(value); |
- MarkBit mark = Marking::MarkBitFrom(HeapObject::cast(object)); |
- if (!mark.Get()) { |
- SetMark(HeapObject::cast(object), mark); |
- } |
+ switch (details.type()) { |
+ case NORMAL: |
+ case FIELD: |
+ case CONSTANT_FUNCTION: |
+ case HANDLER: |
+ case INTERCEPTOR: |
+ MarkUnmarkedAndPush(value); |
+ break; |
+ case CALLBACKS: |
+ if (!value->IsAccessorPair()) { |
+ MarkUnmarkedAndPush(value); |
+ } else if (!MarkUnmarked(value)) { |
+ AccessorPair* accessors = AccessorPair::cast(value); |
+ MarkAccessorPairSlot(accessors, AccessorPair::kGetterOffset); |
+ MarkAccessorPairSlot(accessors, AccessorPair::kSetterOffset); |
+ } |
+ break; |
+ case ELEMENTS_TRANSITION: |
+ // For maps with multiple elements transitions, the transition maps are |
+ // stored in a FixedArray. Keep the fixed array alive but not the maps |
+ // that it refers to. |
+ if (value->IsFixedArray()) MarkUnmarked(value); |
+ break; |
+ case MAP_TRANSITION: |
+ case CONSTANT_TRANSITION: |
+ case NULL_DESCRIPTOR: |
+ break; |
} |
} |
// The DescriptorArray descriptors contains a pointer to its contents array, |