| Index: src/value-serializer.cc
|
| diff --git a/src/value-serializer.cc b/src/value-serializer.cc
|
| index 55c0ffb0eb29840436c41f622f92d4f37854796c..81301fd55395b4e8d2f356ec9413da6b6425953b 100644
|
| --- a/src/value-serializer.cc
|
| +++ b/src/value-serializer.cc
|
| @@ -110,8 +110,8 @@
|
| // ObjectReference to one) serialized just before it. This is a quirk arising
|
| // from the previous stack-based implementation.
|
| kArrayBufferView = 'V',
|
| - // Shared array buffer. transferID:uint32_t
|
| - kSharedArrayBuffer = 'u',
|
| + // Shared array buffer (transferred). transferID:uint32_t
|
| + kSharedArrayBufferTransfer = 'u',
|
| // Compiled WebAssembly module. encodingType:(one-byte tag).
|
| // If encodingType == 'y' (raw bytes):
|
| // wasmWireByteLength:uint32_t, then raw data
|
| @@ -269,7 +269,6 @@
|
| void ValueSerializer::TransferArrayBuffer(uint32_t transfer_id,
|
| Handle<JSArrayBuffer> array_buffer) {
|
| DCHECK(!array_buffer_transfer_map_.Find(array_buffer));
|
| - DCHECK(!array_buffer->is_shared());
|
| array_buffer_transfer_map_.Set(array_buffer, transfer_id);
|
| }
|
|
|
| @@ -443,7 +442,7 @@
|
| case JS_SET_TYPE:
|
| return WriteJSSet(Handle<JSSet>::cast(receiver));
|
| case JS_ARRAY_BUFFER_TYPE:
|
| - return WriteJSArrayBuffer(Handle<JSArrayBuffer>::cast(receiver));
|
| + return WriteJSArrayBuffer(JSArrayBuffer::cast(*receiver));
|
| case JS_TYPED_ARRAY_TYPE:
|
| case JS_DATA_VIEW_TYPE:
|
| return WriteJSArrayBufferView(JSArrayBufferView::cast(*receiver));
|
| @@ -725,29 +724,20 @@
|
| return Just(true);
|
| }
|
|
|
| -Maybe<bool> ValueSerializer::WriteJSArrayBuffer(
|
| - Handle<JSArrayBuffer> array_buffer) {
|
| - if (array_buffer->is_shared()) {
|
| - if (!delegate_) {
|
| - ThrowDataCloneError(MessageTemplate::kDataCloneError, array_buffer);
|
| - return Nothing<bool>();
|
| - }
|
| -
|
| - v8::Isolate* v8_isolate = reinterpret_cast<v8::Isolate*>(isolate_);
|
| - Maybe<uint32_t> index = delegate_->GetSharedArrayBufferId(
|
| - v8_isolate, Utils::ToLocalShared(array_buffer));
|
| - RETURN_VALUE_IF_SCHEDULED_EXCEPTION(isolate_, Nothing<bool>());
|
| -
|
| - WriteTag(SerializationTag::kSharedArrayBuffer);
|
| - WriteVarint(index.FromJust());
|
| - return Just(true);
|
| - }
|
| -
|
| +Maybe<bool> ValueSerializer::WriteJSArrayBuffer(JSArrayBuffer* array_buffer) {
|
| uint32_t* transfer_entry = array_buffer_transfer_map_.Find(array_buffer);
|
| if (transfer_entry) {
|
| - WriteTag(SerializationTag::kArrayBufferTransfer);
|
| + WriteTag(array_buffer->is_shared()
|
| + ? SerializationTag::kSharedArrayBufferTransfer
|
| + : SerializationTag::kArrayBufferTransfer);
|
| WriteVarint(*transfer_entry);
|
| return Just(true);
|
| + }
|
| +
|
| + if (array_buffer->is_shared()) {
|
| + ThrowDataCloneError(
|
| + MessageTemplate::kDataCloneErrorSharedArrayBufferNotTransferred);
|
| + return Nothing<bool>();
|
| }
|
| if (array_buffer->was_neutered()) {
|
| ThrowDataCloneError(MessageTemplate::kDataCloneErrorNeuteredArrayBuffer);
|
| @@ -755,7 +745,7 @@
|
| }
|
| double byte_length = array_buffer->byte_length()->Number();
|
| if (byte_length > std::numeric_limits<uint32_t>::max()) {
|
| - ThrowDataCloneError(MessageTemplate::kDataCloneError, array_buffer);
|
| + ThrowDataCloneError(MessageTemplate::kDataCloneError, handle(array_buffer));
|
| return Nothing<bool>();
|
| }
|
| WriteTag(SerializationTag::kArrayBuffer);
|
| @@ -1115,7 +1105,7 @@
|
| const bool is_shared = false;
|
| return ReadTransferredJSArrayBuffer(is_shared);
|
| }
|
| - case SerializationTag::kSharedArrayBuffer: {
|
| + case SerializationTag::kSharedArrayBufferTransfer: {
|
| const bool is_shared = true;
|
| return ReadTransferredJSArrayBuffer(is_shared);
|
| }
|
|
|