Chromium Code Reviews| Index: src/serialize.h |
| =================================================================== |
| --- src/serialize.h (revision 9713) |
| +++ 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,25 @@ |
| // 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 int RootArrayConstantFromByteCode(int byte_code) { |
| + return (byte_code & 0xf) | ((byte_code & 0x40) >> 2); |
| + } |
| static const int kLargeData = LAST_SPACE; |
| @@ -475,14 +473,19 @@ |
| 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; |
| + int root_index_wave_front() { return root_index_wave_front_; } |
| + void set_root_index_wave_front(int value) { root_index_wave_front_ = value; } |
|
Lasse Reichstein
2011/10/20 10:06:54
Assert that the wave-front moves forward?
Erik Corry
2011/10/20 11:01:42
Done.
|
| class ObjectSerializer : public ObjectVisitor { |
| public: |
| @@ -558,6 +561,7 @@ |
| static bool too_late_to_enable_now_; |
| int large_object_total_; |
| SerializationAddressMapper address_mapper_; |
| + int root_index_wave_front_; |
| friend class ObjectSerializer; |
| friend class Deserializer; |
| @@ -572,6 +576,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 +586,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 +610,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 +629,6 @@ |
| } |
| private: |
| - virtual int RootIndex(HeapObject* o) { return kInvalidRootIndex; } |
| virtual bool ShouldBeInThePartialSnapshotCache(HeapObject* o) { |
| return false; |
| } |