Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(243)

Unified Diff: src/snapshot/deserializer.h

Issue 1751863002: [serializer] split up src/snapshot/serialize.* (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: fix Created 4 years, 10 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
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_

Powered by Google App Engine
This is Rietveld 408576698