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

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: android/windows 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 }
jsbell 2016/08/18 16:48:02 Nit: no {} necessary for single line ifs
Mircea Trofin 2016/08/18 17:34:08 Acknowledged.
Mircea Trofin 2016/08/18 23:02:59 Done.
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 v8::Local<v8::WasmCompiledModule> wasmModule = object.As<v8::WasmCompiledMod ule>();
1184 v8::WasmCompiledModule::SerializedModule data = wasmModule->Serialize();
jsbell 2016/08/18 16:48:02 Is this a copy, or does SerializedModule point int
Mircea Trofin 2016/08/18 17:34:08 SerializedModule points to existing bytes, at the
jsbell 2016/08/18 18:13:14 Staging is great! (I'm a fan of leaving TODOs in t
Mircea Trofin 2016/08/18 23:02:59 Done.
1185 m_writer.append(WasmModuleTag);
1186 m_writer.doWriteUint32(static_cast<uint32_t>(data.second));
1187 m_writer.append(data.first.get(), static_cast<int>(data.second));
1188 return nullptr;
1189 }
1190
1178 ScriptValueSerializer::StateBase* ScriptValueSerializer::writeAndGreyArrayBuffer (v8::Local<v8::Object> object, StateBase* next) 1191 ScriptValueSerializer::StateBase* ScriptValueSerializer::writeAndGreyArrayBuffer (v8::Local<v8::Object> object, StateBase* next)
1179 { 1192 {
1180 DOMArrayBuffer* arrayBuffer = V8ArrayBuffer::toImpl(object); 1193 DOMArrayBuffer* arrayBuffer = V8ArrayBuffer::toImpl(object);
1181 if (!arrayBuffer) 1194 if (!arrayBuffer)
1182 return nullptr; 1195 return nullptr;
1183 if (arrayBuffer->isNeutered()) 1196 if (arrayBuffer->isNeutered())
1184 return handleError(Status::DataCloneError, "An ArrayBuffer is neutered a nd could not be cloned.", next); 1197 return handleError(Status::DataCloneError, "An ArrayBuffer is neutered a nd could not be cloned.", next);
1185 1198
1186 uint32_t index; 1199 uint32_t index;
1187 if (m_transferredArrayBuffers.tryGet(object, &index)) { 1200 if (m_transferredArrayBuffers.tryGet(object, &index)) {
(...skipping 280 matching lines...) Expand 10 before | Expand all | Expand 10 after
1468 break; 1481 break;
1469 } 1482 }
1470 case ArrayBufferViewTag: { 1483 case ArrayBufferViewTag: {
1471 if (!m_version) 1484 if (!m_version)
1472 return false; 1485 return false;
1473 if (!readArrayBufferView(value, deserializer)) 1486 if (!readArrayBufferView(value, deserializer))
1474 return false; 1487 return false;
1475 deserializer.pushObjectReference(*value); 1488 deserializer.pushObjectReference(*value);
1476 break; 1489 break;
1477 } 1490 }
1491 case WasmModuleTag: {
1492 if (!readWasmCompiledModule(value))
1493 return false;
1494 deserializer.pushObjectReference(*value);
1495 break;
1496 }
1478 case ArrayBufferTag: { 1497 case ArrayBufferTag: {
1479 if (!m_version) 1498 if (!m_version)
1480 return false; 1499 return false;
1481 if (!readArrayBuffer(value)) 1500 if (!readArrayBuffer(value))
1482 return false; 1501 return false;
1483 deserializer.pushObjectReference(*value); 1502 deserializer.pushObjectReference(*value);
1484 break; 1503 break;
1485 } 1504 }
1486 case GenerateFreshObjectTag: { 1505 case GenerateFreshObjectTag: {
1487 if (!m_version) 1506 if (!m_version)
(...skipping 332 matching lines...) Expand 10 before | Expand all | Expand 10 after
1820 uint32_t byteLength; 1839 uint32_t byteLength;
1821 if (!doReadUint32(&byteLength)) 1840 if (!doReadUint32(&byteLength))
1822 return nullptr; 1841 return nullptr;
1823 if (m_position + byteLength > m_length) 1842 if (m_position + byteLength > m_length)
1824 return nullptr; 1843 return nullptr;
1825 const void* bufferStart = m_buffer + m_position; 1844 const void* bufferStart = m_buffer + m_position;
1826 m_position += byteLength; 1845 m_position += byteLength;
1827 return DOMArrayBuffer::create(bufferStart, byteLength); 1846 return DOMArrayBuffer::create(bufferStart, byteLength);
1828 } 1847 }
1829 1848
1849 bool SerializedScriptValueReader::readWasmCompiledModule(v8::Local<v8::Value>* v alue)
1850 {
1851 uint32_t size = 0;
1852 if (!doReadUint32(&size))
1853 return false;
1854 if (m_position + size > m_length)
1855 return false;
1856 const uint8_t* buf = m_buffer + m_position;
1857 v8::WasmCompiledModule::SerializedModule data = {
1858 std::unique_ptr<const uint8_t[]>(buf),
jsbell 2016/08/18 16:48:02 Uh... it seems like the SerializedModule construct
Mircea Trofin 2016/08/18 17:34:08 SerializedModule is just a pair used by both seria
jsbell 2016/08/18 18:13:14 I'd start with this, pending any better ideas.
Mircea Trofin 2016/08/18 23:02:59 Added a TODO, and will follow with the v8 CL + chr
1859 static_cast<size_t>(size)
1860 };
1861 v8::MaybeLocal<v8::WasmCompiledModule> retval =
1862 v8::WasmCompiledModule::Deserialize(isolate(), data);
jbroman 2016/08/18 16:59:09 If I read this correctly, every time the V8 versio
Mircea Trofin 2016/08/18 17:34:08 That's correct, the intent is to not support deser
jbroman 2016/08/18 17:55:50 Seems fine, as long as this is addressed before sh
jsbell 2016/08/18 18:13:14 I think what we settled on (in email conversations
Mircea Trofin 2016/08/18 23:02:59 Done.
1863 data.first.release();
1864 m_position += size;
1865 return retval.ToLocal(value);
1866 }
1867
1830 bool SerializedScriptValueReader::readArrayBuffer(v8::Local<v8::Value>* value) 1868 bool SerializedScriptValueReader::readArrayBuffer(v8::Local<v8::Value>* value)
1831 { 1869 {
1832 DOMArrayBuffer* arrayBuffer = doReadArrayBuffer(); 1870 DOMArrayBuffer* arrayBuffer = doReadArrayBuffer();
1833 if (!arrayBuffer) 1871 if (!arrayBuffer)
1834 return false; 1872 return false;
1835 *value = toV8(arrayBuffer, m_scriptState->context()->Global(), isolate()); 1873 *value = toV8(arrayBuffer, m_scriptState->context()->Global(), isolate());
1836 return !value->IsEmpty(); 1874 return !value->IsEmpty();
1837 } 1875 }
1838 1876
1839 bool SerializedScriptValueReader::readArrayBufferView(v8::Local<v8::Value>* valu e, ScriptValueDeserializer& deserializer) 1877 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; 2485 return false;
2448 uint32_t objectReference = m_openCompositeReferenceStack[m_openCompositeRefe renceStack.size() - 1]; 2486 uint32_t objectReference = m_openCompositeReferenceStack[m_openCompositeRefe renceStack.size() - 1];
2449 m_openCompositeReferenceStack.shrink(m_openCompositeReferenceStack.size() - 1); 2487 m_openCompositeReferenceStack.shrink(m_openCompositeReferenceStack.size() - 1);
2450 if (objectReference >= m_objectPool.size()) 2488 if (objectReference >= m_objectPool.size())
2451 return false; 2489 return false;
2452 *object = m_objectPool[objectReference]; 2490 *object = m_objectPool[objectReference];
2453 return true; 2491 return true;
2454 } 2492 }
2455 2493
2456 } // namespace blink 2494 } // namespace blink
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698