| Index: src/d8.h | 
| diff --git a/src/d8.h b/src/d8.h | 
| index b86558357b1538b25b61c4523103a21abf0cafb2..1bb8a8965ba9a94fbfc738b8663d4eb05eaf20ff 100644 | 
| --- a/src/d8.h | 
| +++ b/src/d8.h | 
| @@ -5,13 +5,9 @@ | 
| #ifndef V8_D8_H_ | 
| #define V8_D8_H_ | 
|  | 
| -#include <memory> | 
| #include <string> | 
| -#include <unordered_set> | 
| -#include <vector> | 
|  | 
| #include "src/allocation.h" | 
| -#include "src/base/functional.h" | 
| #include "src/base/hashmap.h" | 
| #include "src/base/platform/time.h" | 
| #include "src/list.h" | 
| @@ -147,51 +143,68 @@ | 
| int end_offset_; | 
| }; | 
|  | 
| +enum SerializationTag { | 
| +  kSerializationTagUndefined, | 
| +  kSerializationTagNull, | 
| +  kSerializationTagTrue, | 
| +  kSerializationTagFalse, | 
| +  kSerializationTagNumber, | 
| +  kSerializationTagString, | 
| +  kSerializationTagArray, | 
| +  kSerializationTagObject, | 
| +  kSerializationTagArrayBuffer, | 
| +  kSerializationTagTransferredArrayBuffer, | 
| +  kSerializationTagTransferredSharedArrayBuffer, | 
| +}; | 
| + | 
|  | 
| class SerializationData { | 
| public: | 
| -  SerializationData() : data_(nullptr), size_(0) {} | 
| +  SerializationData() {} | 
| ~SerializationData(); | 
|  | 
| -  uint8_t* data() { return data_.get(); } | 
| -  size_t size() { return size_; } | 
| -  const std::vector<ArrayBuffer::Contents>& array_buffer_contents() { | 
| -    return array_buffer_contents_; | 
| -  } | 
| -  const std::vector<SharedArrayBuffer::Contents>& | 
| -  shared_array_buffer_contents() { | 
| -    return shared_array_buffer_contents_; | 
| -  } | 
| - | 
| -  void ClearTransferredArrayBuffers(); | 
| - | 
| - private: | 
| -  struct DataDeleter { | 
| -    void operator()(uint8_t* p) const { free(p); } | 
| -  }; | 
| - | 
| -  std::unique_ptr<uint8_t, DataDeleter> data_; | 
| -  size_t size_; | 
| -  std::vector<ArrayBuffer::Contents> array_buffer_contents_; | 
| -  std::vector<SharedArrayBuffer::Contents> shared_array_buffer_contents_; | 
| - | 
| - private: | 
| -  friend class Serializer; | 
| - | 
| -  DISALLOW_COPY_AND_ASSIGN(SerializationData); | 
| +  void WriteTag(SerializationTag tag); | 
| +  void WriteMemory(const void* p, int length); | 
| +  void WriteArrayBufferContents(const ArrayBuffer::Contents& contents); | 
| +  void WriteSharedArrayBufferContents( | 
| +      const SharedArrayBuffer::Contents& contents); | 
| + | 
| +  template <typename T> | 
| +  void Write(const T& data) { | 
| +    WriteMemory(&data, sizeof(data)); | 
| +  } | 
| + | 
| +  SerializationTag ReadTag(int* offset) const; | 
| +  void ReadMemory(void* p, int length, int* offset) const; | 
| +  void ReadArrayBufferContents(ArrayBuffer::Contents* contents, | 
| +                               int* offset) const; | 
| +  void ReadSharedArrayBufferContents(SharedArrayBuffer::Contents* contents, | 
| +                                     int* offset) const; | 
| + | 
| +  template <typename T> | 
| +  T Read(int* offset) const { | 
| +    T value; | 
| +    ReadMemory(&value, sizeof(value), offset); | 
| +    return value; | 
| +  } | 
| + | 
| + private: | 
| +  i::List<uint8_t> data_; | 
| +  i::List<ArrayBuffer::Contents> array_buffer_contents_; | 
| +  i::List<SharedArrayBuffer::Contents> shared_array_buffer_contents_; | 
| }; | 
|  | 
|  | 
| class SerializationDataQueue { | 
| public: | 
| -  void Enqueue(std::unique_ptr<SerializationData> data); | 
| -  bool Dequeue(std::unique_ptr<SerializationData>* data); | 
| +  void Enqueue(SerializationData* data); | 
| +  bool Dequeue(SerializationData** data); | 
| bool IsEmpty(); | 
| void Clear(); | 
|  | 
| private: | 
| base::Mutex mutex_; | 
| -  std::vector<std::unique_ptr<SerializationData>> data_; | 
| +  i::List<SerializationData*> data_; | 
| }; | 
|  | 
|  | 
| @@ -206,13 +219,13 @@ | 
| // Post a message to the worker's incoming message queue. The worker will | 
| // take ownership of the SerializationData. | 
| // This function should only be called by the thread that created the Worker. | 
| -  void PostMessage(std::unique_ptr<SerializationData> data); | 
| +  void PostMessage(SerializationData* data); | 
| // Synchronously retrieve messages from the worker's outgoing message queue. | 
| // If there is no message in the queue, block until a message is available. | 
| // If there are no messages in the queue and the worker is no longer running, | 
| // return nullptr. | 
| // This function should only be called by the thread that created the Worker. | 
| -  std::unique_ptr<SerializationData> GetMessage(); | 
| +  SerializationData* GetMessage(); | 
| // Terminate the worker's event loop. Messages from the worker that have been | 
| // queued can still be read via GetMessage(). | 
| // This function can be called by any thread. | 
| @@ -322,10 +335,16 @@ | 
| static void CollectGarbage(Isolate* isolate); | 
| static void EmptyMessageQueues(Isolate* isolate); | 
|  | 
| -  static std::unique_ptr<SerializationData> SerializeValue( | 
| -      Isolate* isolate, Local<Value> value, Local<Value> transfer); | 
| -  static MaybeLocal<Value> DeserializeValue( | 
| -      Isolate* isolate, std::unique_ptr<SerializationData> data); | 
| +  // TODO(binji): stupid implementation for now. Is there an easy way to hash an | 
| +  // object for use in base::HashMap? By pointer? | 
| +  typedef i::List<Local<Object>> ObjectList; | 
| +  static bool SerializeValue(Isolate* isolate, Local<Value> value, | 
| +                             const ObjectList& to_transfer, | 
| +                             ObjectList* seen_objects, | 
| +                             SerializationData* out_data); | 
| +  static MaybeLocal<Value> DeserializeValue(Isolate* isolate, | 
| +                                            const SerializationData& data, | 
| +                                            int* offset); | 
| static void CleanupWorkers(); | 
| static int* LookupCounter(const char* name); | 
| static void* CreateHistogram(const char* name, | 
| @@ -424,26 +443,10 @@ | 
| static base::LazyMutex context_mutex_; | 
| static const base::TimeTicks kInitialTicks; | 
|  | 
| -  struct SharedArrayBufferContentsHash { | 
| -    size_t operator()(const v8::SharedArrayBuffer::Contents& contents) const { | 
| -      return base::hash_combine(contents.Data(), contents.ByteLength()); | 
| -    } | 
| -  }; | 
| - | 
| -  struct SharedArrayBufferContentsIsEqual { | 
| -    bool operator()(const SharedArrayBuffer::Contents& a, | 
| -                    const SharedArrayBuffer::Contents& b) const { | 
| -      return a.Data() == b.Data() && a.ByteLength() == b.ByteLength(); | 
| -    } | 
| -  }; | 
| - | 
| static base::LazyMutex workers_mutex_; | 
| static bool allow_new_workers_; | 
| static i::List<Worker*> workers_; | 
| -  static std::unordered_set<SharedArrayBuffer::Contents, | 
| -                            SharedArrayBufferContentsHash, | 
| -                            SharedArrayBufferContentsIsEqual> | 
| -      externalized_shared_contents_; | 
| +  static i::List<SharedArrayBuffer::Contents> externalized_shared_contents_; | 
|  | 
| static void WriteIgnitionDispatchCountersFile(v8::Isolate* isolate); | 
| static Counter* GetCounter(const char* name, bool is_histogram); | 
|  |