Index: src/d8.h |
diff --git a/src/d8.h b/src/d8.h |
index 1bb8a8965ba9a94fbfc738b8663d4eb05eaf20ff..b86558357b1538b25b61c4523103a21abf0cafb2 100644 |
--- a/src/d8.h |
+++ b/src/d8.h |
@@ -5,9 +5,13 @@ |
#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" |
@@ -143,68 +147,51 @@ class SourceGroup { |
int end_offset_; |
}; |
-enum SerializationTag { |
- kSerializationTagUndefined, |
- kSerializationTagNull, |
- kSerializationTagTrue, |
- kSerializationTagFalse, |
- kSerializationTagNumber, |
- kSerializationTagString, |
- kSerializationTagArray, |
- kSerializationTagObject, |
- kSerializationTagArrayBuffer, |
- kSerializationTagTransferredArrayBuffer, |
- kSerializationTagTransferredSharedArrayBuffer, |
-}; |
- |
class SerializationData { |
public: |
- SerializationData() {} |
+ SerializationData() : data_(nullptr), size_(0) {} |
~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)); |
+ uint8_t* data() { return data_.get(); } |
+ size_t size() { return size_; } |
+ const std::vector<ArrayBuffer::Contents>& array_buffer_contents() { |
+ return array_buffer_contents_; |
} |
- |
- 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; |
+ 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: |
- i::List<uint8_t> data_; |
- i::List<ArrayBuffer::Contents> array_buffer_contents_; |
- i::List<SharedArrayBuffer::Contents> shared_array_buffer_contents_; |
+ friend class Serializer; |
+ |
+ DISALLOW_COPY_AND_ASSIGN(SerializationData); |
}; |
class SerializationDataQueue { |
public: |
- void Enqueue(SerializationData* data); |
- bool Dequeue(SerializationData** data); |
+ void Enqueue(std::unique_ptr<SerializationData> data); |
+ bool Dequeue(std::unique_ptr<SerializationData>* data); |
bool IsEmpty(); |
void Clear(); |
private: |
base::Mutex mutex_; |
- i::List<SerializationData*> data_; |
+ std::vector<std::unique_ptr<SerializationData>> data_; |
}; |
@@ -219,13 +206,13 @@ class Worker { |
// 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(SerializationData* data); |
+ void PostMessage(std::unique_ptr<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. |
- SerializationData* GetMessage(); |
+ std::unique_ptr<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. |
@@ -335,16 +322,10 @@ class Shell : public i::AllStatic { |
static void CollectGarbage(Isolate* isolate); |
static void EmptyMessageQueues(Isolate* isolate); |
- // 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 std::unique_ptr<SerializationData> SerializeValue( |
+ Isolate* isolate, Local<Value> value, Local<Value> transfer); |
+ static MaybeLocal<Value> DeserializeValue( |
+ Isolate* isolate, std::unique_ptr<SerializationData> data); |
static void CleanupWorkers(); |
static int* LookupCounter(const char* name); |
static void* CreateHistogram(const char* name, |
@@ -443,10 +424,26 @@ class Shell : public i::AllStatic { |
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 i::List<SharedArrayBuffer::Contents> externalized_shared_contents_; |
+ static std::unordered_set<SharedArrayBuffer::Contents, |
+ SharedArrayBufferContentsHash, |
+ SharedArrayBufferContentsIsEqual> |
+ externalized_shared_contents_; |
static void WriteIgnitionDispatchCountersFile(v8::Isolate* isolate); |
static Counter* GetCounter(const char* name, bool is_histogram); |