Chromium Code Reviews| OLD | NEW |
|---|---|
| 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 Loading... | |
| 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 Loading... | |
| 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 Loading... | |
| 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 Loading... | |
| 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 Loading... | |
| 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 |
| OLD | NEW |