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

Side by Side Diff: third_party/WebKit/Source/bindings/core/v8/ScriptValueSerializer.cpp

Issue 2255673003: [wasm] Support wasm module structured cloning. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: LayoutTests and virtual path Created 4 years, 3 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 2014 The Chromium Authors. All rights reserved. 1 // Copyright 2014 The Chromium 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 "bindings/core/v8/ScriptValueSerializer.h" 5 #include "bindings/core/v8/ScriptValueSerializer.h"
6 6
7 #include "bindings/core/v8/Transferables.h" 7 #include "bindings/core/v8/Transferables.h"
8 #include "bindings/core/v8/V8ArrayBuffer.h" 8 #include "bindings/core/v8/V8ArrayBuffer.h"
9 #include "bindings/core/v8/V8ArrayBufferView.h" 9 #include "bindings/core/v8/V8ArrayBufferView.h"
10 #include "bindings/core/v8/V8Blob.h" 10 #include "bindings/core/v8/V8Blob.h"
(...skipping 873 matching lines...) Expand 10 before | Expand all | Expand 10 after
884 return writeAndGreyArrayBuffer(object, next); 884 return writeAndGreyArrayBuffer(object, next);
885 } 885 }
886 if (object->IsSharedArrayBuffer()) { 886 if (object->IsSharedArrayBuffer()) {
887 uint32_t index; 887 uint32_t index;
888 if (!m_transferredArrayBuffers.tryGet(object, &index)) { 888 if (!m_transferredArrayBuffers.tryGet(object, &index)) {
889 return handleError(Status::DataCloneError, "A SharedArrayBuffer coul d not be cloned.", next); 889 return handleError(Status::DataCloneError, "A SharedArrayBuffer coul d not be cloned.", next);
890 } 890 }
891 return writeTransferredSharedArrayBuffer(object, index, next); 891 return writeTransferredSharedArrayBuffer(object, index, next);
892 } 892 }
893 893
894 if (object->IsWebAssemblyCompiledModule())
895 return writeWasmCompiledModule(object, next);
896
894 // Transferable only objects 897 // Transferable only objects
895 if (V8MessagePort::hasInstance(object, isolate())) { 898 if (V8MessagePort::hasInstance(object, isolate())) {
896 uint32_t index; 899 uint32_t index;
897 if (!m_transferredMessagePorts.tryGet(object, &index)) { 900 if (!m_transferredMessagePorts.tryGet(object, &index)) {
898 return handleError(Status::DataCloneError, "A MessagePort could not be cloned.", next); 901 return handleError(Status::DataCloneError, "A MessagePort could not be cloned.", next);
899 } 902 }
900 m_writer.writeTransferredMessagePort(index); 903 m_writer.writeTransferredMessagePort(index);
901 return nullptr; 904 return nullptr;
902 } 905 }
903 if (V8OffscreenCanvas::hasInstance(object, isolate())) { 906 if (V8OffscreenCanvas::hasInstance(object, isolate())) {
(...skipping 287 matching lines...) Expand 10 before | Expand all | Expand 10 after
1191 // 1194 //
1192 // We do need to grey the underlying buffer before we grey its view, however ; 1195 // We do need to grey the underlying buffer before we grey its view, however ;
1193 // ArrayBuffers may be shared, so they need to be given reference IDs, and a n 1196 // ArrayBuffers may be shared, so they need to be given reference IDs, and a n
1194 // ArrayBufferView cannot be constructed without a corresponding ArrayBuffer 1197 // ArrayBufferView cannot be constructed without a corresponding ArrayBuffer
1195 // (or without an additional tag that would allow us to do two-stage constru ction 1198 // (or without an additional tag that would allow us to do two-stage constru ction
1196 // like we do for Objects and Arrays). 1199 // like we do for Objects and Arrays).
1197 greyObject(object); 1200 greyObject(object);
1198 return nullptr; 1201 return nullptr;
1199 } 1202 }
1200 1203
1204 ScriptValueSerializer::StateBase* ScriptValueSerializer::writeWasmCompiledModule (v8::Local<v8::Object> object, StateBase* next)
1205 {
1206 CHECK(RuntimeEnabledFeatures::webAssemblySerializationEnabled());
1207 // TODO (mtrofin): explore mechanism avoiding data copying / buffer resizing .
1208 v8::Local<v8::WasmCompiledModule> wasmModule = object.As<v8::WasmCompiledMod ule>();
1209 v8::WasmCompiledModule::SerializedModule data = wasmModule->Serialize();
1210 m_writer.append(WasmModuleTag);
1211 m_writer.doWriteUint32(static_cast<uint32_t>(data.second));
1212 m_writer.append(data.first.get(), static_cast<int>(data.second));
1213 return nullptr;
1214 }
1215
1201 ScriptValueSerializer::StateBase* ScriptValueSerializer::writeAndGreyArrayBuffer (v8::Local<v8::Object> object, StateBase* next) 1216 ScriptValueSerializer::StateBase* ScriptValueSerializer::writeAndGreyArrayBuffer (v8::Local<v8::Object> object, StateBase* next)
1202 { 1217 {
1203 DOMArrayBuffer* arrayBuffer = V8ArrayBuffer::toImpl(object); 1218 DOMArrayBuffer* arrayBuffer = V8ArrayBuffer::toImpl(object);
1204 if (!arrayBuffer) 1219 if (!arrayBuffer)
1205 return nullptr; 1220 return nullptr;
1206 if (arrayBuffer->isNeutered()) 1221 if (arrayBuffer->isNeutered())
1207 return handleError(Status::DataCloneError, "An ArrayBuffer is neutered a nd could not be cloned.", next); 1222 return handleError(Status::DataCloneError, "An ArrayBuffer is neutered a nd could not be cloned.", next);
1208 1223
1209 uint32_t index; 1224 uint32_t index;
1210 if (m_transferredArrayBuffers.tryGet(object, &index)) { 1225 if (m_transferredArrayBuffers.tryGet(object, &index)) {
(...skipping 280 matching lines...) Expand 10 before | Expand all | Expand 10 after
1491 break; 1506 break;
1492 } 1507 }
1493 case ArrayBufferViewTag: { 1508 case ArrayBufferViewTag: {
1494 if (!m_version) 1509 if (!m_version)
1495 return false; 1510 return false;
1496 if (!readArrayBufferView(value, deserializer)) 1511 if (!readArrayBufferView(value, deserializer))
1497 return false; 1512 return false;
1498 deserializer.pushObjectReference(*value); 1513 deserializer.pushObjectReference(*value);
1499 break; 1514 break;
1500 } 1515 }
1516 case WasmModuleTag: {
1517 if (!readWasmCompiledModule(value))
1518 return false;
1519 deserializer.pushObjectReference(*value);
1520 break;
1521 }
1501 case ArrayBufferTag: { 1522 case ArrayBufferTag: {
1502 if (!m_version) 1523 if (!m_version)
1503 return false; 1524 return false;
1504 if (!readArrayBuffer(value)) 1525 if (!readArrayBuffer(value))
1505 return false; 1526 return false;
1506 deserializer.pushObjectReference(*value); 1527 deserializer.pushObjectReference(*value);
1507 break; 1528 break;
1508 } 1529 }
1509 case GenerateFreshObjectTag: { 1530 case GenerateFreshObjectTag: {
1510 if (!m_version) 1531 if (!m_version)
(...skipping 332 matching lines...) Expand 10 before | Expand all | Expand 10 after
1843 uint32_t byteLength; 1864 uint32_t byteLength;
1844 if (!doReadUint32(&byteLength)) 1865 if (!doReadUint32(&byteLength))
1845 return nullptr; 1866 return nullptr;
1846 if (m_position + byteLength > m_length) 1867 if (m_position + byteLength > m_length)
1847 return nullptr; 1868 return nullptr;
1848 const void* bufferStart = m_buffer + m_position; 1869 const void* bufferStart = m_buffer + m_position;
1849 m_position += byteLength; 1870 m_position += byteLength;
1850 return DOMArrayBuffer::create(bufferStart, byteLength); 1871 return DOMArrayBuffer::create(bufferStart, byteLength);
1851 } 1872 }
1852 1873
1874 bool SerializedScriptValueReader::readWasmCompiledModule(v8::Local<v8::Value>* v alue)
1875 {
1876 CHECK(RuntimeEnabledFeatures::webAssemblySerializationEnabled());
1877 uint32_t size = 0;
1878 if (!doReadUint32(&size))
1879 return false;
1880 if (m_position + size > m_length)
1881 return false;
1882 const uint8_t* buf = m_buffer + m_position;
1883 // TODO(mtrofin): simplify deserializer API. const uint8_t* + size_t should
1884 // be sufficient.
1885 v8::WasmCompiledModule::SerializedModule data = {
1886 std::unique_ptr<const uint8_t[]>(buf),
1887 static_cast<size_t>(size)
1888 };
1889 v8::MaybeLocal<v8::WasmCompiledModule> retval = v8::WasmCompiledModule::Dese rialize(isolate(), data);
1890 data.first.release();
1891 m_position += size;
1892
1893 // TODO(mtrofin): right now, we'll return undefined if the deserialization
1894 // fails, which is what may happen when v8's version changes. Update when
1895 // spec settles. crbug.com/639090
1896 return retval.ToLocal(value);
1897 }
1898
1853 bool SerializedScriptValueReader::readArrayBuffer(v8::Local<v8::Value>* value) 1899 bool SerializedScriptValueReader::readArrayBuffer(v8::Local<v8::Value>* value)
1854 { 1900 {
1855 DOMArrayBuffer* arrayBuffer = doReadArrayBuffer(); 1901 DOMArrayBuffer* arrayBuffer = doReadArrayBuffer();
1856 if (!arrayBuffer) 1902 if (!arrayBuffer)
1857 return false; 1903 return false;
1858 *value = toV8(arrayBuffer, m_scriptState->context()->Global(), isolate()); 1904 *value = toV8(arrayBuffer, m_scriptState->context()->Global(), isolate());
1859 return !value->IsEmpty(); 1905 return !value->IsEmpty();
1860 } 1906 }
1861 1907
1862 bool SerializedScriptValueReader::readArrayBufferView(v8::Local<v8::Value>* valu e, ScriptValueDeserializer& deserializer) 1908 bool SerializedScriptValueReader::readArrayBufferView(v8::Local<v8::Value>* valu e, ScriptValueDeserializer& deserializer)
(...skipping 624 matching lines...) Expand 10 before | Expand all | Expand 10 after
2487 return false; 2533 return false;
2488 uint32_t objectReference = m_openCompositeReferenceStack[m_openCompositeRefe renceStack.size() - 1]; 2534 uint32_t objectReference = m_openCompositeReferenceStack[m_openCompositeRefe renceStack.size() - 1];
2489 m_openCompositeReferenceStack.shrink(m_openCompositeReferenceStack.size() - 1); 2535 m_openCompositeReferenceStack.shrink(m_openCompositeReferenceStack.size() - 1);
2490 if (objectReference >= m_objectPool.size()) 2536 if (objectReference >= m_objectPool.size())
2491 return false; 2537 return false;
2492 *object = m_objectPool[objectReference]; 2538 *object = m_objectPool[objectReference];
2493 return true; 2539 return true;
2494 } 2540 }
2495 2541
2496 } // namespace blink 2542 } // namespace blink
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698