#ifndef V8_SNAPSHOT_SNAPSHOT_H_
#define V8_SNAPSHOT_SNAPSHOT_H_
#include <vector>
#include "include/v8-array-buffer.h"
#include "include/v8-snapshot.h"
#include "src/common/assert-scope.h"
#include "src/common/globals.h"
#include "src/snapshot/serializer-deserializer.h"
namespace v8 {
namespace internal {
class Context;
class Isolate;
class JSGlobalProxy;
class SafepointScope;
class SnapshotData;
class Snapshot : public AllStatic {
public:
enum SerializerFlag {
kAllowUnknownExternalReferencesForTesting = 1 << 0,
kAllowActiveIsolateForTesting = 1 << 1,
kReconstructReadOnlyAndSharedObjectCachesForTesting = 1 << 2,
};
using SerializerFlags = base::Flags<SerializerFlag>;
V8_EXPORT_PRIVATE static constexpr SerializerFlags kDefaultSerializerFlags =
{};
V8_EXPORT_PRIVATE static void ClearReconstructableDataForSerialization(
Isolate* isolate, bool clear_recompilable_data);
static v8::StartupData Create(
Isolate* isolate, std::vector<Tagged<Context>>* contexts,
const std::vector<SerializeEmbedderFieldsCallback>&
embedder_fields_serializers,
const SafepointScope& safepoint_scope,
const DisallowGarbageCollection& no_gc,
SerializerFlags flags = kDefaultSerializerFlags);
static bool Initialize(Isolate* isolate);
static MaybeDirectHandle<Context> NewContextFromSnapshot(
Isolate* isolate, DirectHandle<JSGlobalProxy> global_proxy,
size_t context_index,
DeserializeEmbedderFieldsCallback embedder_fields_deserializer);
V8_EXPORT_PRIVATE static void SerializeDeserializeAndVerifyForTesting(
Isolate* isolate, DirectHandle<Context> default_context);
static bool HasContextSnapshot(Isolate* isolate, size_t index);
static bool EmbedsScript(Isolate* isolate);
V8_EXPORT_PRIVATE static uint32_t GetExpectedChecksum(
const v8::StartupData* data);
V8_EXPORT_PRIVATE static uint32_t CalculateChecksum(
const v8::StartupData* data);
V8_EXPORT_PRIVATE static bool VerifyChecksum(const v8::StartupData* data);
static bool ExtractRehashability(const v8::StartupData* data);
V8_EXPORT_PRIVATE static uint32_t ExtractReadOnlySnapshotChecksum(
const v8::StartupData* data);
static bool VersionIsValid(const v8::StartupData* data);
static const v8::StartupData* DefaultSnapshotBlob();
static bool ShouldVerifyChecksum(const v8::StartupData* data);
#ifdef DEBUG
static bool SnapshotIsValid(const v8::StartupData* snapshot_blob);
#endif
};
V8_EXPORT_PRIVATE v8::StartupData CreateSnapshotDataBlobInternal(
v8::SnapshotCreator::FunctionCodeHandling function_code_handling,
const char* embedded_source = nullptr,
Snapshot::SerializerFlags serializer_flags =
Snapshot::kDefaultSerializerFlags);
V8_EXPORT_PRIVATE v8::StartupData CreateSnapshotDataBlobInternal(
v8::SnapshotCreator::FunctionCodeHandling function_code_handling,
const char* embedded_source, v8::SnapshotCreator& snapshot_creator,
Snapshot::SerializerFlags serializer_flags =
Snapshot::kDefaultSerializerFlags);
V8_EXPORT_PRIVATE v8::StartupData
CreateSnapshotDataBlobInternalForInspectorTest(
v8::SnapshotCreator::FunctionCodeHandling function_code_handling,
const char* embedded_source);
V8_EXPORT_PRIVATE v8::StartupData WarmUpSnapshotDataBlobInternal(
v8::StartupData cold_snapshot_blob, const char* warmup_source);
#ifdef V8_USE_EXTERNAL_STARTUP_DATA
void SetSnapshotFromFile(StartupData* snapshot_blob);
#endif
class SnapshotCreatorImpl final {
public:
SnapshotCreatorImpl(Isolate* isolate, const intptr_t* api_external_references,
const StartupData* existing_blob, bool owns_isolate);
explicit SnapshotCreatorImpl(const v8::Isolate::CreateParams& params);
SnapshotCreatorImpl(Isolate* isolate,
const v8::Isolate::CreateParams& params);
~SnapshotCreatorImpl();
Isolate* isolate() const { return isolate_; }
void SetDefaultContext(DirectHandle<NativeContext> context,
SerializeEmbedderFieldsCallback callback);
size_t AddContext(DirectHandle<NativeContext> context,
SerializeEmbedderFieldsCallback callback);
size_t AddData(DirectHandle<NativeContext> context, Address object);
size_t AddData(Address object);
StartupData CreateBlob(
SnapshotCreator::FunctionCodeHandling function_code_handling,
Snapshot::SerializerFlags serializer_flags =
Snapshot::kDefaultSerializerFlags);
static SnapshotCreatorImpl* FromSnapshotCreator(
v8::SnapshotCreator* snapshot_creator);
static constexpr size_t kDefaultContextIndex = 0;
static constexpr size_t kFirstAddtlContextIndex = kDefaultContextIndex + 1;
private:
struct SerializableContext {
SerializableContext() : handle_location(nullptr), callback(nullptr) {}
SerializableContext(Address* handle_location,
SerializeEmbedderFieldsCallback callback)
: handle_location(handle_location), callback(callback) {}
Address* handle_location = nullptr;
SerializeEmbedderFieldsCallback callback;
};
void InitInternal(const StartupData*);
DirectHandle<NativeContext> context_at(size_t i) const;
bool created() const { return contexts_.size() == 0; }
const bool owns_isolate_;
Isolate* const isolate_;
std::unique_ptr<v8::ArrayBuffer::Allocator> array_buffer_allocator_;
std::vector<SerializableContext> contexts_;
};
}
}
#endif