mirrored from https://chromium.googlesource.com/v8/v8.git
-
Notifications
You must be signed in to change notification settings - Fork 4k
/
Copy pathv8-snapshot.h
302 lines (267 loc) · 11.6 KB
/
v8-snapshot.h
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
// Copyright 2021 the V8 project authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef INCLUDE_V8_SNAPSHOT_H_
#define INCLUDE_V8_SNAPSHOT_H_
#include "v8-internal.h" // NOLINT(build/include_directory)
#include "v8-isolate.h" // NOLINT(build/include_directory)
#include "v8-local-handle.h" // NOLINT(build/include_directory)
#include "v8config.h" // NOLINT(build/include_directory)
namespace v8 {
class Object;
namespace internal {
class SnapshotCreatorImpl;
} // namespace internal
class V8_EXPORT StartupData {
public:
/**
* Whether the data created can be rehashed and and the hash seed can be
* recomputed when deserialized.
* Only valid for StartupData returned by SnapshotCreator::CreateBlob().
*/
bool CanBeRehashed() const;
/**
* Allows embedders to verify whether the data is valid for the current
* V8 instance.
*/
bool IsValid() const;
const char* data;
int raw_size;
};
/**
* Callback and supporting data used in SnapshotCreator to implement embedder
* logic to serialize internal fields of v8::Objects.
* Internal fields that directly reference V8 objects are serialized without
* calling this callback. Internal fields that contain aligned pointers are
* serialized by this callback if it returns non-zero result. Otherwise it is
* serialized verbatim.
*/
struct SerializeInternalFieldsCallback {
using CallbackFunction = StartupData (*)(Local<Object> holder, int index,
void* data);
SerializeInternalFieldsCallback(CallbackFunction function = nullptr,
void* data_arg = nullptr)
: callback(function), data(data_arg) {}
CallbackFunction callback;
void* data;
};
/**
* Similar to SerializeInternalFieldsCallback, but works with the embedder data
* in a v8::Context.
*/
struct SerializeContextDataCallback {
using CallbackFunction = StartupData (*)(Local<Context> holder, int index,
void* data);
SerializeContextDataCallback(CallbackFunction function = nullptr,
void* data_arg = nullptr)
: callback(function), data(data_arg) {}
CallbackFunction callback;
void* data;
};
/**
* Similar to `SerializeInternalFieldsCallback`, but is used exclusively to
* serialize API wrappers. The pointers for API wrappers always point into the
* CppHeap.
*/
struct SerializeAPIWrapperCallback {
using CallbackFunction = StartupData (*)(Local<Object> holder,
void* cpp_heap_pointer, void* data);
explicit SerializeAPIWrapperCallback(CallbackFunction function = nullptr,
void* data = nullptr)
: callback(function), data(data) {}
CallbackFunction callback;
void* data;
};
/**
* Callback and supporting data used to implement embedder logic to deserialize
* internal fields of v8::Objects.
*/
struct DeserializeInternalFieldsCallback {
using CallbackFunction = void (*)(Local<Object> holder, int index,
StartupData payload, void* data);
DeserializeInternalFieldsCallback(CallbackFunction function = nullptr,
void* data_arg = nullptr)
: callback(function), data(data_arg) {}
CallbackFunction callback;
void* data;
};
/**
* Similar to DeserializeInternalFieldsCallback, but works with the embedder
* data in a v8::Context.
*/
struct DeserializeContextDataCallback {
using CallbackFunction = void (*)(Local<Context> holder, int index,
StartupData payload, void* data);
DeserializeContextDataCallback(CallbackFunction function = nullptr,
void* data_arg = nullptr)
: callback(function), data(data_arg) {}
CallbackFunction callback;
void* data;
};
struct DeserializeAPIWrapperCallback {
using CallbackFunction = void (*)(Local<Object> holder, StartupData payload,
void* data);
explicit DeserializeAPIWrapperCallback(CallbackFunction function = nullptr,
void* data = nullptr)
: callback(function), data(data) {}
CallbackFunction callback;
void* data;
};
/**
* Helper class to create a snapshot data blob.
*
* The Isolate used by a SnapshotCreator is owned by it, and will be entered
* and exited by the constructor and destructor, respectively; The destructor
* will also destroy the Isolate. Experimental language features, including
* those available by default, are not available while creating a snapshot.
*/
class V8_EXPORT SnapshotCreator {
public:
enum class FunctionCodeHandling { kClear, kKeep };
/**
* Initialize and enter an isolate, and set it up for serialization.
* The isolate is either created from scratch or from an existing snapshot.
* The caller keeps ownership of the argument snapshot.
* \param existing_blob existing snapshot from which to create this one.
* \param external_references a null-terminated array of external references
* that must be equivalent to CreateParams::external_references.
* \param owns_isolate whether this SnapshotCreator should call
* v8::Isolate::Dispose() during its destructor.
*/
V8_DEPRECATE_SOON("Use the version that passes CreateParams instead.")
explicit SnapshotCreator(Isolate* isolate,
const intptr_t* external_references = nullptr,
const StartupData* existing_blob = nullptr,
bool owns_isolate = true);
/**
* Create and enter an isolate, and set it up for serialization.
* The isolate is either created from scratch or from an existing snapshot.
* The caller keeps ownership of the argument snapshot.
* \param existing_blob existing snapshot from which to create this one.
* \param external_references a null-terminated array of external references
* that must be equivalent to CreateParams::external_references.
*/
V8_DEPRECATE_SOON("Use the version that passes CreateParams instead.")
explicit SnapshotCreator(const intptr_t* external_references = nullptr,
const StartupData* existing_blob = nullptr);
/**
* Creates an Isolate for serialization and enters it. The creator fully owns
* the Isolate and will invoke `v8::Isolate::Dispose()` during destruction.
*
* \param params The parameters to initialize the Isolate for. Details:
* - `params.external_references` are expected to be a
* null-terminated array of external references.
* - `params.existing_blob` is an optional snapshot blob from
* which can be used to initialize the new blob.
*/
explicit SnapshotCreator(const v8::Isolate::CreateParams& params);
/**
* Initializes an Isolate for serialization and enters it. The creator does
* not own the Isolate but merely initialize it properly.
*
* \param isolate The isolate that was allocated by `Isolate::Allocate()~.
* \param params The parameters to initialize the Isolate for. Details:
* - `params.external_references` are expected to be a
* null-terminated array of external references.
* - `params.existing_blob` is an optional snapshot blob from
* which can be used to initialize the new blob.
*/
SnapshotCreator(v8::Isolate* isolate,
const v8::Isolate::CreateParams& params);
/**
* Destroy the snapshot creator, and exit and dispose of the Isolate
* associated with it.
*/
~SnapshotCreator();
/**
* \returns the isolate prepared by the snapshot creator.
*/
Isolate* GetIsolate();
/**
* Set the default context to be included in the snapshot blob.
* The snapshot will not contain the global proxy, and we expect one or a
* global object template to create one, to be provided upon deserialization.
*
* \param internal_fields_serializer An optional callback used to serialize
* internal pointer fields set by
* v8::Object::SetAlignedPointerInInternalField().
*
* \param context_data_serializer An optional callback used to serialize
* context embedder data set by
* v8::Context::SetAlignedPointerInEmbedderData().
*
* \param api_wrapper_serializer An optional callback used to serialize API
* wrapper references set via `v8::Object::Wrap()`.
*/
void SetDefaultContext(
Local<Context> context,
SerializeInternalFieldsCallback internal_fields_serializer =
SerializeInternalFieldsCallback(),
SerializeContextDataCallback context_data_serializer =
SerializeContextDataCallback(),
SerializeAPIWrapperCallback api_wrapper_serializer =
SerializeAPIWrapperCallback());
/**
* Add additional context to be included in the snapshot blob.
* The snapshot will include the global proxy.
*
* \param internal_fields_serializer Similar to internal_fields_serializer
* in SetDefaultContext() but only applies to the context being added.
*
* \param context_data_serializer Similar to context_data_serializer
* in SetDefaultContext() but only applies to the context being added.
*
* \param api_wrapper_serializer Similar to api_wrapper_serializer
* in SetDefaultContext() but only applies to the context being added.
*/
size_t AddContext(Local<Context> context,
SerializeInternalFieldsCallback internal_fields_serializer =
SerializeInternalFieldsCallback(),
SerializeContextDataCallback context_data_serializer =
SerializeContextDataCallback(),
SerializeAPIWrapperCallback api_wrapper_serializer =
SerializeAPIWrapperCallback());
/**
* Attach arbitrary V8::Data to the context snapshot, which can be retrieved
* via Context::GetDataFromSnapshotOnce after deserialization. This data does
* not survive when a new snapshot is created from an existing snapshot.
* \returns the index for retrieval.
*/
template <class T>
V8_INLINE size_t AddData(Local<Context> context, Local<T> object);
/**
* Attach arbitrary V8::Data to the isolate snapshot, which can be retrieved
* via Isolate::GetDataFromSnapshotOnce after deserialization. This data does
* not survive when a new snapshot is created from an existing snapshot.
* \returns the index for retrieval.
*/
template <class T>
V8_INLINE size_t AddData(Local<T> object);
/**
* Created a snapshot data blob.
* This must not be called from within a handle scope.
* \param function_code_handling whether to include compiled function code
* in the snapshot.
* \returns { nullptr, 0 } on failure, and a startup snapshot on success. The
* caller acquires ownership of the data array in the return value.
*/
StartupData CreateBlob(FunctionCodeHandling function_code_handling);
// Disallow copying and assigning.
SnapshotCreator(const SnapshotCreator&) = delete;
void operator=(const SnapshotCreator&) = delete;
private:
size_t AddData(Local<Context> context, internal::Address object);
size_t AddData(internal::Address object);
internal::SnapshotCreatorImpl* impl_;
friend class internal::SnapshotCreatorImpl;
};
template <class T>
size_t SnapshotCreator::AddData(Local<Context> context, Local<T> object) {
return AddData(context, internal::ValueHelper::ValueAsAddress(*object));
}
template <class T>
size_t SnapshotCreator::AddData(Local<T> object) {
return AddData(internal::ValueHelper::ValueAsAddress(*object));
}
} // namespace v8
#endif // INCLUDE_V8_SNAPSHOT_H_