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

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: Setup isolate Created 4 years, 4 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 850 matching lines...) Expand 10 before | Expand all | Expand 10 after
861 return writeAndGreyArrayBuffer(object, next); 861 return writeAndGreyArrayBuffer(object, next);
862 } 862 }
863 if (object->IsSharedArrayBuffer()) { 863 if (object->IsSharedArrayBuffer()) {
864 uint32_t index; 864 uint32_t index;
865 if (!m_transferredArrayBuffers.tryGet(object, &index)) { 865 if (!m_transferredArrayBuffers.tryGet(object, &index)) {
866 return handleError(Status::DataCloneError, "A SharedArrayBuffer coul d not be cloned.", next); 866 return handleError(Status::DataCloneError, "A SharedArrayBuffer coul d not be cloned.", next);
867 } 867 }
868 return writeTransferredSharedArrayBuffer(object, index, next); 868 return writeTransferredSharedArrayBuffer(object, index, next);
869 } 869 }
870 870
871 if (object->IsWebAssemblyCompiledModule())
872 return writeWasmCompiledModule(object, next);
873
871 // Transferable only objects 874 // Transferable only objects
872 if (V8MessagePort::hasInstance(object, isolate())) { 875 if (V8MessagePort::hasInstance(object, isolate())) {
873 uint32_t index; 876 uint32_t index;
874 if (!m_transferredMessagePorts.tryGet(object, &index)) { 877 if (!m_transferredMessagePorts.tryGet(object, &index)) {
875 return handleError(Status::DataCloneError, "A MessagePort could not be cloned.", next); 878 return handleError(Status::DataCloneError, "A MessagePort could not be cloned.", next);
876 } 879 }
877 m_writer.writeTransferredMessagePort(index); 880 m_writer.writeTransferredMessagePort(index);
878 return nullptr; 881 return nullptr;
879 } 882 }
880 if (V8OffscreenCanvas::hasInstance(object, isolate())) { 883 if (V8OffscreenCanvas::hasInstance(object, isolate())) {
(...skipping 287 matching lines...) Expand 10 before | Expand all | Expand 10 after
1168 // 1171 //
1169 // We do need to grey the underlying buffer before we grey its view, however ; 1172 // We do need to grey the underlying buffer before we grey its view, however ;
1170 // ArrayBuffers may be shared, so they need to be given reference IDs, and a n 1173 // ArrayBuffers may be shared, so they need to be given reference IDs, and a n
1171 // ArrayBufferView cannot be constructed without a corresponding ArrayBuffer 1174 // ArrayBufferView cannot be constructed without a corresponding ArrayBuffer
1172 // (or without an additional tag that would allow us to do two-stage constru ction 1175 // (or without an additional tag that would allow us to do two-stage constru ction
1173 // like we do for Objects and Arrays). 1176 // like we do for Objects and Arrays).
1174 greyObject(object); 1177 greyObject(object);
1175 return nullptr; 1178 return nullptr;
1176 } 1179 }
1177 1180
1181 ScriptValueSerializer::StateBase* ScriptValueSerializer::writeWasmCompiledModule (v8::Local<v8::Object> object, StateBase* next)
1182 {
1183 // TODO (mtrofin): explore mechanism avoiding data copying / buffer resizing .
1184 v8::Local<v8::WasmCompiledModule> wasmModule = object.As<v8::WasmCompiledMod ule>();
1185 v8::WasmCompiledModule::SerializedModule data = wasmModule->Serialize();
1186 m_writer.append(WasmModuleTag);
1187 m_writer.doWriteUint32(static_cast<uint32_t>(data.second));
1188 m_writer.append(data.first.get(), static_cast<int>(data.second));
1189 return nullptr;
1190 }
1191
1178 ScriptValueSerializer::StateBase* ScriptValueSerializer::writeAndGreyArrayBuffer (v8::Local<v8::Object> object, StateBase* next) 1192 ScriptValueSerializer::StateBase* ScriptValueSerializer::writeAndGreyArrayBuffer (v8::Local<v8::Object> object, StateBase* next)
1179 { 1193 {
1180 DOMArrayBuffer* arrayBuffer = V8ArrayBuffer::toImpl(object); 1194 DOMArrayBuffer* arrayBuffer = V8ArrayBuffer::toImpl(object);
1181 if (!arrayBuffer) 1195 if (!arrayBuffer)
1182 return nullptr; 1196 return nullptr;
1183 if (arrayBuffer->isNeutered()) 1197 if (arrayBuffer->isNeutered())
1184 return handleError(Status::DataCloneError, "An ArrayBuffer is neutered a nd could not be cloned.", next); 1198 return handleError(Status::DataCloneError, "An ArrayBuffer is neutered a nd could not be cloned.", next);
1185 1199
1186 uint32_t index; 1200 uint32_t index;
1187 if (m_transferredArrayBuffers.tryGet(object, &index)) { 1201 if (m_transferredArrayBuffers.tryGet(object, &index)) {
(...skipping 280 matching lines...) Expand 10 before | Expand all | Expand 10 after
1468 break; 1482 break;
1469 } 1483 }
1470 case ArrayBufferViewTag: { 1484 case ArrayBufferViewTag: {
1471 if (!m_version) 1485 if (!m_version)
1472 return false; 1486 return false;
1473 if (!readArrayBufferView(value, deserializer)) 1487 if (!readArrayBufferView(value, deserializer))
1474 return false; 1488 return false;
1475 deserializer.pushObjectReference(*value); 1489 deserializer.pushObjectReference(*value);
1476 break; 1490 break;
1477 } 1491 }
1492 case WasmModuleTag: {
1493 if (!readWasmCompiledModule(value))
1494 return false;
1495 deserializer.pushObjectReference(*value);
1496 break;
1497 }
1478 case ArrayBufferTag: { 1498 case ArrayBufferTag: {
1479 if (!m_version) 1499 if (!m_version)
1480 return false; 1500 return false;
1481 if (!readArrayBuffer(value)) 1501 if (!readArrayBuffer(value))
1482 return false; 1502 return false;
1483 deserializer.pushObjectReference(*value); 1503 deserializer.pushObjectReference(*value);
1484 break; 1504 break;
1485 } 1505 }
1486 case GenerateFreshObjectTag: { 1506 case GenerateFreshObjectTag: {
1487 if (!m_version) 1507 if (!m_version)
(...skipping 332 matching lines...) Expand 10 before | Expand all | Expand 10 after
1820 uint32_t byteLength; 1840 uint32_t byteLength;
1821 if (!doReadUint32(&byteLength)) 1841 if (!doReadUint32(&byteLength))
1822 return nullptr; 1842 return nullptr;
1823 if (m_position + byteLength > m_length) 1843 if (m_position + byteLength > m_length)
1824 return nullptr; 1844 return nullptr;
1825 const void* bufferStart = m_buffer + m_position; 1845 const void* bufferStart = m_buffer + m_position;
1826 m_position += byteLength; 1846 m_position += byteLength;
1827 return DOMArrayBuffer::create(bufferStart, byteLength); 1847 return DOMArrayBuffer::create(bufferStart, byteLength);
1828 } 1848 }
1829 1849
1850 bool SerializedScriptValueReader::readWasmCompiledModule(v8::Local<v8::Value>* v alue)
1851 {
1852 uint32_t size = 0;
1853 if (!doReadUint32(&size))
1854 return false;
1855 if (m_position + size > m_length)
1856 return false;
1857 const uint8_t* buf = m_buffer + m_position;
1858 // TODO(mtrofin): simplify deserializer API. const uint8_t* + size_t should
1859 // be sufficient.
1860 v8::WasmCompiledModule::SerializedModule data = {
1861 std::unique_ptr<const uint8_t[]>(buf),
1862 static_cast<size_t>(size)
1863 };
1864 v8::MaybeLocal<v8::WasmCompiledModule> retval = v8::WasmCompiledModule::Dese rialize(isolate(), data);
1865 data.first.release();
1866 m_position += size;
1867
1868 // TODO(mtrofin): right now, we'll return undefined if the deserialization
1869 // fails, which is what may happen when v8's version changes. Update when
1870 // spec settles. crbug.com/639090
1871 return retval.ToLocal(value);
1872 }
1873
1830 bool SerializedScriptValueReader::readArrayBuffer(v8::Local<v8::Value>* value) 1874 bool SerializedScriptValueReader::readArrayBuffer(v8::Local<v8::Value>* value)
1831 { 1875 {
1832 DOMArrayBuffer* arrayBuffer = doReadArrayBuffer(); 1876 DOMArrayBuffer* arrayBuffer = doReadArrayBuffer();
1833 if (!arrayBuffer) 1877 if (!arrayBuffer)
1834 return false; 1878 return false;
1835 *value = toV8(arrayBuffer, m_scriptState->context()->Global(), isolate()); 1879 *value = toV8(arrayBuffer, m_scriptState->context()->Global(), isolate());
1836 return !value->IsEmpty(); 1880 return !value->IsEmpty();
1837 } 1881 }
1838 1882
1839 bool SerializedScriptValueReader::readArrayBufferView(v8::Local<v8::Value>* valu e, ScriptValueDeserializer& deserializer) 1883 bool SerializedScriptValueReader::readArrayBufferView(v8::Local<v8::Value>* valu e, ScriptValueDeserializer& deserializer)
(...skipping 607 matching lines...) Expand 10 before | Expand all | Expand 10 after
2447 return false; 2491 return false;
2448 uint32_t objectReference = m_openCompositeReferenceStack[m_openCompositeRefe renceStack.size() - 1]; 2492 uint32_t objectReference = m_openCompositeReferenceStack[m_openCompositeRefe renceStack.size() - 1];
2449 m_openCompositeReferenceStack.shrink(m_openCompositeReferenceStack.size() - 1); 2493 m_openCompositeReferenceStack.shrink(m_openCompositeReferenceStack.size() - 1);
2450 if (objectReference >= m_objectPool.size()) 2494 if (objectReference >= m_objectPool.size())
2451 return false; 2495 return false;
2452 *object = m_objectPool[objectReference]; 2496 *object = m_objectPool[objectReference];
2453 return true; 2497 return true;
2454 } 2498 }
2455 2499
2456 } // namespace blink 2500 } // namespace blink
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698