| Index: src/heap/mark-compact.h | 
| diff --git a/src/heap/mark-compact.h b/src/heap/mark-compact.h | 
| index a5a5f02ee7cb4a0db6306b963d7fb36e46bd1896..b01982fb467832b9eaa5b83203ae2b2bd4b23298 100644 | 
| --- a/src/heap/mark-compact.h | 
| +++ b/src/heap/mark-compact.h | 
| @@ -182,18 +182,15 @@ class Marking { | 
| class MarkingDeque { | 
| public: | 
| MarkingDeque() | 
| -      : array_(NULL), top_(0), bottom_(0), mask_(0), overflowed_(false) {} | 
| - | 
| -  void Initialize(Address low, Address high) { | 
| -    HeapObject** obj_low = reinterpret_cast<HeapObject**>(low); | 
| -    HeapObject** obj_high = reinterpret_cast<HeapObject**>(high); | 
| -    array_ = obj_low; | 
| -    mask_ = base::bits::RoundDownToPowerOfTwo32( | 
| -                static_cast<uint32_t>(obj_high - obj_low)) - | 
| -            1; | 
| -    top_ = bottom_ = 0; | 
| -    overflowed_ = false; | 
| -  } | 
| +      : array_(NULL), | 
| +        top_(0), | 
| +        bottom_(0), | 
| +        mask_(0), | 
| +        overflowed_(false), | 
| +        in_use_(false) {} | 
| + | 
| +  void Initialize(Address low, Address high); | 
| +  void Uninitialize(bool aborting = false); | 
|  | 
| inline bool IsFull() { return ((top_ + 1) & mask_) == bottom_; } | 
|  | 
| @@ -201,6 +198,8 @@ class MarkingDeque { | 
|  | 
| bool overflowed() const { return overflowed_; } | 
|  | 
| +  bool in_use() const { return in_use_; } | 
| + | 
| void ClearOverflowed() { overflowed_ = false; } | 
|  | 
| void SetOverflowed() { overflowed_ = true; } | 
| @@ -242,7 +241,6 @@ class MarkingDeque { | 
|  | 
| INLINE(void UnshiftGrey(HeapObject* object)) { | 
| DCHECK(object->IsHeapObject()); | 
| -    DCHECK(Marking::IsGrey(Marking::MarkBitFrom(object))); | 
| if (IsFull()) { | 
| SetOverflowed(); | 
| } else { | 
| @@ -279,6 +277,7 @@ class MarkingDeque { | 
| int bottom_; | 
| int mask_; | 
| bool overflowed_; | 
| +  bool in_use_; | 
|  | 
| DISALLOW_COPY_AND_ASSIGN(MarkingDeque); | 
| }; | 
| @@ -720,11 +719,20 @@ class MarkCompactCollector { | 
|  | 
| MarkingDeque* marking_deque() { return &marking_deque_; } | 
|  | 
| -  void EnsureMarkingDequeIsCommittedAndInitialize(size_t max_size = 4 * MB); | 
| +  static const size_t kMaxMarkingDequeSize = 4 * MB; | 
| +  static const size_t kMinMarkingDequeSize = 256 * KB; | 
|  | 
| -  void InitializeMarkingDeque(); | 
| +  void EnsureMarkingDequeIsCommittedAndInitialize(size_t max_size) { | 
| +    if (!marking_deque_.in_use()) { | 
| +      EnsureMarkingDequeIsCommitted(max_size); | 
| +      InitializeMarkingDeque(); | 
| +    } | 
| +  } | 
|  | 
| -  void UncommitMarkingDeque(); | 
| +  void EnsureMarkingDequeIsCommitted(size_t max_size); | 
| +  void EnsureMarkingDequeIsReserved(); | 
| + | 
| +  void InitializeMarkingDeque(); | 
|  | 
| // The following four methods can just be called after marking, when the | 
| // whole transitive closure is known. They must be called before sweeping | 
| @@ -954,7 +962,7 @@ class MarkCompactCollector { | 
|  | 
| Heap* heap_; | 
| base::VirtualMemory* marking_deque_memory_; | 
| -  bool marking_deque_memory_committed_; | 
| +  size_t marking_deque_memory_committed_; | 
| MarkingDeque marking_deque_; | 
| CodeFlusher* code_flusher_; | 
| bool have_code_to_deoptimize_; | 
|  |