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

Unified 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 side-by-side diff with in-line comments
Download patch
Index: third_party/WebKit/Source/bindings/core/v8/ScriptValueSerializer.cpp
diff --git a/third_party/WebKit/Source/bindings/core/v8/ScriptValueSerializer.cpp b/third_party/WebKit/Source/bindings/core/v8/ScriptValueSerializer.cpp
index 19db4e8aa83bb622822ceced935890c61c4afc1b..20d7dcb8c3507c5be130d176e7e35650c2c60220 100644
--- a/third_party/WebKit/Source/bindings/core/v8/ScriptValueSerializer.cpp
+++ b/third_party/WebKit/Source/bindings/core/v8/ScriptValueSerializer.cpp
@@ -891,6 +891,9 @@ ScriptValueSerializer::StateBase* ScriptValueSerializer::doSerializeObject(v8::L
return writeTransferredSharedArrayBuffer(object, index, next);
}
+ if (object->IsWebAssemblyCompiledModule())
+ return writeWasmCompiledModule(object, next);
+
// Transferable only objects
if (V8MessagePort::hasInstance(object, isolate())) {
uint32_t index;
@@ -1198,6 +1201,18 @@ ScriptValueSerializer::StateBase* ScriptValueSerializer::writeAndGreyArrayBuffer
return nullptr;
}
+ScriptValueSerializer::StateBase* ScriptValueSerializer::writeWasmCompiledModule(v8::Local<v8::Object> object, StateBase* next)
+{
+ CHECK(RuntimeEnabledFeatures::webAssemblySerializationEnabled());
+ // TODO (mtrofin): explore mechanism avoiding data copying / buffer resizing.
+ v8::Local<v8::WasmCompiledModule> wasmModule = object.As<v8::WasmCompiledModule>();
+ v8::WasmCompiledModule::SerializedModule data = wasmModule->Serialize();
+ m_writer.append(WasmModuleTag);
+ m_writer.doWriteUint32(static_cast<uint32_t>(data.second));
+ m_writer.append(data.first.get(), static_cast<int>(data.second));
+ return nullptr;
+}
+
ScriptValueSerializer::StateBase* ScriptValueSerializer::writeAndGreyArrayBuffer(v8::Local<v8::Object> object, StateBase* next)
{
DOMArrayBuffer* arrayBuffer = V8ArrayBuffer::toImpl(object);
@@ -1498,6 +1513,12 @@ bool SerializedScriptValueReader::readWithTag(SerializationTag tag, v8::Local<v8
deserializer.pushObjectReference(*value);
break;
}
+ case WasmModuleTag: {
+ if (!readWasmCompiledModule(value))
+ return false;
+ deserializer.pushObjectReference(*value);
+ break;
+ }
case ArrayBufferTag: {
if (!m_version)
return false;
@@ -1850,6 +1871,31 @@ DOMArrayBuffer* SerializedScriptValueReader::doReadArrayBuffer()
return DOMArrayBuffer::create(bufferStart, byteLength);
}
+bool SerializedScriptValueReader::readWasmCompiledModule(v8::Local<v8::Value>* value)
+{
+ CHECK(RuntimeEnabledFeatures::webAssemblySerializationEnabled());
+ uint32_t size = 0;
+ if (!doReadUint32(&size))
+ return false;
+ if (m_position + size > m_length)
+ return false;
+ const uint8_t* buf = m_buffer + m_position;
+ // TODO(mtrofin): simplify deserializer API. const uint8_t* + size_t should
+ // be sufficient.
+ v8::WasmCompiledModule::SerializedModule data = {
+ std::unique_ptr<const uint8_t[]>(buf),
+ static_cast<size_t>(size)
+ };
+ v8::MaybeLocal<v8::WasmCompiledModule> retval = v8::WasmCompiledModule::Deserialize(isolate(), data);
+ data.first.release();
+ m_position += size;
+
+ // TODO(mtrofin): right now, we'll return undefined if the deserialization
+ // fails, which is what may happen when v8's version changes. Update when
+ // spec settles. crbug.com/639090
+ return retval.ToLocal(value);
+}
+
bool SerializedScriptValueReader::readArrayBuffer(v8::Local<v8::Value>* value)
{
DOMArrayBuffer* arrayBuffer = doReadArrayBuffer();

Powered by Google App Engine
This is Rietveld 408576698