| Index: src/snapshot/snapshot.h
|
| diff --git a/src/snapshot/snapshot.h b/src/snapshot/snapshot.h
|
| index 479265c4d2471f14746afb07710a31ed067582ff..af000c756626c87d92f6f5ca63f182d34f4bba7f 100644
|
| --- a/src/snapshot/snapshot.h
|
| +++ b/src/snapshot/snapshot.h
|
| @@ -16,6 +16,41 @@ class Isolate;
|
| class PartialSerializer;
|
| class StartupSerializer;
|
|
|
| +// Wrapper around reservation sizes and the serialization payload.
|
| +class SnapshotData : public SerializedData {
|
| + public:
|
| + // Used when producing.
|
| + explicit SnapshotData(const Serializer* serializer);
|
| +
|
| + // Used when consuming.
|
| + explicit SnapshotData(const Vector<const byte> snapshot)
|
| + : SerializedData(const_cast<byte*>(snapshot.begin()), snapshot.length()) {
|
| + CHECK(IsSane());
|
| + }
|
| +
|
| + Vector<const Reservation> Reservations() const;
|
| + Vector<const byte> Payload() const;
|
| +
|
| + Vector<const byte> RawData() const {
|
| + return Vector<const byte>(data_, size_);
|
| + }
|
| +
|
| + private:
|
| + bool IsSane();
|
| +
|
| + // The data header consists of uint32_t-sized entries:
|
| + // [0] magic number and external reference count
|
| + // [1] version hash
|
| + // [2] number of reservation size entries
|
| + // [3] payload length
|
| + // ... reservations
|
| + // ... serialized payload
|
| + static const int kCheckSumOffset = kMagicNumberOffset + kInt32Size;
|
| + static const int kNumReservationsOffset = kCheckSumOffset + kInt32Size;
|
| + static const int kPayloadLengthOffset = kNumReservationsOffset + kInt32Size;
|
| + static const int kHeaderSize = kPayloadLengthOffset + kInt32Size;
|
| +};
|
| +
|
| class Snapshot : public AllStatic {
|
| public:
|
| // Initialize the Isolate from the internal snapshot. Returns false if no
|
| @@ -23,7 +58,7 @@ class Snapshot : public AllStatic {
|
| static bool Initialize(Isolate* isolate);
|
| // Create a new context using the internal partial snapshot.
|
| static MaybeHandle<Context> NewContextFromSnapshot(
|
| - Isolate* isolate, Handle<JSGlobalProxy> global_proxy);
|
| + Isolate* isolate, Handle<JSGlobalProxy> global_proxy, int context_index);
|
|
|
| static bool HaveASnapshotToStartFrom(Isolate* isolate);
|
|
|
| @@ -36,32 +71,44 @@ class Snapshot : public AllStatic {
|
| static const v8::StartupData* DefaultSnapshotBlob();
|
|
|
| static v8::StartupData CreateSnapshotBlob(
|
| - const StartupSerializer* startup_serializer,
|
| - const PartialSerializer* context_serializer);
|
| + const SnapshotData* startup_snapshot,
|
| + const List<SnapshotData*>* context_snapshots);
|
|
|
| #ifdef DEBUG
|
| static bool SnapshotIsValid(v8::StartupData* snapshot_blob);
|
| #endif // DEBUG
|
|
|
| private:
|
| + static int ExtractNumContexts(const v8::StartupData* data);
|
| static Vector<const byte> ExtractStartupData(const v8::StartupData* data);
|
| - static Vector<const byte> ExtractContextData(const v8::StartupData* data);
|
| + static Vector<const byte> ExtractContextData(const v8::StartupData* data,
|
| + int index);
|
|
|
| // Snapshot blob layout:
|
| // [0 - 5] pre-calculated first page sizes for paged spaces
|
| - // [6] serialized start up data length
|
| - // ... serialized start up data
|
| - // ... serialized context data
|
| + // [6] number of contexts N
|
| + // [7] offset to context 0
|
| + // [8] offset to context 1
|
| + // ...
|
| + // ... offset to context N - 1
|
| + // ... startup snapshot data
|
| + // ... context 0 snapshot data
|
| + // ... context 1 snapshot data
|
|
|
| static const int kNumPagedSpaces = LAST_PAGED_SPACE - FIRST_PAGED_SPACE + 1;
|
|
|
| static const int kFirstPageSizesOffset = 0;
|
| - static const int kStartupLengthOffset =
|
| + static const int kNumberOfContextsOffset =
|
| kFirstPageSizesOffset + kNumPagedSpaces * kInt32Size;
|
| - static const int kStartupDataOffset = kStartupLengthOffset + kInt32Size;
|
| + static const int kFirstContextOffsetOffset =
|
| + kNumberOfContextsOffset + kInt32Size;
|
| +
|
| + static int StartupSnapshotOffset(int num_contexts) {
|
| + return kFirstContextOffsetOffset + num_contexts * kInt32Size;
|
| + }
|
|
|
| - static int ContextOffset(int startup_length) {
|
| - return kStartupDataOffset + startup_length;
|
| + static int ContextSnapshotOffsetOffset(int index) {
|
| + return kFirstContextOffsetOffset + index * kInt32Size;
|
| }
|
|
|
| DISALLOW_IMPLICIT_CONSTRUCTORS(Snapshot);
|
| @@ -71,41 +118,6 @@ class Snapshot : public AllStatic {
|
| void SetSnapshotFromFile(StartupData* snapshot_blob);
|
| #endif
|
|
|
| -// Wrapper around reservation sizes and the serialization payload.
|
| -class SnapshotData : public SerializedData {
|
| - public:
|
| - // Used when producing.
|
| - explicit SnapshotData(const Serializer* serializer);
|
| -
|
| - // Used when consuming.
|
| - explicit SnapshotData(const Vector<const byte> snapshot)
|
| - : SerializedData(const_cast<byte*>(snapshot.begin()), snapshot.length()) {
|
| - CHECK(IsSane());
|
| - }
|
| -
|
| - Vector<const Reservation> Reservations() const;
|
| - Vector<const byte> Payload() const;
|
| -
|
| - Vector<const byte> RawData() const {
|
| - return Vector<const byte>(data_, size_);
|
| - }
|
| -
|
| - private:
|
| - bool IsSane();
|
| -
|
| - // The data header consists of uint32_t-sized entries:
|
| - // [0] magic number and external reference count
|
| - // [1] version hash
|
| - // [2] number of reservation size entries
|
| - // [3] payload length
|
| - // ... reservations
|
| - // ... serialized payload
|
| - static const int kCheckSumOffset = kMagicNumberOffset + kInt32Size;
|
| - static const int kNumReservationsOffset = kCheckSumOffset + kInt32Size;
|
| - static const int kPayloadLengthOffset = kNumReservationsOffset + kInt32Size;
|
| - static const int kHeaderSize = kPayloadLengthOffset + kInt32Size;
|
| -};
|
| -
|
| } // namespace internal
|
| } // namespace v8
|
|
|
|
|