blob: e332967eeebd37403688e8fd69444ad2ff57fcd2 [file] [log] [blame]
Ben Murdoch4a90d5f2016-03-22 12:00:34 +00001// Copyright 2006-2008 the V8 project authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#ifndef V8_SNAPSHOT_SNAPSHOT_H_
6#define V8_SNAPSHOT_SNAPSHOT_H_
7
Ben Murdochda12d292016-06-02 14:46:10 +01008#include "src/snapshot/partial-serializer.h"
9#include "src/snapshot/startup-serializer.h"
Ben Murdoch4a90d5f2016-03-22 12:00:34 +000010
11namespace v8 {
12namespace internal {
13
14// Forward declarations.
15class Isolate;
16class PartialSerializer;
17class StartupSerializer;
18
Ben Murdochda12d292016-06-02 14:46:10 +010019// Wrapper around reservation sizes and the serialization payload.
20class SnapshotData : public SerializedData {
21 public:
22 // Used when producing.
Ben Murdoch61f157c2016-09-16 13:49:30 +010023 explicit SnapshotData(const Serializer* serializer);
Ben Murdochda12d292016-06-02 14:46:10 +010024
25 // Used when consuming.
26 explicit SnapshotData(const Vector<const byte> snapshot)
27 : SerializedData(const_cast<byte*>(snapshot.begin()), snapshot.length()) {
28 CHECK(IsSane());
29 }
30
31 Vector<const Reservation> Reservations() const;
32 Vector<const byte> Payload() const;
33
34 Vector<const byte> RawData() const {
35 return Vector<const byte>(data_, size_);
36 }
37
38 private:
39 bool IsSane();
40
41 // The data header consists of uint32_t-sized entries:
42 // [0] magic number and external reference count
43 // [1] version hash
44 // [2] number of reservation size entries
45 // [3] payload length
46 // ... reservations
47 // ... serialized payload
48 static const int kCheckSumOffset = kMagicNumberOffset + kInt32Size;
49 static const int kNumReservationsOffset = kCheckSumOffset + kInt32Size;
50 static const int kPayloadLengthOffset = kNumReservationsOffset + kInt32Size;
51 static const int kHeaderSize = kPayloadLengthOffset + kInt32Size;
52};
53
Ben Murdoch61f157c2016-09-16 13:49:30 +010054class Snapshot : public AllStatic {
55 public:
56 // Initialize the Isolate from the internal snapshot. Returns false if no
57 // snapshot could be found.
58 static bool Initialize(Isolate* isolate);
59 // Create a new context using the internal partial snapshot.
60 static MaybeHandle<Context> NewContextFromSnapshot(
61 Isolate* isolate, Handle<JSGlobalProxy> global_proxy,
62 size_t context_index);
63
64 static bool HaveASnapshotToStartFrom(Isolate* isolate);
65
66 static bool EmbedsScript(Isolate* isolate);
67
68 static uint32_t SizeOfFirstPage(Isolate* isolate, AllocationSpace space);
69
70
71 // To be implemented by the snapshot source.
72 static const v8::StartupData* DefaultSnapshotBlob();
73
74 static v8::StartupData CreateSnapshotBlob(
75 const SnapshotData* startup_snapshot,
76 const List<SnapshotData*>* context_snapshots);
77
78#ifdef DEBUG
79 static bool SnapshotIsValid(v8::StartupData* snapshot_blob);
80#endif // DEBUG
81
82 private:
83 static int ExtractNumContexts(const v8::StartupData* data);
84 static Vector<const byte> ExtractStartupData(const v8::StartupData* data);
85 static Vector<const byte> ExtractContextData(const v8::StartupData* data,
86 int index);
87
88 // Snapshot blob layout:
89 // [0 - 5] pre-calculated first page sizes for paged spaces
90 // [6] number of contexts N
91 // [7] offset to context 0
92 // [8] offset to context 1
93 // ...
94 // ... offset to context N - 1
95 // ... startup snapshot data
96 // ... context 0 snapshot data
97 // ... context 1 snapshot data
98
99 static const int kNumPagedSpaces = LAST_PAGED_SPACE - FIRST_PAGED_SPACE + 1;
100
101 static const int kFirstPageSizesOffset = 0;
102 static const int kNumberOfContextsOffset =
103 kFirstPageSizesOffset + kNumPagedSpaces * kInt32Size;
104 static const int kFirstContextOffsetOffset =
105 kNumberOfContextsOffset + kInt32Size;
106
107 static int StartupSnapshotOffset(int num_contexts) {
108 return kFirstContextOffsetOffset + num_contexts * kInt32Size;
109 }
110
111 static int ContextSnapshotOffsetOffset(int index) {
112 return kFirstContextOffsetOffset + index * kInt32Size;
113 }
114
115 DISALLOW_IMPLICIT_CONSTRUCTORS(Snapshot);
116};
117
118#ifdef V8_USE_EXTERNAL_STARTUP_DATA
119void SetSnapshotFromFile(StartupData* snapshot_blob);
120#endif
121
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000122} // namespace internal
123} // namespace v8
124
125#endif // V8_SNAPSHOT_SNAPSHOT_H_