| Index: src/heap/heap.h
|
| diff --git a/src/heap/heap.h b/src/heap/heap.h
|
| index e049573139e59901ee8cc19a95675cfd5a4f9af2..db6b86d6e953ee877751ae1a24ecca3cd230ff8e 100644
|
| --- a/src/heap/heap.h
|
| +++ b/src/heap/heap.h
|
| @@ -356,20 +356,22 @@ class PromotionQueue {
|
| (emergency_stack_ == NULL || emergency_stack_->length() == 0);
|
| }
|
|
|
| - inline void insert(HeapObject* target, intptr_t size);
|
| + inline void insert(HeapObject* target, int32_t size, bool was_marked_black);
|
|
|
| - void remove(HeapObject** target, intptr_t* size) {
|
| + void remove(HeapObject** target, int32_t* size, bool* was_marked_black) {
|
| DCHECK(!is_empty());
|
| if (front_ == rear_) {
|
| Entry e = emergency_stack_->RemoveLast();
|
| *target = e.obj_;
|
| *size = e.size_;
|
| + *was_marked_black = e.was_marked_black_;
|
| return;
|
| }
|
|
|
| struct Entry* entry = reinterpret_cast<struct Entry*>(--front_);
|
| *target = entry->obj_;
|
| *size = entry->size_;
|
| + *was_marked_black = entry->was_marked_black_;
|
|
|
| // Assert no underflow.
|
| SemiSpace::AssertValidRange(reinterpret_cast<Address>(rear_),
|
| @@ -377,15 +379,17 @@ class PromotionQueue {
|
| }
|
|
|
| private:
|
| - static const int kEntrySizeInWords = 2;
|
| -
|
| struct Entry {
|
| - Entry(HeapObject* obj, intptr_t size) : obj_(obj), size_(size) {}
|
| + Entry(HeapObject* obj, int32_t size, bool was_marked_black)
|
| + : obj_(obj), size_(size), was_marked_black_(was_marked_black) {}
|
|
|
| HeapObject* obj_;
|
| - intptr_t size_;
|
| + int32_t size_ : 31;
|
| + bool was_marked_black_ : 1;
|
| };
|
|
|
| + void RelocateQueueHead();
|
| +
|
| // The front of the queue is higher in the memory page chain than the rear.
|
| struct Entry* front_;
|
| struct Entry* rear_;
|
| @@ -395,10 +399,6 @@ class PromotionQueue {
|
|
|
| Heap* heap_;
|
|
|
| - void RelocateQueueHead();
|
| -
|
| - STATIC_ASSERT(sizeof(struct Entry) == kEntrySizeInWords * kPointerSize);
|
| -
|
| DISALLOW_COPY_AND_ASSIGN(PromotionQueue);
|
| };
|
|
|
| @@ -1047,14 +1047,14 @@ class Heap {
|
| // Iterates over all the other roots in the heap.
|
| void IterateWeakRoots(ObjectVisitor* v, VisitMode mode);
|
|
|
| - // Iterate pointers to from semispace of new space found in memory interval
|
| - // from start to end within |object|.
|
| - void IteratePointersToFromSpace(HeapObject* target, int size,
|
| - ObjectSlotCallback callback);
|
| + // Iterate pointers of promoted objects.
|
| + void IteratePromotedObject(HeapObject* target, int size,
|
| + bool was_marked_black,
|
| + ObjectSlotCallback callback);
|
|
|
| - void IterateAndMarkPointersToFromSpace(HeapObject* object, Address start,
|
| - Address end, bool record_slots,
|
| - ObjectSlotCallback callback);
|
| + void IteratePromotedObjectPointers(HeapObject* object, Address start,
|
| + Address end, bool record_slots,
|
| + ObjectSlotCallback callback);
|
|
|
| // ===========================================================================
|
| // Store buffer API. =========================================================
|
| @@ -1089,6 +1089,8 @@ class Heap {
|
|
|
| bool TryFinalizeIdleIncrementalMarking(double idle_time_in_ms);
|
|
|
| + void RegisterReservationsForBlackAllocation(Reservation* reservations);
|
| +
|
| IncrementalMarking* incremental_marking() { return incremental_marking_; }
|
|
|
| // ===========================================================================
|
| @@ -2219,7 +2221,7 @@ class Heap {
|
| friend class HeapIterator;
|
| friend class IdleScavengeObserver;
|
| friend class IncrementalMarking;
|
| - friend class IteratePointersToFromSpaceVisitor;
|
| + friend class IteratePromotedObjectsVisitor;
|
| friend class MarkCompactCollector;
|
| friend class MarkCompactMarkingVisitor;
|
| friend class NewSpace;
|
|
|