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

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

Issue 2748473004: [wasm] Transferrable modules (Closed)
Patch Set: Transferrable modules Created 3 years, 9 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
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 108 matching lines...) Expand 10 before | Expand all | Expand 10 after
119 // ObjectReference to one) serialized just before it. This is a quirk arising 119 // ObjectReference to one) serialized just before it. This is a quirk arising
120 // from the previous stack-based implementation. 120 // from the previous stack-based implementation.
121 kArrayBufferView = 'V', 121 kArrayBufferView = 'V',
122 // Shared array buffer. transferID:uint32_t 122 // Shared array buffer. transferID:uint32_t
123 kSharedArrayBuffer = 'u', 123 kSharedArrayBuffer = 'u',
124 // Compiled WebAssembly module. encodingType:(one-byte tag). 124 // Compiled WebAssembly module. encodingType:(one-byte tag).
125 // If encodingType == 'y' (raw bytes): 125 // If encodingType == 'y' (raw bytes):
126 // wasmWireByteLength:uint32_t, then raw data 126 // wasmWireByteLength:uint32_t, then raw data
127 // compiledDataLength:uint32_t, then raw data 127 // compiledDataLength:uint32_t, then raw data
128 kWasmModule = 'W', 128 kWasmModule = 'W',
129 // A wasm module object transfer. next value is its index.
130 kWasmModuleTransfer = 'w',
129 // The delegate is responsible for processing all following data. 131 // The delegate is responsible for processing all following data.
130 // This "escapes" to whatever wire format the delegate chooses. 132 // This "escapes" to whatever wire format the delegate chooses.
131 kHostObject = '\\', 133 kHostObject = '\\',
132 }; 134 };
133 135
134 namespace { 136 namespace {
135 137
136 enum class ArrayBufferViewTag : uint8_t { 138 enum class ArrayBufferViewTag : uint8_t {
137 kInt8Array = 'b', 139 kInt8Array = 'b',
138 kUint8Array = 'B', 140 kUint8Array = 'B',
(...skipping 657 matching lines...) Expand 10 before | Expand all | Expand 10 after
796 DCHECK(view->IsJSDataView()); 798 DCHECK(view->IsJSDataView());
797 tag = ArrayBufferViewTag::kDataView; 799 tag = ArrayBufferViewTag::kDataView;
798 } 800 }
799 WriteVarint(static_cast<uint8_t>(tag)); 801 WriteVarint(static_cast<uint8_t>(tag));
800 WriteVarint(NumberToUint32(view->byte_offset())); 802 WriteVarint(NumberToUint32(view->byte_offset()));
801 WriteVarint(NumberToUint32(view->byte_length())); 803 WriteVarint(NumberToUint32(view->byte_length()));
802 return ThrowIfOutOfMemory(); 804 return ThrowIfOutOfMemory();
803 } 805 }
804 806
805 Maybe<bool> ValueSerializer::WriteWasmModule(Handle<JSObject> object) { 807 Maybe<bool> ValueSerializer::WriteWasmModule(Handle<JSObject> object) {
808 if (delegate_ != nullptr) {
809 Maybe<uint32_t> transfer_id = delegate_->GetWasmModuleTransferId(
810 reinterpret_cast<v8::Isolate*>(isolate_),
811 v8::Local<v8::WasmCompiledModule>::Cast(Utils::ToLocal(object)));
812 uint32_t id = 0;
813 if (transfer_id.To(&id)) {
814 WriteTag(SerializationTag::kWasmModuleTransfer);
815 WriteVarint<uint32_t>(id);
816 return Just(true);
817 }
818 }
819
806 Handle<WasmCompiledModule> compiled_part( 820 Handle<WasmCompiledModule> compiled_part(
807 WasmCompiledModule::cast(object->GetInternalField(0)), isolate_); 821 WasmCompiledModule::cast(object->GetInternalField(0)), isolate_);
808 WasmEncodingTag encoding_tag = WasmEncodingTag::kRawBytes; 822 WasmEncodingTag encoding_tag = WasmEncodingTag::kRawBytes;
809 WriteTag(SerializationTag::kWasmModule); 823 WriteTag(SerializationTag::kWasmModule);
810 WriteRawBytes(&encoding_tag, sizeof(encoding_tag)); 824 WriteRawBytes(&encoding_tag, sizeof(encoding_tag));
811 825
812 Handle<String> wire_bytes(compiled_part->module_bytes(), isolate_); 826 Handle<String> wire_bytes(compiled_part->module_bytes(), isolate_);
813 int wire_bytes_length = wire_bytes->length(); 827 int wire_bytes_length = wire_bytes->length();
814 WriteVarint<uint32_t>(wire_bytes_length); 828 WriteVarint<uint32_t>(wire_bytes_length);
815 uint8_t* destination; 829 uint8_t* destination;
(...skipping 327 matching lines...) Expand 10 before | Expand all | Expand 10 after
1143 case SerializationTag::kArrayBufferTransfer: { 1157 case SerializationTag::kArrayBufferTransfer: {
1144 const bool is_shared = false; 1158 const bool is_shared = false;
1145 return ReadTransferredJSArrayBuffer(is_shared); 1159 return ReadTransferredJSArrayBuffer(is_shared);
1146 } 1160 }
1147 case SerializationTag::kSharedArrayBuffer: { 1161 case SerializationTag::kSharedArrayBuffer: {
1148 const bool is_shared = true; 1162 const bool is_shared = true;
1149 return ReadTransferredJSArrayBuffer(is_shared); 1163 return ReadTransferredJSArrayBuffer(is_shared);
1150 } 1164 }
1151 case SerializationTag::kWasmModule: 1165 case SerializationTag::kWasmModule:
1152 return ReadWasmModule(); 1166 return ReadWasmModule();
1167 case SerializationTag::kWasmModuleTransfer:
1168 return ReadWasmModuleTransfer();
1153 case SerializationTag::kHostObject: 1169 case SerializationTag::kHostObject:
1154 return ReadHostObject(); 1170 return ReadHostObject();
1155 default: 1171 default:
1156 // Before there was an explicit tag for host objects, all unknown tags 1172 // Before there was an explicit tag for host objects, all unknown tags
1157 // were delegated to the host. 1173 // were delegated to the host.
1158 if (version_ < 13) { 1174 if (version_ < 13) {
1159 position_--; 1175 position_--;
1160 return ReadHostObject(); 1176 return ReadHostObject();
1161 } 1177 }
1162 return MaybeHandle<Object>(); 1178 return MaybeHandle<Object>();
(...skipping 425 matching lines...) Expand 10 before | Expand all | Expand 10 after
1588 byte_length % element_size != 0) { 1604 byte_length % element_size != 0) {
1589 return MaybeHandle<JSArrayBufferView>(); 1605 return MaybeHandle<JSArrayBufferView>();
1590 } 1606 }
1591 Handle<JSTypedArray> typed_array = isolate_->factory()->NewJSTypedArray( 1607 Handle<JSTypedArray> typed_array = isolate_->factory()->NewJSTypedArray(
1592 external_array_type, buffer, byte_offset, byte_length / element_size, 1608 external_array_type, buffer, byte_offset, byte_length / element_size,
1593 pretenure_); 1609 pretenure_);
1594 AddObjectWithID(id, typed_array); 1610 AddObjectWithID(id, typed_array);
1595 return typed_array; 1611 return typed_array;
1596 } 1612 }
1597 1613
1614 MaybeHandle<JSObject> ValueDeserializer::ReadWasmModuleTransfer() {
1615 if (FLAG_wasm_disable_structured_cloning) return MaybeHandle<JSObject>();
1616 uint32_t index = 0;
1617 v8::Local<v8::Value> module;
1618 if (delegate_ != nullptr && ReadVarint<uint32_t>().To(&index) &&
1619 delegate_
1620 ->GetWasmModuleFromId(reinterpret_cast<v8::Isolate*>(isolate_), index)
1621 .ToLocal(&module)) {
1622 return Handle<JSObject>::cast(Utils::OpenHandle(*module));
1623 } else {
1624 return MaybeHandle<JSObject>();
1625 }
1626 }
1627
1598 MaybeHandle<JSObject> ValueDeserializer::ReadWasmModule() { 1628 MaybeHandle<JSObject> ValueDeserializer::ReadWasmModule() {
1599 if (FLAG_wasm_disable_structured_cloning) return MaybeHandle<JSObject>(); 1629 if (FLAG_wasm_disable_structured_cloning || delegate_ == nullptr ||
1630 !delegate_->AllowInlineWasm())
1631 return MaybeHandle<JSObject>();
1600 1632
1601 Vector<const uint8_t> encoding_tag; 1633 Vector<const uint8_t> encoding_tag;
1602 if (!ReadRawBytes(sizeof(WasmEncodingTag)).To(&encoding_tag) || 1634 if (!ReadRawBytes(sizeof(WasmEncodingTag)).To(&encoding_tag) ||
1603 encoding_tag[0] != static_cast<uint8_t>(WasmEncodingTag::kRawBytes)) { 1635 encoding_tag[0] != static_cast<uint8_t>(WasmEncodingTag::kRawBytes)) {
1604 return MaybeHandle<JSObject>(); 1636 return MaybeHandle<JSObject>();
1605 } 1637 }
1606 1638
1607 // Extract the data from the buffer: wasm wire bytes, followed by V8 compiled 1639 // Extract the data from the buffer: wasm wire bytes, followed by V8 compiled
1608 // script data. 1640 // script data.
1609 static_assert(sizeof(int) <= sizeof(uint32_t), 1641 static_assert(sizeof(int) <= sizeof(uint32_t),
(...skipping 359 matching lines...) Expand 10 before | Expand all | Expand 10 after
1969 if (stack.size() != 1) { 2001 if (stack.size() != 1) {
1970 isolate_->Throw(*isolate_->factory()->NewError( 2002 isolate_->Throw(*isolate_->factory()->NewError(
1971 MessageTemplate::kDataCloneDeserializationError)); 2003 MessageTemplate::kDataCloneDeserializationError));
1972 return MaybeHandle<Object>(); 2004 return MaybeHandle<Object>();
1973 } 2005 }
1974 return scope.CloseAndEscape(stack[0]); 2006 return scope.CloseAndEscape(stack[0]);
1975 } 2007 }
1976 2008
1977 } // namespace internal 2009 } // namespace internal
1978 } // namespace v8 2010 } // namespace v8
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698