| Index: src/serialize.h
 | 
| diff --git a/src/serialize.h b/src/serialize.h
 | 
| index 71b274b330e20f535fa2a3bd93389337fdbf2251..783153609cfd1804f42a968ec8c7001d5911c449 100644
 | 
| --- a/src/serialize.h
 | 
| +++ b/src/serialize.h
 | 
| @@ -148,11 +148,15 @@ class SerializerDeserializer: public ObjectVisitor {
 | 
|  
 | 
|    static int nop() { return kNop; }
 | 
|  
 | 
| +  // No reservation for large object space necessary.
 | 
| +  static const int kNumberOfPreallocatedSpaces = LO_SPACE;
 | 
| +  static const int kNumberOfSpaces = INVALID_SPACE;
 | 
| +
 | 
|   protected:
 | 
|    // Where the pointed-to object can be found:
 | 
|    enum Where {
 | 
|      kNewObject = 0,  // Object is next in snapshot.
 | 
| -    // 1-6                             One per space.
 | 
| +    // 1-7                             One per space.
 | 
|      kRootArray = 0x9,             // Object is found in root array.
 | 
|      kPartialSnapshotCache = 0xa,  // Object is in the cache.
 | 
|      kExternalReference = 0xb,     // Pointer to an external reference.
 | 
| @@ -161,9 +165,9 @@ class SerializerDeserializer: public ObjectVisitor {
 | 
|      kAttachedReference = 0xe,     // Object is described in an attached list.
 | 
|      kNop = 0xf,                   // Does nothing, used to pad.
 | 
|      kBackref = 0x10,              // Object is described relative to end.
 | 
| -    // 0x11-0x16                       One per space.
 | 
| +    // 0x11-0x17                       One per space.
 | 
|      kBackrefWithSkip = 0x18,  // Object is described relative to end.
 | 
| -    // 0x19-0x1e                       One per space.
 | 
| +    // 0x19-0x1f                       One per space.
 | 
|      // 0x20-0x3f                       Used by misc. tags below.
 | 
|      kPointedToMask = 0x3f
 | 
|    };
 | 
| @@ -225,11 +229,11 @@ class SerializerDeserializer: public ObjectVisitor {
 | 
|      return byte_code & 0x1f;
 | 
|    }
 | 
|  
 | 
| -  static const int kNumberOfSpaces = LO_SPACE;
 | 
|    static const int kAnyOldSpace = -1;
 | 
|  
 | 
|    // A bitmask for getting the space out of an instruction.
 | 
|    static const int kSpaceMask = 7;
 | 
| +  STATIC_ASSERT(kNumberOfSpaces <= kSpaceMask + 1);
 | 
|  };
 | 
|  
 | 
|  
 | 
| @@ -249,7 +253,7 @@ class Deserializer: public SerializerDeserializer {
 | 
|  
 | 
|    void set_reservation(int space_number, int reservation) {
 | 
|      DCHECK(space_number >= 0);
 | 
| -    DCHECK(space_number <= LAST_SPACE);
 | 
| +    DCHECK(space_number < kNumberOfSpaces);
 | 
|      reservations_[space_number] = reservation;
 | 
|    }
 | 
|  
 | 
| @@ -282,24 +286,18 @@ class Deserializer: public SerializerDeserializer {
 | 
|    void ReadChunk(
 | 
|        Object** start, Object** end, int space, Address object_address);
 | 
|    void ReadObject(int space_number, Object** write_back);
 | 
| +  Address Allocate(int space_index, int size);
 | 
|  
 | 
|    // Special handling for serialized code like hooking up internalized strings.
 | 
|    HeapObject* ProcessNewObjectFromSerializedCode(HeapObject* obj);
 | 
|    Object* ProcessBackRefInSerializedCode(Object* obj);
 | 
|  
 | 
| -  // This routine both allocates a new object, and also keeps
 | 
| -  // track of where objects have been allocated so that we can
 | 
| -  // fix back references when deserializing.
 | 
| -  Address Allocate(int space_index, int size) {
 | 
| -    Address address = high_water_[space_index];
 | 
| -    high_water_[space_index] = address + size;
 | 
| -    return address;
 | 
| -  }
 | 
| -
 | 
|    // This returns the address of an object that has been described in the
 | 
|    // snapshot as being offset bytes back in a particular space.
 | 
|    HeapObject* GetAddressFromEnd(int space) {
 | 
|      int offset = source_->GetInt();
 | 
| +    if (space == LO_SPACE) return deserialized_large_objects_[offset];
 | 
| +    DCHECK(space < kNumberOfPreallocatedSpaces);
 | 
|      offset <<= kObjectAlignmentBits;
 | 
|      return HeapObject::FromAddress(high_water_[space] - offset);
 | 
|    }
 | 
| @@ -313,13 +311,15 @@ class Deserializer: public SerializerDeserializer {
 | 
|    SnapshotByteSource* source_;
 | 
|    // This is the address of the next object that will be allocated in each
 | 
|    // space.  It is used to calculate the addresses of back-references.
 | 
| -  Address high_water_[LAST_SPACE + 1];
 | 
| +  Address high_water_[kNumberOfPreallocatedSpaces];
 | 
|  
 | 
| -  int reservations_[LAST_SPACE + 1];
 | 
| +  int reservations_[kNumberOfSpaces];
 | 
|    static const intptr_t kUninitializedReservation = -1;
 | 
|  
 | 
|    ExternalReferenceDecoder* external_reference_decoder_;
 | 
|  
 | 
| +  List<HeapObject*> deserialized_large_objects_;
 | 
| +
 | 
|    DISALLOW_COPY_AND_ASSIGN(Deserializer);
 | 
|  };
 | 
|  
 | 
| @@ -466,6 +466,7 @@ class Serializer : public SerializerDeserializer {
 | 
|    void InitializeAllocators();
 | 
|    // This will return the space for an object.
 | 
|    static int SpaceOfObject(HeapObject* object);
 | 
| +  int AllocateLargeObject(int size);
 | 
|    int Allocate(int space, int size);
 | 
|    int EncodeExternalReference(Address addr) {
 | 
|      return external_reference_encoder_->Encode(addr);
 | 
| @@ -480,7 +481,7 @@ class Serializer : public SerializerDeserializer {
 | 
|    Isolate* isolate_;
 | 
|    // Keep track of the fullness of each space in order to generate
 | 
|    // relative addresses for back references.
 | 
| -  int fullness_[LAST_SPACE + 1];
 | 
| +  int fullness_[kNumberOfSpaces];
 | 
|    SnapshotByteSink* sink_;
 | 
|    ExternalReferenceEncoder* external_reference_encoder_;
 | 
|  
 | 
| @@ -497,6 +498,8 @@ class Serializer : public SerializerDeserializer {
 | 
|  
 | 
|   private:
 | 
|    CodeAddressMap* code_address_map_;
 | 
| +  // We map serialized large objects to indexes for back-referencing.
 | 
| +  int seen_large_objects_index_;
 | 
|    DISALLOW_COPY_AND_ASSIGN(Serializer);
 | 
|  };
 | 
|  
 | 
| @@ -691,8 +694,8 @@ class SerializedCodeData {
 | 
|    static const int kPayloadLengthOffset = 2;
 | 
|    static const int kReservationsOffset = 3;
 | 
|  
 | 
| -  static const int kNumSpaces = PROPERTY_CELL_SPACE - NEW_SPACE + 1;
 | 
| -  static const int kHeaderEntries = kReservationsOffset + kNumSpaces;
 | 
| +  static const int kHeaderEntries =
 | 
| +      kReservationsOffset + SerializerDeserializer::kNumberOfSpaces;
 | 
|    static const int kHeaderSize = kHeaderEntries * kIntSize;
 | 
|  
 | 
|    // Following the header, we store, in sequential order
 | 
| 
 |