Index: src/heap/mark-compact.h |
diff --git a/src/heap/mark-compact.h b/src/heap/mark-compact.h |
index 9918fef172093785a8d9103d4980b02f8f5548d7..e14a457dadf8ee532c46343e020fc6ca3c6c4d84 100644 |
--- a/src/heap/mark-compact.h |
+++ b/src/heap/mark-compact.h |
@@ -8,6 +8,7 @@ |
#include <deque> |
#include "src/base/bits.h" |
+#include "src/heap/marking.h" |
#include "src/heap/spaces.h" |
#include "src/heap/store-buffer.h" |
@@ -28,7 +29,7 @@ class MarkCompactCollector; |
class MarkingVisitor; |
class RootMarkingVisitor; |
-class Marking : public AllStatic { |
+class ObjectMarking : public AllStatic { |
public: |
INLINE(static MarkBit MarkBitFrom(Address addr)) { |
MemoryChunk* p = MemoryChunk::FromAddress(addr); |
@@ -39,143 +40,14 @@ class Marking : public AllStatic { |
return MarkBitFrom(reinterpret_cast<Address>(obj)); |
} |
- // Impossible markbits: 01 |
- static const char* kImpossibleBitPattern; |
- INLINE(static bool IsImpossible(MarkBit mark_bit)) { |
- return !mark_bit.Get() && mark_bit.Next().Get(); |
- } |
- |
- // Black markbits: 11 |
- static const char* kBlackBitPattern; |
- INLINE(static bool IsBlack(MarkBit mark_bit)) { |
- return mark_bit.Get() && mark_bit.Next().Get(); |
- } |
- |
- // White markbits: 00 - this is required by the mark bit clearer. |
- static const char* kWhiteBitPattern; |
- INLINE(static bool IsWhite(MarkBit mark_bit)) { |
- DCHECK(!IsImpossible(mark_bit)); |
- return !mark_bit.Get(); |
- } |
- |
- // Grey markbits: 10 |
- static const char* kGreyBitPattern; |
- INLINE(static bool IsGrey(MarkBit mark_bit)) { |
- return mark_bit.Get() && !mark_bit.Next().Get(); |
- } |
- |
- // IsBlackOrGrey assumes that the first bit is set for black or grey |
- // objects. |
- INLINE(static bool IsBlackOrGrey(MarkBit mark_bit)) { return mark_bit.Get(); } |
- |
- INLINE(static void MarkBlack(MarkBit mark_bit)) { |
- mark_bit.Set(); |
- mark_bit.Next().Set(); |
- } |
- |
- INLINE(static void MarkWhite(MarkBit mark_bit)) { |
- mark_bit.Clear(); |
- mark_bit.Next().Clear(); |
- } |
- |
- INLINE(static void BlackToWhite(MarkBit markbit)) { |
- DCHECK(IsBlack(markbit)); |
- markbit.Clear(); |
- markbit.Next().Clear(); |
- } |
- |
- INLINE(static void GreyToWhite(MarkBit markbit)) { |
- DCHECK(IsGrey(markbit)); |
- markbit.Clear(); |
- markbit.Next().Clear(); |
- } |
- |
- INLINE(static void BlackToGrey(MarkBit markbit)) { |
- DCHECK(IsBlack(markbit)); |
- markbit.Next().Clear(); |
- } |
- |
- INLINE(static void WhiteToGrey(MarkBit markbit)) { |
- DCHECK(IsWhite(markbit)); |
- markbit.Set(); |
- } |
- |
- INLINE(static void WhiteToBlack(MarkBit markbit)) { |
- DCHECK(IsWhite(markbit)); |
- markbit.Set(); |
- markbit.Next().Set(); |
- } |
- |
- INLINE(static void GreyToBlack(MarkBit markbit)) { |
- DCHECK(IsGrey(markbit)); |
- markbit.Next().Set(); |
- } |
- |
- INLINE(static void BlackToGrey(HeapObject* obj)) { |
- BlackToGrey(MarkBitFrom(obj)); |
- } |
- |
- INLINE(static void AnyToGrey(MarkBit markbit)) { |
- markbit.Set(); |
- markbit.Next().Clear(); |
- } |
- |
- static void TransferMark(Heap* heap, Address old_start, Address new_start); |
- |
#ifdef DEBUG |
- enum ObjectColor { |
- BLACK_OBJECT, |
- WHITE_OBJECT, |
- GREY_OBJECT, |
- IMPOSSIBLE_COLOR |
- }; |
- |
- static const char* ColorName(ObjectColor color) { |
- switch (color) { |
- case BLACK_OBJECT: |
- return "black"; |
- case WHITE_OBJECT: |
- return "white"; |
- case GREY_OBJECT: |
- return "grey"; |
- case IMPOSSIBLE_COLOR: |
- return "impossible"; |
- } |
- return "error"; |
- } |
- |
- static ObjectColor Color(HeapObject* obj) { |
- return Color(Marking::MarkBitFrom(obj)); |
- } |
- |
- static ObjectColor Color(MarkBit mark_bit) { |
- if (IsBlack(mark_bit)) return BLACK_OBJECT; |
- if (IsWhite(mark_bit)) return WHITE_OBJECT; |
- if (IsGrey(mark_bit)) return GREY_OBJECT; |
- UNREACHABLE(); |
- return IMPOSSIBLE_COLOR; |
+ static Marking::ObjectColor Color(HeapObject* obj) { |
+ return Marking::Color(ObjectMarking::MarkBitFrom(obj)); |
} |
#endif |
- // Returns true if the transferred color is black. |
- INLINE(static bool TransferColor(HeapObject* from, HeapObject* to)) { |
- if (Page::FromAddress(to->address())->IsFlagSet(Page::BLACK_PAGE)) |
- return true; |
- MarkBit from_mark_bit = MarkBitFrom(from); |
- MarkBit to_mark_bit = MarkBitFrom(to); |
- DCHECK(Marking::IsWhite(to_mark_bit)); |
- if (from_mark_bit.Get()) { |
- to_mark_bit.Set(); |
- if (from_mark_bit.Next().Get()) { |
- to_mark_bit.Next().Set(); |
- return true; |
- } |
- } |
- return false; |
- } |
- |
private: |
- DISALLOW_IMPLICIT_CONSTRUCTORS(Marking); |
+ DISALLOW_IMPLICIT_CONSTRUCTORS(ObjectMarking); |
}; |
// ---------------------------------------------------------------------------- |