File indexing completed on 2026-03-30 08:23:25
0001
0002
0003
0004
0005 #ifndef INCLUDE_V8_SNAPSHOT_H_
0006 #define INCLUDE_V8_SNAPSHOT_H_
0007
0008 #include "v8-internal.h" // NOLINT(build/include_directory)
0009 #include "v8-isolate.h" // NOLINT(build/include_directory)
0010 #include "v8-local-handle.h" // NOLINT(build/include_directory)
0011 #include "v8config.h" // NOLINT(build/include_directory)
0012
0013 namespace v8 {
0014
0015 class Object;
0016
0017 namespace internal {
0018 class SnapshotCreatorImpl;
0019 }
0020
0021 class V8_EXPORT StartupData {
0022 public:
0023
0024
0025
0026
0027
0028 bool CanBeRehashed() const;
0029
0030
0031
0032
0033 bool IsValid() const;
0034
0035 const char* data;
0036 int raw_size;
0037 };
0038
0039
0040
0041
0042
0043
0044
0045
0046
0047 struct SerializeInternalFieldsCallback {
0048 using CallbackFunction = StartupData (*)(Local<Object> holder, int index,
0049 void* data);
0050 SerializeInternalFieldsCallback(CallbackFunction function = nullptr,
0051 void* data_arg = nullptr)
0052 : callback(function), data(data_arg) {}
0053 CallbackFunction callback;
0054 void* data;
0055 };
0056
0057
0058
0059
0060
0061 struct SerializeContextDataCallback {
0062 using CallbackFunction = StartupData (*)(Local<Context> holder, int index,
0063 void* data);
0064 SerializeContextDataCallback(CallbackFunction function = nullptr,
0065 void* data_arg = nullptr)
0066 : callback(function), data(data_arg) {}
0067 CallbackFunction callback;
0068 void* data;
0069 };
0070
0071
0072
0073
0074
0075
0076 struct SerializeAPIWrapperCallback {
0077 using CallbackFunction = StartupData (*)(Local<Object> holder,
0078 void* cpp_heap_pointer, void* data);
0079 explicit SerializeAPIWrapperCallback(CallbackFunction function = nullptr,
0080 void* data = nullptr)
0081 : callback(function), data(data) {}
0082
0083 CallbackFunction callback;
0084 void* data;
0085 };
0086
0087
0088
0089
0090
0091 struct DeserializeInternalFieldsCallback {
0092 using CallbackFunction = void (*)(Local<Object> holder, int index,
0093 StartupData payload, void* data);
0094 DeserializeInternalFieldsCallback(CallbackFunction function = nullptr,
0095 void* data_arg = nullptr)
0096 : callback(function), data(data_arg) {}
0097
0098 CallbackFunction callback;
0099 void* data;
0100 };
0101
0102
0103
0104
0105
0106 struct DeserializeContextDataCallback {
0107 using CallbackFunction = void (*)(Local<Context> holder, int index,
0108 StartupData payload, void* data);
0109 DeserializeContextDataCallback(CallbackFunction function = nullptr,
0110 void* data_arg = nullptr)
0111 : callback(function), data(data_arg) {}
0112 CallbackFunction callback;
0113 void* data;
0114 };
0115
0116 struct DeserializeAPIWrapperCallback {
0117 using CallbackFunction = void (*)(Local<Object> holder, StartupData payload,
0118 void* data);
0119 explicit DeserializeAPIWrapperCallback(CallbackFunction function = nullptr,
0120 void* data = nullptr)
0121 : callback(function), data(data) {}
0122
0123 CallbackFunction callback;
0124 void* data;
0125 };
0126
0127
0128
0129
0130
0131
0132
0133
0134
0135 class V8_EXPORT SnapshotCreator {
0136 public:
0137 enum class FunctionCodeHandling { kClear, kKeep };
0138
0139
0140
0141
0142
0143
0144
0145
0146
0147
0148
0149 V8_DEPRECATE_SOON("Use the version that passes CreateParams instead.")
0150 explicit SnapshotCreator(Isolate* isolate,
0151 const intptr_t* external_references = nullptr,
0152 const StartupData* existing_blob = nullptr,
0153 bool owns_isolate = true);
0154
0155
0156
0157
0158
0159
0160
0161
0162
0163 V8_DEPRECATE_SOON("Use the version that passes CreateParams instead.")
0164 explicit SnapshotCreator(const intptr_t* external_references = nullptr,
0165 const StartupData* existing_blob = nullptr);
0166
0167
0168
0169
0170
0171
0172
0173
0174
0175
0176
0177 explicit SnapshotCreator(const v8::Isolate::CreateParams& params);
0178
0179
0180
0181
0182
0183
0184
0185
0186
0187
0188
0189
0190 SnapshotCreator(v8::Isolate* isolate,
0191 const v8::Isolate::CreateParams& params);
0192
0193
0194
0195
0196
0197 ~SnapshotCreator();
0198
0199
0200
0201
0202 Isolate* GetIsolate();
0203
0204
0205
0206
0207
0208
0209
0210
0211
0212
0213
0214
0215
0216
0217
0218
0219
0220 void SetDefaultContext(
0221 Local<Context> context,
0222 SerializeInternalFieldsCallback internal_fields_serializer =
0223 SerializeInternalFieldsCallback(),
0224 SerializeContextDataCallback context_data_serializer =
0225 SerializeContextDataCallback(),
0226 SerializeAPIWrapperCallback api_wrapper_serializer =
0227 SerializeAPIWrapperCallback());
0228
0229
0230
0231
0232
0233
0234
0235
0236
0237
0238
0239
0240
0241
0242 size_t AddContext(Local<Context> context,
0243 SerializeInternalFieldsCallback internal_fields_serializer =
0244 SerializeInternalFieldsCallback(),
0245 SerializeContextDataCallback context_data_serializer =
0246 SerializeContextDataCallback(),
0247 SerializeAPIWrapperCallback api_wrapper_serializer =
0248 SerializeAPIWrapperCallback());
0249
0250
0251
0252
0253
0254
0255
0256 template <class T>
0257 V8_INLINE size_t AddData(Local<Context> context, Local<T> object);
0258
0259
0260
0261
0262
0263
0264
0265 template <class T>
0266 V8_INLINE size_t AddData(Local<T> object);
0267
0268
0269
0270
0271
0272
0273
0274
0275
0276 StartupData CreateBlob(FunctionCodeHandling function_code_handling);
0277
0278
0279 SnapshotCreator(const SnapshotCreator&) = delete;
0280 void operator=(const SnapshotCreator&) = delete;
0281
0282 private:
0283 size_t AddData(Local<Context> context, internal::Address object);
0284 size_t AddData(internal::Address object);
0285
0286 internal::SnapshotCreatorImpl* impl_;
0287 friend class internal::SnapshotCreatorImpl;
0288 };
0289
0290 template <class T>
0291 size_t SnapshotCreator::AddData(Local<Context> context, Local<T> object) {
0292 return AddData(context, internal::ValueHelper::ValueAsAddress(*object));
0293 }
0294
0295 template <class T>
0296 size_t SnapshotCreator::AddData(Local<T> object) {
0297 return AddData(internal::ValueHelper::ValueAsAddress(*object));
0298 }
0299
0300 }
0301
0302 #endif