| Index: src/spaces.h
 | 
| ===================================================================
 | 
| --- src/spaces.h	(revision 12562)
 | 
| +++ src/spaces.h	(working copy)
 | 
| @@ -393,6 +393,15 @@
 | 
|      WAS_SWEPT_PRECISELY,
 | 
|      WAS_SWEPT_CONSERVATIVELY,
 | 
|  
 | 
| +    // Used for large objects only.  Indicates that the object has been
 | 
| +    // partially scanned by the incremental mark-sweep GC.  Objects that have
 | 
| +    // been partially scanned are marked black so that the write barrier
 | 
| +    // triggers for them, and they are counted as live bytes.  If the mutator
 | 
| +    // writes to them they may be turned grey and subtracted from the live byte
 | 
| +    // list.  They move back to the marking deque either by an iteration over
 | 
| +    // the large object space or in the write barrier.
 | 
| +    IS_PARTIALLY_SCANNED,
 | 
| +
 | 
|      // Last flag, keep at bottom.
 | 
|      NUM_MEMORY_CHUNK_FLAGS
 | 
|    };
 | 
| @@ -413,7 +422,26 @@
 | 
|        (1 << IN_FROM_SPACE) |
 | 
|        (1 << IN_TO_SPACE);
 | 
|  
 | 
| +  static const int kIsPartiallyScannedMask = 1 << IS_PARTIALLY_SCANNED;
 | 
|  
 | 
| +  void SetPartiallyScannedProgress(int progress) {
 | 
| +    SetFlag(IS_PARTIALLY_SCANNED);
 | 
| +    partially_scanned_progress_ = progress;
 | 
| +  }
 | 
| +
 | 
| +  bool IsPartiallyScanned() {
 | 
| +    return IsFlagSet(IS_PARTIALLY_SCANNED);
 | 
| +  }
 | 
| +
 | 
| +  void SetCompletelyScanned() {
 | 
| +    ClearFlag(IS_PARTIALLY_SCANNED);
 | 
| +  }
 | 
| +
 | 
| +  int PartiallyScannedProgress() {
 | 
| +    ASSERT(IsPartiallyScanned());
 | 
| +    return partially_scanned_progress_;
 | 
| +  }
 | 
| +
 | 
|    void SetFlag(int flag) {
 | 
|      flags_ |= static_cast<uintptr_t>(1) << flag;
 | 
|    }
 | 
| @@ -488,9 +516,11 @@
 | 
|  
 | 
|    static const size_t kSlotsBufferOffset = kLiveBytesOffset + kIntSize;
 | 
|  
 | 
| -  static const size_t kHeaderSize =
 | 
| -      kSlotsBufferOffset + kPointerSize + kPointerSize;
 | 
| +  static const size_t kPartiallyScannedProgress =
 | 
| +        kSlotsBufferOffset + kPointerSize + kPointerSize;
 | 
|  
 | 
| +  static const size_t kHeaderSize = kPartiallyScannedProgress + kIntSize;
 | 
| +
 | 
|    static const int kBodyOffset =
 | 
|      CODE_POINTER_ALIGN(MAP_POINTER_ALIGN(kHeaderSize + Bitmap::kSize));
 | 
|  
 | 
| @@ -625,6 +655,7 @@
 | 
|    int live_byte_count_;
 | 
|    SlotsBuffer* slots_buffer_;
 | 
|    SkipList* skip_list_;
 | 
| +  int partially_scanned_progress_;
 | 
|  
 | 
|    static MemoryChunk* Initialize(Heap* heap,
 | 
|                                   Address base,
 | 
| 
 |