| Index: src/heap/spaces.h
 | 
| diff --git a/src/heap/spaces.h b/src/heap/spaces.h
 | 
| index 3c3157ec432241a3cb9c1b92dfa0f35db9d63c63..9a91abb537145b31a128c2a89c703244f1eca360 100644
 | 
| --- a/src/heap/spaces.h
 | 
| +++ b/src/heap/spaces.h
 | 
| @@ -268,19 +268,6 @@
 | 
|  // any heap object.
 | 
|  class MemoryChunk {
 | 
|   public:
 | 
| -  // |kCompactionDone|: Initial compaction state of a |MemoryChunk|.
 | 
| -  // |kCompactingInProgress|:  Parallel compaction is currently in progress.
 | 
| -  // |kCompactingFinalize|: Parallel compaction is done but the chunk needs to
 | 
| -  //   be finalized.
 | 
| -  // |kCompactingAborted|: Parallel compaction has been aborted, which should
 | 
| -  //   for now only happen in OOM scenarios.
 | 
| -  enum ParallelCompactingState {
 | 
| -    kCompactingDone,
 | 
| -    kCompactingInProgress,
 | 
| -    kCompactingFinalize,
 | 
| -    kCompactingAborted,
 | 
| -  };
 | 
| -
 | 
|    // Only works if the pointer is in the first kPageSize of the MemoryChunk.
 | 
|    static MemoryChunk* FromAddress(Address a) {
 | 
|      return reinterpret_cast<MemoryChunk*>(OffsetFrom(a) & ~kAlignmentMask);
 | 
| @@ -471,10 +458,6 @@
 | 
|      base::Release_Store(¶llel_sweeping_, state);
 | 
|    }
 | 
|  
 | 
| -  AtomicValue<ParallelCompactingState>& parallel_compaction_state() {
 | 
| -    return parallel_compaction_;
 | 
| -  }
 | 
| -
 | 
|    bool TryLock() { return mutex_->TryLock(); }
 | 
|  
 | 
|    base::Mutex* mutex() { return mutex_; }
 | 
| @@ -583,7 +566,6 @@
 | 
|        + kPointerSize      // AtomicValue high_water_mark_
 | 
|        + kPointerSize      // base::Mutex* mutex_
 | 
|        + kPointerSize      // base::AtomicWord parallel_sweeping_
 | 
| -      + kPointerSize      // AtomicValue parallel_compaction_
 | 
|        + 5 * kPointerSize  // AtomicNumber free-list statistics
 | 
|        + kPointerSize      // base::AtomicWord next_chunk_
 | 
|        + kPointerSize;     // base::AtomicWord prev_chunk_
 | 
| @@ -744,7 +726,6 @@
 | 
|  
 | 
|    base::Mutex* mutex_;
 | 
|    base::AtomicWord parallel_sweeping_;
 | 
| -  AtomicValue<ParallelCompactingState> parallel_compaction_;
 | 
|  
 | 
|    // PagedSpace free-list statistics.
 | 
|    AtomicNumber<intptr_t> available_in_small_free_list_;
 | 
| @@ -1004,6 +985,9 @@
 | 
|    bool CommitRawMemory(Address start, size_t length);
 | 
|    bool UncommitRawMemory(Address start, size_t length);
 | 
|    void FreeRawMemory(Address buf, size_t length);
 | 
| +
 | 
| +  void ReserveEmergencyBlock();
 | 
| +  void ReleaseEmergencyBlock();
 | 
|  
 | 
|   private:
 | 
|    // Frees the range of virtual memory, and frees the data structures used to
 | 
| @@ -1047,6 +1031,12 @@
 | 
|    List<FreeBlock> allocation_list_;
 | 
|    int current_allocation_block_index_;
 | 
|  
 | 
| +  // Emergency block guarantees that we can always allocate a page for
 | 
| +  // evacuation candidates when code space is compacted. Emergency block is
 | 
| +  // reserved immediately after GC and is released immedietely before
 | 
| +  // allocating a page for evacuation.
 | 
| +  FreeBlock emergency_block_;
 | 
| +
 | 
|    // Finds a block on the allocation list that contains at least the
 | 
|    // requested amount of memory.  If none is found, sorts and merges
 | 
|    // the existing free memory blocks, and searches again.
 | 
| @@ -1979,11 +1969,16 @@
 | 
|    // Return size of allocatable area on a page in this space.
 | 
|    inline int AreaSize() { return area_size_; }
 | 
|  
 | 
| +  void CreateEmergencyMemory();
 | 
| +  void FreeEmergencyMemory();
 | 
| +  void UseEmergencyMemory();
 | 
| +  intptr_t MaxEmergencyMemoryAllocated();
 | 
| +
 | 
| +  bool HasEmergencyMemory() { return emergency_memory_ != NULL; }
 | 
| +
 | 
|    // Merges {other} into the current space. Note that this modifies {other},
 | 
|    // e.g., removes its bump pointer area and resets statistics.
 | 
|    void MergeCompactionSpace(CompactionSpace* other);
 | 
| -
 | 
| -  void MoveOverFreeMemory(PagedSpace* other);
 | 
|  
 | 
|   protected:
 | 
|    // PagedSpaces that should be included in snapshots have different, i.e.,
 | 
| @@ -2044,6 +2039,12 @@
 | 
|    // and sweep these pages concurrently. They will stop sweeping after the
 | 
|    // end_of_unswept_pages_ page.
 | 
|    Page* end_of_unswept_pages_;
 | 
| +
 | 
| +  // Emergency memory is the memory of a full page for a given space, allocated
 | 
| +  // conservatively before evacuating a page. If compaction fails due to out
 | 
| +  // of memory error the emergency memory can be used to complete compaction.
 | 
| +  // If not used, the emergency memory is released after compaction.
 | 
| +  MemoryChunk* emergency_memory_;
 | 
|  
 | 
|    // Mutex guarding any concurrent access to the space.
 | 
|    base::Mutex space_mutex_;
 | 
| @@ -2743,32 +2744,6 @@
 | 
|  };
 | 
|  
 | 
|  
 | 
| -// A collection of |CompactionSpace|s used by a single compaction task.
 | 
| -class CompactionSpaceCollection : public Malloced {
 | 
| - public:
 | 
| -  explicit CompactionSpaceCollection(Heap* heap)
 | 
| -      : old_space_(heap, OLD_SPACE, Executability::NOT_EXECUTABLE),
 | 
| -        code_space_(heap, CODE_SPACE, Executability::EXECUTABLE) {}
 | 
| -
 | 
| -  CompactionSpace* Get(AllocationSpace space) {
 | 
| -    switch (space) {
 | 
| -      case OLD_SPACE:
 | 
| -        return &old_space_;
 | 
| -      case CODE_SPACE:
 | 
| -        return &code_space_;
 | 
| -      default:
 | 
| -        UNREACHABLE();
 | 
| -    }
 | 
| -    UNREACHABLE();
 | 
| -    return nullptr;
 | 
| -  }
 | 
| -
 | 
| - private:
 | 
| -  CompactionSpace old_space_;
 | 
| -  CompactionSpace code_space_;
 | 
| -};
 | 
| -
 | 
| -
 | 
|  // -----------------------------------------------------------------------------
 | 
|  // Old object space (includes the old space of objects and code space)
 | 
|  
 | 
| 
 |