Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(7)

Side by Side Diff: src/value-serializer.cc

Issue 2696133007: ValueSerializer: Add SetTreatArrayBufferViewsAsHostObjects() flag (Closed)
Patch Set: ValueSerializer: Add SetTreatArrayBufferViewsAsHostObjects() flag Created 3 years, 10 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « src/value-serializer.h ('k') | test/unittests/value-serializer-unittest.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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 152 matching lines...) Expand 10 before | Expand all | Expand 10 after
163 free(buffer_); 163 free(buffer_);
164 } 164 }
165 } 165 }
166 } 166 }
167 167
168 void ValueSerializer::WriteHeader() { 168 void ValueSerializer::WriteHeader() {
169 WriteTag(SerializationTag::kVersion); 169 WriteTag(SerializationTag::kVersion);
170 WriteVarint(kLatestVersion); 170 WriteVarint(kLatestVersion);
171 } 171 }
172 172
173 void ValueSerializer::SetTreatArrayBufferViewsAsHostObjects(bool mode) {
174 treat_array_buffer_views_as_host_objects_ = mode;
175 }
176
173 void ValueSerializer::WriteTag(SerializationTag tag) { 177 void ValueSerializer::WriteTag(SerializationTag tag) {
174 uint8_t raw_tag = static_cast<uint8_t>(tag); 178 uint8_t raw_tag = static_cast<uint8_t>(tag);
175 WriteRawBytes(&raw_tag, sizeof(raw_tag)); 179 WriteRawBytes(&raw_tag, sizeof(raw_tag));
176 } 180 }
177 181
178 template <typename T> 182 template <typename T>
179 void ValueSerializer::WriteVarint(T value) { 183 void ValueSerializer::WriteVarint(T value) {
180 // Writes an unsigned integer as a base-128 varint. 184 // Writes an unsigned integer as a base-128 varint.
181 // The number is written, 7 bits at a time, from the least significant to the 185 // The number is written, 7 bits at a time, from the least significant to the
182 // most significant 7 bits. Each byte, except the last, has the MSB set. 186 // most significant 7 bits. Each byte, except the last, has the MSB set.
(...skipping 128 matching lines...) Expand 10 before | Expand all | Expand 10 after
311 WriteHeapNumber(HeapNumber::cast(*object)); 315 WriteHeapNumber(HeapNumber::cast(*object));
312 return ThrowIfOutOfMemory(); 316 return ThrowIfOutOfMemory();
313 case JS_TYPED_ARRAY_TYPE: 317 case JS_TYPED_ARRAY_TYPE:
314 case JS_DATA_VIEW_TYPE: { 318 case JS_DATA_VIEW_TYPE: {
315 // Despite being JSReceivers, these have their wrapped buffer serialized 319 // Despite being JSReceivers, these have their wrapped buffer serialized
316 // first. That makes this logic a little quirky, because it needs to 320 // first. That makes this logic a little quirky, because it needs to
317 // happen before we assign object IDs. 321 // happen before we assign object IDs.
318 // TODO(jbroman): It may be possible to avoid materializing a typed 322 // TODO(jbroman): It may be possible to avoid materializing a typed
319 // array's buffer here. 323 // array's buffer here.
320 Handle<JSArrayBufferView> view = Handle<JSArrayBufferView>::cast(object); 324 Handle<JSArrayBufferView> view = Handle<JSArrayBufferView>::cast(object);
321 if (!id_map_.Find(view)) { 325 if (!id_map_.Find(view) && !treat_array_buffer_views_as_host_objects_) {
322 Handle<JSArrayBuffer> buffer( 326 Handle<JSArrayBuffer> buffer(
323 view->IsJSTypedArray() 327 view->IsJSTypedArray()
324 ? Handle<JSTypedArray>::cast(view)->GetBuffer() 328 ? Handle<JSTypedArray>::cast(view)->GetBuffer()
325 : handle(JSArrayBuffer::cast(view->buffer()), isolate_)); 329 : handle(JSArrayBuffer::cast(view->buffer()), isolate_));
326 if (!WriteJSReceiver(buffer).FromMaybe(false)) return Nothing<bool>(); 330 if (!WriteJSReceiver(buffer).FromMaybe(false)) return Nothing<bool>();
327 } 331 }
328 return WriteJSReceiver(view); 332 return WriteJSReceiver(view);
329 } 333 }
330 default: 334 default:
331 if (object->IsString()) { 335 if (object->IsString()) {
(...skipping 429 matching lines...) Expand 10 before | Expand all | Expand 10 after
761 ThrowDataCloneError(MessageTemplate::kDataCloneError, array_buffer); 765 ThrowDataCloneError(MessageTemplate::kDataCloneError, array_buffer);
762 return Nothing<bool>(); 766 return Nothing<bool>();
763 } 767 }
764 WriteTag(SerializationTag::kArrayBuffer); 768 WriteTag(SerializationTag::kArrayBuffer);
765 WriteVarint<uint32_t>(byte_length); 769 WriteVarint<uint32_t>(byte_length);
766 WriteRawBytes(array_buffer->backing_store(), byte_length); 770 WriteRawBytes(array_buffer->backing_store(), byte_length);
767 return ThrowIfOutOfMemory(); 771 return ThrowIfOutOfMemory();
768 } 772 }
769 773
770 Maybe<bool> ValueSerializer::WriteJSArrayBufferView(JSArrayBufferView* view) { 774 Maybe<bool> ValueSerializer::WriteJSArrayBufferView(JSArrayBufferView* view) {
775 if (treat_array_buffer_views_as_host_objects_) {
776 return WriteHostObject(handle(view, isolate_));
777 }
771 WriteTag(SerializationTag::kArrayBufferView); 778 WriteTag(SerializationTag::kArrayBufferView);
772 ArrayBufferViewTag tag = ArrayBufferViewTag::kInt8Array; 779 ArrayBufferViewTag tag = ArrayBufferViewTag::kInt8Array;
773 if (view->IsJSTypedArray()) { 780 if (view->IsJSTypedArray()) {
774 switch (JSTypedArray::cast(view)->type()) { 781 switch (JSTypedArray::cast(view)->type()) {
775 #define TYPED_ARRAY_CASE(Type, type, TYPE, ctype, size) \ 782 #define TYPED_ARRAY_CASE(Type, type, TYPE, ctype, size) \
776 case kExternal##Type##Array: \ 783 case kExternal##Type##Array: \
777 tag = ArrayBufferViewTag::k##Type##Array; \ 784 tag = ArrayBufferViewTag::k##Type##Array; \
778 break; 785 break;
779 TYPED_ARRAYS(TYPED_ARRAY_CASE) 786 TYPED_ARRAYS(TYPED_ARRAY_CASE)
780 #undef TYPED_ARRAY_CASE 787 #undef TYPED_ARRAY_CASE
(...skipping 1157 matching lines...) Expand 10 before | Expand all | Expand 10 after
1938 if (stack.size() != 1) { 1945 if (stack.size() != 1) {
1939 isolate_->Throw(*isolate_->factory()->NewError( 1946 isolate_->Throw(*isolate_->factory()->NewError(
1940 MessageTemplate::kDataCloneDeserializationError)); 1947 MessageTemplate::kDataCloneDeserializationError));
1941 return MaybeHandle<Object>(); 1948 return MaybeHandle<Object>();
1942 } 1949 }
1943 return scope.CloseAndEscape(stack[0]); 1950 return scope.CloseAndEscape(stack[0]);
1944 } 1951 }
1945 1952
1946 } // namespace internal 1953 } // namespace internal
1947 } // namespace v8 1954 } // namespace v8
OLDNEW
« no previous file with comments | « src/value-serializer.h ('k') | test/unittests/value-serializer-unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698