Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright 2016 the V8 project authors. All rights reserved. | 1 // Copyright 2016 the V8 project authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "src/value-serializer.h" | 5 #include "src/value-serializer.h" |
| 6 | 6 |
| 7 #include <type_traits> | 7 #include <type_traits> |
| 8 | 8 |
| 9 #include "src/base/logging.h" | 9 #include "src/base/logging.h" |
| 10 #include "src/conversions.h" | 10 #include "src/conversions.h" |
| (...skipping 424 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 435 case JS_VALUE_TYPE: | 435 case JS_VALUE_TYPE: |
| 436 return WriteJSValue(Handle<JSValue>::cast(receiver)); | 436 return WriteJSValue(Handle<JSValue>::cast(receiver)); |
| 437 case JS_REGEXP_TYPE: | 437 case JS_REGEXP_TYPE: |
| 438 WriteJSRegExp(JSRegExp::cast(*receiver)); | 438 WriteJSRegExp(JSRegExp::cast(*receiver)); |
| 439 return Just(true); | 439 return Just(true); |
| 440 case JS_MAP_TYPE: | 440 case JS_MAP_TYPE: |
| 441 return WriteJSMap(Handle<JSMap>::cast(receiver)); | 441 return WriteJSMap(Handle<JSMap>::cast(receiver)); |
| 442 case JS_SET_TYPE: | 442 case JS_SET_TYPE: |
| 443 return WriteJSSet(Handle<JSSet>::cast(receiver)); | 443 return WriteJSSet(Handle<JSSet>::cast(receiver)); |
| 444 case JS_ARRAY_BUFFER_TYPE: | 444 case JS_ARRAY_BUFFER_TYPE: |
| 445 return WriteJSArrayBuffer(JSArrayBuffer::cast(*receiver)); | 445 return WriteJSArrayBuffer(Handle<JSArrayBuffer>::cast(receiver)); |
| 446 case JS_TYPED_ARRAY_TYPE: | 446 case JS_TYPED_ARRAY_TYPE: |
| 447 case JS_DATA_VIEW_TYPE: | 447 case JS_DATA_VIEW_TYPE: |
| 448 return WriteJSArrayBufferView(JSArrayBufferView::cast(*receiver)); | 448 return WriteJSArrayBufferView(JSArrayBufferView::cast(*receiver)); |
| 449 default: | 449 default: |
| 450 ThrowDataCloneError(MessageTemplate::kDataCloneError, receiver); | 450 ThrowDataCloneError(MessageTemplate::kDataCloneError, receiver); |
| 451 return Nothing<bool>(); | 451 return Nothing<bool>(); |
| 452 } | 452 } |
| 453 return Nothing<bool>(); | 453 return Nothing<bool>(); |
| 454 } | 454 } |
| 455 | 455 |
| (...skipping 261 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 717 for (int i = 0; i < length; i++) { | 717 for (int i = 0; i < length; i++) { |
| 718 if (!WriteObject(handle(entries->get(i), isolate_)).FromMaybe(false)) { | 718 if (!WriteObject(handle(entries->get(i), isolate_)).FromMaybe(false)) { |
| 719 return Nothing<bool>(); | 719 return Nothing<bool>(); |
| 720 } | 720 } |
| 721 } | 721 } |
| 722 WriteTag(SerializationTag::kEndJSSet); | 722 WriteTag(SerializationTag::kEndJSSet); |
| 723 WriteVarint<uint32_t>(length); | 723 WriteVarint<uint32_t>(length); |
| 724 return Just(true); | 724 return Just(true); |
| 725 } | 725 } |
| 726 | 726 |
| 727 Maybe<bool> ValueSerializer::WriteJSArrayBuffer(JSArrayBuffer* array_buffer) { | 727 Maybe<bool> ValueSerializer::WriteJSArrayBuffer( |
| 728 Handle<JSArrayBuffer> array_buffer) { | |
| 728 uint32_t* transfer_entry = array_buffer_transfer_map_.Find(array_buffer); | 729 uint32_t* transfer_entry = array_buffer_transfer_map_.Find(array_buffer); |
| 729 if (transfer_entry) { | 730 if (array_buffer->is_shared()) { |
| 730 WriteTag(array_buffer->is_shared() | 731 if (!delegate_) { |
| 731 ? SerializationTag::kSharedArrayBufferTransfer | 732 ThrowDataCloneError(MessageTemplate::kDataCloneError, array_buffer); |
| 732 : SerializationTag::kArrayBufferTransfer); | 733 return Nothing<bool>(); |
| 733 WriteVarint(*transfer_entry); | 734 } |
| 735 | |
| 736 if (transfer_entry) { | |
| 737 // SharedArrayBuffer must not be in the transfer list. | |
| 738 ThrowDataCloneError( | |
|
Jakob Kummerow
2016/12/13 02:34:58
Would it make more sense to enforce this with a DC
jbroman
2016/12/13 20:56:00
+1
binji
2016/12/14 23:58:30
Done.
| |
| 739 MessageTemplate::kDataCloneErrorSharedArrayBufferTransferred); | |
| 740 return Nothing<bool>(); | |
| 741 } | |
| 742 | |
| 743 v8::Isolate* v8_isolate = reinterpret_cast<v8::Isolate*>(isolate_); | |
| 744 Maybe<uint32_t> index = delegate_->TransferSharedArrayBuffer( | |
| 745 v8_isolate, Utils::ToLocal(array_buffer)); | |
| 746 RETURN_VALUE_IF_SCHEDULED_EXCEPTION(isolate_, Nothing<bool>()); | |
| 747 DCHECK(!index.IsNothing()); | |
| 748 | |
| 749 WriteTag(SerializationTag::kSharedArrayBufferTransfer); | |
|
jbroman
2016/12/13 20:56:00
nit: Should this be renamed to just kSharedArrayBu
binji
2016/12/14 23:58:30
Done.
| |
| 750 WriteVarint(index.FromJust()); | |
| 734 return Just(true); | 751 return Just(true); |
| 735 } | 752 } else { |
|
jbroman
2016/12/13 20:56:00
nit: From my perspective, having to match this els
binji
2016/12/14 23:58:30
Done.
| |
| 736 | 753 if (transfer_entry) { |
| 737 if (array_buffer->is_shared()) { | 754 WriteTag(SerializationTag::kArrayBufferTransfer); |
| 738 ThrowDataCloneError( | 755 WriteVarint(*transfer_entry); |
| 739 MessageTemplate::kDataCloneErrorSharedArrayBufferNotTransferred); | 756 return Just(true); |
| 740 return Nothing<bool>(); | 757 } |
| 741 } | 758 } |
| 742 if (array_buffer->was_neutered()) { | 759 if (array_buffer->was_neutered()) { |
| 743 ThrowDataCloneError(MessageTemplate::kDataCloneErrorNeuteredArrayBuffer); | 760 ThrowDataCloneError(MessageTemplate::kDataCloneErrorNeuteredArrayBuffer); |
| 744 return Nothing<bool>(); | 761 return Nothing<bool>(); |
| 745 } | 762 } |
| 746 double byte_length = array_buffer->byte_length()->Number(); | 763 double byte_length = array_buffer->byte_length()->Number(); |
| 747 if (byte_length > std::numeric_limits<uint32_t>::max()) { | 764 if (byte_length > std::numeric_limits<uint32_t>::max()) { |
| 748 ThrowDataCloneError(MessageTemplate::kDataCloneError, handle(array_buffer)); | 765 ThrowDataCloneError(MessageTemplate::kDataCloneError, array_buffer); |
| 749 return Nothing<bool>(); | 766 return Nothing<bool>(); |
| 750 } | 767 } |
| 751 WriteTag(SerializationTag::kArrayBuffer); | 768 WriteTag(SerializationTag::kArrayBuffer); |
| 752 WriteVarint<uint32_t>(byte_length); | 769 WriteVarint<uint32_t>(byte_length); |
| 753 WriteRawBytes(array_buffer->backing_store(), byte_length); | 770 WriteRawBytes(array_buffer->backing_store(), byte_length); |
| 754 return Just(true); | 771 return Just(true); |
| 755 } | 772 } |
| 756 | 773 |
| 757 Maybe<bool> ValueSerializer::WriteJSArrayBufferView(JSArrayBufferView* view) { | 774 Maybe<bool> ValueSerializer::WriteJSArrayBufferView(JSArrayBufferView* view) { |
| 758 WriteTag(SerializationTag::kArrayBufferView); | 775 WriteTag(SerializationTag::kArrayBufferView); |
| (...skipping 1101 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1860 if (stack.size() != 1) { | 1877 if (stack.size() != 1) { |
| 1861 isolate_->Throw(*isolate_->factory()->NewError( | 1878 isolate_->Throw(*isolate_->factory()->NewError( |
| 1862 MessageTemplate::kDataCloneDeserializationError)); | 1879 MessageTemplate::kDataCloneDeserializationError)); |
| 1863 return MaybeHandle<Object>(); | 1880 return MaybeHandle<Object>(); |
| 1864 } | 1881 } |
| 1865 return scope.CloseAndEscape(stack[0]); | 1882 return scope.CloseAndEscape(stack[0]); |
| 1866 } | 1883 } |
| 1867 | 1884 |
| 1868 } // namespace internal | 1885 } // namespace internal |
| 1869 } // namespace v8 | 1886 } // namespace v8 |
| OLD | NEW |