Index: src/heap/mark-compact.h |
diff --git a/src/heap/mark-compact.h b/src/heap/mark-compact.h |
index de182073eaa2267c2458d38b3da709587152d824..a339aa68582118d85721f0ae7c76fe64352a6d06 100644 |
--- a/src/heap/mark-compact.h |
+++ b/src/heap/mark-compact.h |
@@ -17,6 +17,8 @@ |
namespace v8 { |
namespace internal { |
+enum class MarkCompactMode { FULL, YOUNG_GENERATION }; |
+ |
// Callback function, returns whether an object is alive. The heap size |
// of the object is returned in size. It optionally updates the offset |
// to the first live object in the page (only used for old and map objects). |
@@ -29,6 +31,7 @@ typedef void (*MarkObjectFunction)(Heap* heap, HeapObject* object); |
class CodeFlusher; |
class MarkCompactCollector; |
class MarkingVisitor; |
+template <MarkCompactMode mode> |
class RootMarkingVisitor; |
class ObjectMarking : public AllStatic { |
@@ -72,7 +75,7 @@ class MarkingDeque { |
// Ensures that the marking deque is committed and will stay committed until |
// StopUsing() is called. |
void StartUsing(); |
- void StopUsing(); |
+ void StopUsing(bool free_immediately = false); |
ulan
2016/11/15 19:57:21
nit: let's use enum instead of bool
Michael Lippautz
2016/11/16 08:59:37
Done.
|
void Clear(); |
inline bool IsFull() { return ((top_ + 1) & mask_) == bottom_; } |
@@ -416,6 +419,9 @@ class MarkCompactCollector { |
static void Initialize(); |
+ static SlotCallbackResult CheckAndMarkObject(Heap* heap, |
+ Address slot_address); |
+ |
void SetUp(); |
void TearDown(); |
@@ -465,6 +471,11 @@ class MarkCompactCollector { |
static void VerifyMarkbitsAreClean(NewSpace* space); |
void VerifyWeakEmbeddedObjectsInCode(); |
void VerifyOmittedMapChecks(); |
+ |
+ void MarkYoungGenerationForVerification(); |
+ std::vector<HeapObject*> GetObjectsInToSpace(); |
+ void VerifyYoungGenerationMarkbitsUsingForwardingPointers( |
+ const std::vector<HeapObject*>& objects); |
#endif |
INLINE(static bool ShouldSkipEvacuationSlotRecording(Object* host)) { |
@@ -564,8 +575,10 @@ class MarkCompactCollector { |
friend class MarkCompactMarkingVisitor; |
friend class MarkingVisitor; |
friend class RecordMigratedSlotVisitor; |
+ template <MarkCompactMode mode> |
friend class RootMarkingVisitor; |
friend class SharedFunctionInfoMarkingVisitor; |
+ friend class StaticYoungGenerationMarkingVisitor; |
// Mark code objects that are active on the stack to prevent them |
// from being flushed. |
@@ -575,6 +588,8 @@ class MarkCompactCollector { |
// Marking operations for objects reachable from roots. |
void MarkLiveObjects(); |
+ // Mark the young generation. |
+ void MarkLiveObjectsInYoungGeneration(); |
// Pushes a black object onto the marking stack and accounts for live bytes. |
// Note that this assumes live bytes have not yet been counted. |
@@ -593,14 +608,15 @@ class MarkCompactCollector { |
INLINE(void SetMark(HeapObject* obj, MarkBit mark_bit)); |
// Mark the heap roots and all objects reachable from them. |
- void MarkRoots(RootMarkingVisitor* visitor); |
+ void MarkRoots(RootMarkingVisitor<MarkCompactMode::FULL>* visitor); |
// Mark the string table specially. References to internalized strings from |
// the string table are weak. |
- void MarkStringTable(RootMarkingVisitor* visitor); |
+ void MarkStringTable(RootMarkingVisitor<MarkCompactMode::FULL>* visitor); |
// Mark objects reachable (transitively) from objects in the marking stack |
// or overflowed in the heap. |
+ template <MarkCompactMode mode> |
void ProcessMarkingDeque(); |
// Mark objects reachable (transitively) from objects in the marking stack |
@@ -624,11 +640,13 @@ class MarkCompactCollector { |
// stack. This function empties the marking stack, but may leave |
// overflowed objects in the heap, in which case the marking stack's |
// overflow flag will be set. |
+ template <MarkCompactMode mode> |
void EmptyMarkingDeque(); |
// Refill the marking stack with overflowed objects from the heap. This |
// function either leaves the marking stack full or clears the overflow |
// flag on the marking stack. |
+ template <MarkCompactMode mode> |
void RefillMarkingDeque(); |
// Helper methods for refilling the marking stack by discovering grey objects |