Coverage Report

Created: 2025-10-31 09:06

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