| Index: src/snapshot/deserializer.h
|
| diff --git a/src/snapshot/deserializer.h b/src/snapshot/deserializer.h
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..550cf5c64f1a1a4a4c42960940622fd0333660f6
|
| --- /dev/null
|
| +++ b/src/snapshot/deserializer.h
|
| @@ -0,0 +1,140 @@
|
| +// Copyright 2016 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_DESERIALIZER_H_
|
| +#define V8_SNAPSHOT_DESERIALIZER_H_
|
| +
|
| +#include "src/heap/heap.h"
|
| +#include "src/objects.h"
|
| +#include "src/snapshot/serializer-common.h"
|
| +#include "src/snapshot/snapshot-source-sink.h"
|
| +
|
| +namespace v8 {
|
| +namespace internal {
|
| +
|
| +class Heap;
|
| +
|
| +// A Deserializer reads a snapshot and reconstructs the Object graph it defines.
|
| +class Deserializer : public SerializerDeserializer {
|
| + public:
|
| + // Create a deserializer from a snapshot byte source.
|
| + template <class Data>
|
| + explicit Deserializer(Data* data)
|
| + : isolate_(NULL),
|
| + source_(data->Payload()),
|
| + magic_number_(data->GetMagicNumber()),
|
| + external_reference_table_(NULL),
|
| + deserialized_large_objects_(0),
|
| + deserializing_user_code_(false),
|
| + next_alignment_(kWordAligned) {
|
| + DecodeReservation(data->Reservations());
|
| + }
|
| +
|
| + ~Deserializer() override;
|
| +
|
| + // Deserialize the snapshot into an empty heap.
|
| + void Deserialize(Isolate* isolate);
|
| +
|
| + // Deserialize a single object and the objects reachable from it.
|
| + MaybeHandle<Object> DeserializePartial(Isolate* isolate,
|
| + Handle<JSGlobalProxy> global_proxy);
|
| +
|
| + // Deserialize a shared function info. Fail gracefully.
|
| + MaybeHandle<SharedFunctionInfo> DeserializeCode(Isolate* isolate);
|
| +
|
| + // Pass a vector of externally-provided objects referenced by the snapshot.
|
| + // The ownership to its backing store is handed over as well.
|
| + void SetAttachedObjects(Vector<Handle<Object> > attached_objects) {
|
| + attached_objects_ = attached_objects;
|
| + }
|
| +
|
| + private:
|
| + void VisitPointers(Object** start, Object** end) override;
|
| +
|
| + void Synchronize(VisitorSynchronization::SyncTag tag) override;
|
| +
|
| + void VisitRuntimeEntry(RelocInfo* rinfo) override { UNREACHABLE(); }
|
| +
|
| + void Initialize(Isolate* isolate);
|
| +
|
| + bool deserializing_user_code() { return deserializing_user_code_; }
|
| +
|
| + void DecodeReservation(Vector<const SerializedData::Reservation> res);
|
| +
|
| + bool ReserveSpace();
|
| +
|
| + void UnalignedCopy(Object** dest, Object** src) {
|
| + memcpy(dest, src, sizeof(*src));
|
| + }
|
| +
|
| + void SetAlignment(byte data) {
|
| + DCHECK_EQ(kWordAligned, next_alignment_);
|
| + int alignment = data - (kAlignmentPrefix - 1);
|
| + DCHECK_LE(kWordAligned, alignment);
|
| + DCHECK_LE(alignment, kSimd128Unaligned);
|
| + next_alignment_ = static_cast<AllocationAlignment>(alignment);
|
| + }
|
| +
|
| + void DeserializeDeferredObjects();
|
| +
|
| + void FlushICacheForNewIsolate();
|
| + void FlushICacheForNewCodeObjects();
|
| +
|
| + void CommitPostProcessedObjects(Isolate* isolate);
|
| +
|
| + // Fills in some heap data in an area from start to end (non-inclusive). The
|
| + // space id is used for the write barrier. The object_address is the address
|
| + // of the object we are writing into, or NULL if we are not writing into an
|
| + // object, i.e. if we are writing a series of tagged values that are not on
|
| + // the heap. Return false if the object content has been deferred.
|
| + bool ReadData(Object** start, Object** end, int space,
|
| + Address object_address);
|
| + void ReadObject(int space_number, Object** write_back);
|
| + Address Allocate(int space_index, int size);
|
| +
|
| + // Special handling for serialized code like hooking up internalized strings.
|
| + HeapObject* PostProcessNewObject(HeapObject* obj, int space);
|
| +
|
| + // This returns the address of an object that has been described in the
|
| + // snapshot by chunk index and offset.
|
| + HeapObject* GetBackReferencedObject(int space);
|
| +
|
| + Object** CopyInNativesSource(Vector<const char> source_vector,
|
| + Object** current);
|
| +
|
| + // Cached current isolate.
|
| + Isolate* isolate_;
|
| +
|
| + // Objects from the attached object descriptions in the serialized user code.
|
| + Vector<Handle<Object> > attached_objects_;
|
| +
|
| + SnapshotByteSource source_;
|
| + uint32_t magic_number_;
|
| +
|
| + // The address of the next object that will be allocated in each space.
|
| + // Each space has a number of chunks reserved by the GC, with each chunk
|
| + // fitting into a page. Deserialized objects are allocated into the
|
| + // current chunk of the target space by bumping up high water mark.
|
| + Heap::Reservation reservations_[kNumberOfSpaces];
|
| + uint32_t current_chunk_[kNumberOfPreallocatedSpaces];
|
| + Address high_water_[kNumberOfPreallocatedSpaces];
|
| +
|
| + ExternalReferenceTable* external_reference_table_;
|
| +
|
| + List<HeapObject*> deserialized_large_objects_;
|
| + List<Code*> new_code_objects_;
|
| + List<Handle<String> > new_internalized_strings_;
|
| + List<Handle<Script> > new_scripts_;
|
| +
|
| + bool deserializing_user_code_;
|
| +
|
| + AllocationAlignment next_alignment_;
|
| +
|
| + DISALLOW_COPY_AND_ASSIGN(Deserializer);
|
| +};
|
| +
|
| +} // namespace internal
|
| +} // namespace v8
|
| +
|
| +#endif // V8_SNAPSHOT_DESERIALIZER_H_
|
|
|