| Index: src/serialize.h
|
| ===================================================================
|
| --- src/serialize.h (revision 9808)
|
| +++ src/serialize.h (working copy)
|
| @@ -187,24 +187,6 @@
|
| };
|
|
|
|
|
| -// It is very common to have a reference to objects at certain offsets in the
|
| -// heap. These offsets have been determined experimentally. We code
|
| -// references to such objects in a single byte that encodes the way the pointer
|
| -// is written (only plain pointers allowed), the space number and the offset.
|
| -// This only works for objects in the first page of a space. Don't use this for
|
| -// things in newspace since it bypasses the write barrier.
|
| -
|
| -static const int k64 = (sizeof(uintptr_t) - 4) / 4;
|
| -
|
| -#define COMMON_REFERENCE_PATTERNS(f) \
|
| - f(kNumberOfSpaces, 2, (11 - k64)) \
|
| - f((kNumberOfSpaces + 1), 2, 0) \
|
| - f((kNumberOfSpaces + 2), 2, (142 - 16 * k64)) \
|
| - f((kNumberOfSpaces + 3), 2, (74 - 15 * k64)) \
|
| - f((kNumberOfSpaces + 4), 2, 5) \
|
| - f((kNumberOfSpaces + 5), 1, 135) \
|
| - f((kNumberOfSpaces + 6), 2, (228 - 39 * k64))
|
| -
|
| #define COMMON_RAW_LENGTHS(f) \
|
| f(1, 1) \
|
| f(2, 2) \
|
| @@ -242,7 +224,7 @@
|
| // 0xd-0xf Free.
|
| kBackref = 0x10, // Object is described relative to end.
|
| // 0x11-0x18 One per space.
|
| - // 0x19-0x1f Common backref offsets.
|
| + // 0x19-0x1f Free.
|
| kFromStart = 0x20, // Object is described relative to start.
|
| // 0x21-0x28 One per space.
|
| // 0x29-0x2f Free.
|
| @@ -279,9 +261,29 @@
|
| // is referred to from external strings in the snapshot.
|
| static const int kNativesStringResource = 0x71;
|
| static const int kNewPage = 0x72;
|
| - // 0x73-0x7f Free.
|
| - // 0xb0-0xbf Free.
|
| - // 0xf0-0xff Free.
|
| + static const int kRepeat = 0x73;
|
| + static const int kConstantRepeat = 0x74;
|
| + // 0x74-0x7f Repeat last word (subtract 0x73 to get the count).
|
| + static const int kMaxRepeats = 0x7f - 0x73;
|
| + static int CodeForRepeats(int repeats) {
|
| + ASSERT(repeats >= 1 && repeats <= kMaxRepeats);
|
| + return 0x73 + repeats;
|
| + }
|
| + static int RepeatsForCode(int byte_code) {
|
| + ASSERT(byte_code >= kConstantRepeat && byte_code <= 0x7f);
|
| + return byte_code - 0x73;
|
| + }
|
| + static const int kRootArrayLowConstants = 0xb0;
|
| + // 0xb0-0xbf Things from the first 16 elements of the root array.
|
| + static const int kRootArrayHighConstants = 0xf0;
|
| + // 0xf0-0xff Things from the next 16 elements of the root array.
|
| + static const int kRootArrayNumberOfConstantEncodings = 0x20;
|
| + static const int kRootArrayNumberOfLowConstantEncodings = 0x10;
|
| + static int RootArrayConstantFromByteCode(int byte_code) {
|
| + int constant = (byte_code & 0xf) | ((byte_code & 0x40) >> 2);
|
| + ASSERT(constant >= 0 && constant < kRootArrayNumberOfConstantEncodings);
|
| + return constant;
|
| + }
|
|
|
|
|
| static const int kLargeData = LAST_SPACE;
|
| @@ -354,7 +356,13 @@
|
| UNREACHABLE();
|
| }
|
|
|
| - void ReadChunk(Object** start, Object** end, int space, Address address);
|
| + // Fills in some heap data in an area from start to end (non-inclusive). The
|
| + // space id is used for the write barrier. The object_address is the address
|
| + // of the object we are writing into, or NULL if we are not writing into an
|
| + // object, ie if we are writing a series of tagged values that are not on the
|
| + // heap.
|
| + void ReadChunk(
|
| + Object** start, Object** end, int space, Address object_address);
|
| HeapObject* GetAddressFromStart(int space);
|
| inline HeapObject* GetAddressFromEnd(int space);
|
| Address Allocate(int space_number, Space* space, int size);
|
| @@ -475,14 +483,22 @@
|
| static void TooLateToEnableNow() { too_late_to_enable_now_ = true; }
|
| static bool enabled() { return serialization_enabled_; }
|
| SerializationAddressMapper* address_mapper() { return &address_mapper_; }
|
| + void PutRoot(
|
| + int index, HeapObject* object, HowToCode how, WhereToPoint where);
|
| #ifdef DEBUG
|
| virtual void Synchronize(const char* tag);
|
| #endif
|
|
|
| protected:
|
| static const int kInvalidRootIndex = -1;
|
| - virtual int RootIndex(HeapObject* heap_object) = 0;
|
| +
|
| + int RootIndex(HeapObject* heap_object);
|
| virtual bool ShouldBeInThePartialSnapshotCache(HeapObject* o) = 0;
|
| + intptr_t root_index_wave_front() { return root_index_wave_front_; }
|
| + void set_root_index_wave_front(intptr_t value) {
|
| + ASSERT(value >= root_index_wave_front_);
|
| + root_index_wave_front_ = value;
|
| + }
|
|
|
| class ObjectSerializer : public ObjectVisitor {
|
| public:
|
| @@ -558,6 +574,7 @@
|
| static bool too_late_to_enable_now_;
|
| int large_object_total_;
|
| SerializationAddressMapper address_mapper_;
|
| + intptr_t root_index_wave_front_;
|
|
|
| friend class ObjectSerializer;
|
| friend class Deserializer;
|
| @@ -572,6 +589,7 @@
|
| SnapshotByteSink* sink)
|
| : Serializer(sink),
|
| startup_serializer_(startup_snapshot_serializer) {
|
| + set_root_index_wave_front(Heap::kStrongRootListLength);
|
| }
|
|
|
| // Serialize the objects reachable from a single object pointer.
|
| @@ -581,7 +599,6 @@
|
| WhereToPoint where_to_point);
|
|
|
| protected:
|
| - virtual int RootIndex(HeapObject* o);
|
| virtual int PartialSnapshotCacheIndex(HeapObject* o);
|
| virtual bool ShouldBeInThePartialSnapshotCache(HeapObject* o) {
|
| // Scripts should be referred only through shared function infos. We can't
|
| @@ -606,7 +623,7 @@
|
| explicit StartupSerializer(SnapshotByteSink* sink) : Serializer(sink) {
|
| // Clear the cache of objects used by the partial snapshot. After the
|
| // strong roots have been serialized we can create a partial snapshot
|
| - // which will repopulate the cache with objects neede by that partial
|
| + // which will repopulate the cache with objects needed by that partial
|
| // snapshot.
|
| Isolate::Current()->set_serialize_partial_snapshot_cache_length(0);
|
| }
|
| @@ -625,7 +642,6 @@
|
| }
|
|
|
| private:
|
| - virtual int RootIndex(HeapObject* o) { return kInvalidRootIndex; }
|
| virtual bool ShouldBeInThePartialSnapshotCache(HeapObject* o) {
|
| return false;
|
| }
|
|
|