%PDF- %PDF-
Direktori : /home/vacivi36/vittasync.vacivitta.com.br/vittasync/node/deps/v8/src/snapshot/ |
Current File : /home/vacivi36/vittasync.vacivitta.com.br/vittasync/node/deps/v8/src/snapshot/snapshot.h |
// Copyright 2020 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 V8_SNAPSHOT_SNAPSHOT_H_ #define V8_SNAPSHOT_SNAPSHOT_H_ #include <vector> #include "include/v8-array-buffer.h" // For ArrayBuffer::Allocator. #include "include/v8-snapshot.h" // For StartupData. #include "src/common/assert-scope.h" #include "src/common/globals.h" namespace v8 { namespace internal { class Context; class Isolate; class JSGlobalProxy; class SafepointScope; class SnapshotData; class Snapshot : public AllStatic { public: // ---------------- Serialization ------------------------------------------- enum SerializerFlag { // If set, serializes unknown external references as verbatim data. This // usually leads to invalid state if the snapshot is deserialized in a // different isolate or a different process. // If unset, all external references must be known to the encoder. kAllowUnknownExternalReferencesForTesting = 1 << 0, // If set, the serializer enters a more permissive mode which allows // serialization of a currently active, running isolate. This has multiple // effects; for example, open handles are allowed, microtasks may exist, // etc. Note that in this mode, the serializer is allowed to skip // visitation of certain problematic areas even if they are non-empty. The // resulting snapshot is not guaranteed to result in a runnable context // after deserialization. // If unset, we assert that these previously mentioned areas are empty. kAllowActiveIsolateForTesting = 1 << 1, // If set, the ReadOnlySerializer and the SharedHeapSerializer reconstructs // their respective object caches from the existing ReadOnlyHeap's read-only // object cache or the existing shared heap's object cache so the same // mapping is used. This mode is used for testing deserialization of a // snapshot from a live isolate that's using a shared ReadOnlyHeap or is // attached to a shared isolate. Otherwise during deserialization the // indices will mismatch, causing deserialization crashes when e.g. types // mismatch. If unset, the read-only object cache is populated as read-only // objects are serialized, and the shared heap object cache is populated as // shared heap objects are serialized. kReconstructReadOnlyAndSharedObjectCachesForTesting = 1 << 2, }; using SerializerFlags = base::Flags<SerializerFlag>; V8_EXPORT_PRIVATE static constexpr SerializerFlags kDefaultSerializerFlags = {}; // In preparation for serialization, clear data from the given isolate's heap // that 1. can be reconstructed and 2. is not suitable for serialization. The // `clear_recompilable_data` flag controls whether compiled objects are // cleared from shared function infos and regexp objects. V8_EXPORT_PRIVATE static void ClearReconstructableDataForSerialization( Isolate* isolate, bool clear_recompilable_data); // Serializes the given isolate and contexts. Each context may have an // associated callback to serialize internal fields. The default context must // be passed at index 0. static v8::StartupData Create( Isolate* isolate, std::vector<Tagged<Context>>* contexts, const std::vector<SerializeInternalFieldsCallback>& embedder_fields_serializers, const SafepointScope& safepoint_scope, const DisallowGarbageCollection& no_gc, SerializerFlags flags = kDefaultSerializerFlags); // ---------------- Deserialization ----------------------------------------- // Initialize the Isolate from the internal snapshot. Returns false if no // snapshot could be found. static bool Initialize(Isolate* isolate); // Create a new context using the internal context snapshot. static MaybeHandle<Context> NewContextFromSnapshot( Isolate* isolate, Handle<JSGlobalProxy> global_proxy, size_t context_index, v8::DeserializeEmbedderFieldsCallback embedder_fields_deserializer); // ---------------- Testing ------------------------------------------------- // This function is used to stress the snapshot component. It serializes the // current isolate and context into a snapshot, deserializes the snapshot into // a new isolate and context, and finally runs VerifyHeap on the fresh // isolate. V8_EXPORT_PRIVATE static void SerializeDeserializeAndVerifyForTesting( Isolate* isolate, Handle<Context> default_context); // ---------------- Helper methods ------------------------------------------ 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); // To be implemented by the snapshot source. static const v8::StartupData* DefaultSnapshotBlob(); static bool ShouldVerifyChecksum(const v8::StartupData* data); #ifdef DEBUG static bool SnapshotIsValid(const v8::StartupData* snapshot_blob); #endif // DEBUG }; // Convenience wrapper around snapshot data blob creation used e.g. by tests and // mksnapshot. V8_EXPORT_PRIVATE v8::StartupData CreateSnapshotDataBlobInternal( v8::SnapshotCreator::FunctionCodeHandling function_code_handling, const char* embedded_source = nullptr, Isolate* isolate = nullptr, Snapshot::SerializerFlags serializer_flags = Snapshot::kDefaultSerializerFlags); // .. and for inspector-test.cc which needs an extern declaration due to // restrictive include rules: V8_EXPORT_PRIVATE v8::StartupData CreateSnapshotDataBlobInternalForInspectorTest( v8::SnapshotCreator::FunctionCodeHandling function_code_handling, const char* embedded_source); // Convenience wrapper around snapshot data blob warmup used e.g. by tests and // mksnapshot. 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 // The implementation of the API-exposed class SnapshotCreator. class SnapshotCreatorImpl final { public: SnapshotCreatorImpl(Isolate* isolate, const intptr_t* api_external_references, const StartupData* existing_blob, bool owns_isolate); ~SnapshotCreatorImpl(); Isolate* isolate() const { return isolate_; } void SetDefaultContext(Handle<NativeContext> context, SerializeInternalFieldsCallback callback); size_t AddContext(Handle<NativeContext> context, SerializeInternalFieldsCallback callback); size_t AddData(Handle<NativeContext> context, Address object); size_t AddData(Address object); StartupData CreateBlob( SnapshotCreator::FunctionCodeHandling function_code_handling, Snapshot::SerializerFlags serializer_flags = Snapshot::kDefaultSerializerFlags); 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, SerializeInternalFieldsCallback callback) : handle_location(handle_location), callback(callback) {} Address* handle_location = nullptr; // A GlobalHandle. SerializeInternalFieldsCallback callback; }; Handle<NativeContext> context_at(size_t i) const; bool created() const { return contexts_.size() == 0; } const bool owns_isolate_; Isolate* const isolate_; v8::ArrayBuffer::Allocator* const array_buffer_allocator_; std::vector<SerializableContext> contexts_; }; } // namespace internal } // namespace v8 #endif // V8_SNAPSHOT_SNAPSHOT_H_