| 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_
 | 
| 
 |