| 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
|
|
|