| Index: src/value-serializer.cc
|
| diff --git a/src/value-serializer.cc b/src/value-serializer.cc
|
| index 8130856ed9e142ab72c37e92fc2871def7fba875..079a6ced98d25f732da00f417f23aaf9c7e022fd 100644
|
| --- a/src/value-serializer.cc
|
| +++ b/src/value-serializer.cc
|
| @@ -103,6 +103,8 @@ enum class SerializationTag : uint8_t {
|
| // ObjectReference to one) serialized just before it. This is a quirk arising
|
| // from the previous stack-based implementation.
|
| kArrayBufferView = 'V',
|
| + // Shared array buffer (transferred). transferID:uint32_t
|
| + kSharedArrayBufferTransfer = 'u',
|
| };
|
|
|
| namespace {
|
| @@ -557,12 +559,15 @@ Maybe<bool> ValueSerializer::WriteJSSet(Handle<JSSet> set) {
|
| Maybe<bool> ValueSerializer::WriteJSArrayBuffer(JSArrayBuffer* array_buffer) {
|
| uint32_t* transfer_entry = array_buffer_transfer_map_.Find(array_buffer);
|
| if (transfer_entry) {
|
| - DCHECK(array_buffer->was_neutered());
|
| - WriteTag(SerializationTag::kArrayBufferTransfer);
|
| + DCHECK(array_buffer->was_neutered() || array_buffer->is_shared());
|
| + WriteTag(array_buffer->is_shared()
|
| + ? SerializationTag::kSharedArrayBufferTransfer
|
| + : SerializationTag::kArrayBufferTransfer);
|
| WriteVarint(*transfer_entry);
|
| return Just(true);
|
| }
|
|
|
| + if (array_buffer->is_shared()) return Nothing<bool>();
|
| if (array_buffer->was_neutered()) return Nothing<bool>();
|
| double byte_length = array_buffer->byte_length()->Number();
|
| if (byte_length > std::numeric_limits<uint32_t>::max()) {
|
| @@ -832,8 +837,14 @@ MaybeHandle<Object> ValueDeserializer::ReadObjectInternal() {
|
| return ReadJSSet();
|
| case SerializationTag::kArrayBuffer:
|
| return ReadJSArrayBuffer();
|
| - case SerializationTag::kArrayBufferTransfer:
|
| - return ReadTransferredJSArrayBuffer();
|
| + case SerializationTag::kArrayBufferTransfer: {
|
| + const bool is_shared = false;
|
| + return ReadTransferredJSArrayBuffer(is_shared);
|
| + }
|
| + case SerializationTag::kSharedArrayBufferTransfer: {
|
| + const bool is_shared = true;
|
| + return ReadTransferredJSArrayBuffer(is_shared);
|
| + }
|
| default:
|
| return MaybeHandle<Object>();
|
| }
|
| @@ -1120,7 +1131,8 @@ MaybeHandle<JSArrayBuffer> ValueDeserializer::ReadJSArrayBuffer() {
|
| return array_buffer;
|
| }
|
|
|
| -MaybeHandle<JSArrayBuffer> ValueDeserializer::ReadTransferredJSArrayBuffer() {
|
| +MaybeHandle<JSArrayBuffer> ValueDeserializer::ReadTransferredJSArrayBuffer(
|
| + bool is_shared) {
|
| uint32_t id = next_id_++;
|
| uint32_t transfer_id;
|
| Handle<SeededNumberDictionary> transfer_map;
|
| @@ -1134,6 +1146,7 @@ MaybeHandle<JSArrayBuffer> ValueDeserializer::ReadTransferredJSArrayBuffer() {
|
| }
|
| Handle<JSArrayBuffer> array_buffer(
|
| JSArrayBuffer::cast(transfer_map->ValueAt(index)), isolate_);
|
| + DCHECK_EQ(is_shared, array_buffer->is_shared());
|
| AddObjectWithID(id, array_buffer);
|
| return array_buffer;
|
| }
|
|
|