| Index: src/serialize.h
|
| ===================================================================
|
| --- src/serialize.h (revision 3184)
|
| +++ src/serialize.h (working copy)
|
| @@ -396,27 +396,57 @@
|
| int position_;
|
| };
|
|
|
| +// It is very common to have a reference to the object at word 10 in space 2,
|
| +// the object at word 5 in space 2 and the object at word 28 in space 4. This
|
| +// only works for objects in the first page of a space
|
| +#define COMMON_REFERENCE_PATTERNS(f) \
|
| + f(kNumberOfSpaces, 2, 10) \
|
| + f(kNumberOfSpaces + 1, 2, 5) \
|
| + f(kNumberOfSpaces + 2, 4, 28) \
|
| + f(kNumberOfSpaces + 3, 2, 21) \
|
| + f(kNumberOfSpaces + 4, 2, 98) \
|
| + f(kNumberOfSpaces + 5, 2, 67) \
|
| + f(kNumberOfSpaces + 6, 4, 132)
|
|
|
| +#define COMMON_RAW_LENGTHS(f) \
|
| + f(1, 1) \
|
| + f(2, 2) \
|
| + f(3, 3) \
|
| + f(4, 4) \
|
| + f(5, 5) \
|
| + f(6, 6) \
|
| + f(7, 7) \
|
| + f(8, 8) \
|
| + f(9, 12) \
|
| + f(10, 16) \
|
| + f(11, 20) \
|
| + f(12, 24) \
|
| + f(13, 28) \
|
| + f(14, 32) \
|
| + f(15, 36)
|
| +
|
| // The SerDes class is a common superclass for Serializer2 and Deserializer2
|
| // which is used to store common constants and methods used by both.
|
| // TODO(erikcorry): This should inherit from ObjectVisitor.
|
| class SerDes: public GenericDeserializer {
|
| protected:
|
| enum DataType {
|
| - SMI_SERIALIZATION,
|
| - RAW_DATA_SERIALIZATION,
|
| - OBJECT_SERIALIZATION,
|
| - CODE_OBJECT_SERIALIZATION,
|
| - BACKREF_SERIALIZATION,
|
| - CODE_BACKREF_SERIALIZATION,
|
| - EXTERNAL_REFERENCE_SERIALIZATION,
|
| - EXTERNAL_BRANCH_TARGET_SERIALIZATION,
|
| - SYNCHRONIZE
|
| + RAW_DATA_SERIALIZATION = 0, // And 15 common raw lengths.
|
| + OBJECT_SERIALIZATION = 16, // One variant per space.
|
| + CODE_OBJECT_SERIALIZATION = 25, // One per space (only code spaces in use).
|
| + EXTERNAL_REFERENCE_SERIALIZATION = 34,
|
| + EXTERNAL_BRANCH_TARGET_SERIALIZATION = 35,
|
| + SYNCHRONIZE = 36,
|
| + START_NEW_PAGE_SERIALIZATION = 37,
|
| + // Free: 38-47.
|
| + BACKREF_SERIALIZATION = 48, // One per space, must be 16 aligned.
|
| + // Free: 57-63.
|
| + REFERENCE_SERIALIZATION = 64, // One per space and common references.
|
| + CODE_BACKREF_SERIALIZATION = 80, // One per space, must be 16 aligned.
|
| + // Free: 89-95.
|
| + CODE_REFERENCE_SERIALIZATION = 96 // One per space, must be 16 aligned.
|
| + // Free: 105-255.
|
| };
|
| - // Our Smi encoding is much more efficient for small positive integers than it
|
| - // is for negative numbers so we add a bias before encoding and subtract it
|
| - // after encoding so that popular small negative Smis are efficiently encoded.
|
| - static const int kSmiBias = 16;
|
| static const int kLargeData = LAST_SPACE;
|
| static const int kLargeCode = kLargeData + 1;
|
| static const int kLargeFixedArray = kLargeCode + 1;
|
| @@ -456,18 +486,12 @@
|
| UNREACHABLE();
|
| }
|
|
|
| - int CurrentAllocationAddress(int space) {
|
| - // The three different kinds of large objects have different tags in the
|
| - // snapshot so the deserializer knows which kind of object to allocate,
|
| - // but they share a fullness_ entry.
|
| - if (SpaceIsLarge(space)) space = LO_SPACE;
|
| - return fullness_[space];
|
| - }
|
| + void ReadChunk(Object** start, Object** end, int space, Address address);
|
| + HeapObject* GetAddressFromStart(int space);
|
| + inline HeapObject* GetAddressFromEnd(int space);
|
| + Address Allocate(int space_number, Space* space, int size);
|
| + void ReadObject(int space_number, Space* space, Object** write_back);
|
|
|
| - HeapObject* GetAddress(int space);
|
| - Address Allocate(int space, int size);
|
| - bool ReadObject(Object** write_back);
|
| -
|
| // Keep track of the pages in the paged spaces.
|
| // (In large object space we are keeping track of individual objects
|
| // rather than pages.) In new space we just need the address of the
|
| @@ -481,6 +505,8 @@
|
| // just numbered sequentially since relative addresses make no
|
| // sense in large object space.
|
| int fullness_[LAST_SPACE + 1];
|
| + Address high_water_[LAST_SPACE + 1];
|
| + Address last_object_address_;
|
|
|
| DISALLOW_COPY_AND_ASSIGN(Deserializer2);
|
| };
|
| @@ -550,7 +576,7 @@
|
| // for all large objects since you can't check the type of the object
|
| // once the map has been used for the serialization address.
|
| static int SpaceOfAlreadySerializedObject(HeapObject* object);
|
| - int Allocate(int space, int size);
|
| + int Allocate(int space, int size, bool* new_page_started);
|
| int CurrentAllocationAddress(int space) {
|
| if (SpaceIsLarge(space)) space = LO_SPACE;
|
| return fullness_[space];
|
|
|