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 |