Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(132)

Side by Side Diff: src/snapshot/snapshot.h

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

Powered by Google App Engine
This is Rietveld 408576698