| Index: src/value-serializer.cc
|
| diff --git a/src/value-serializer.cc b/src/value-serializer.cc
|
| index 7b17275b014d5a9f210ad1d63e6fae134bddc840..603a43779827dd56b54337f5a5bf889f7bc67fb2 100644
|
| --- a/src/value-serializer.cc
|
| +++ b/src/value-serializer.cc
|
| @@ -126,6 +126,8 @@ enum class SerializationTag : uint8_t {
|
| // wasmWireByteLength:uint32_t, then raw data
|
| // compiledDataLength:uint32_t, then raw data
|
| kWasmModule = 'W',
|
| + // A wasm module object transfer. next value is its index.
|
| + kWasmModuleTransfer = 'w',
|
| // The delegate is responsible for processing all following data.
|
| // This "escapes" to whatever wire format the delegate chooses.
|
| kHostObject = '\\',
|
| @@ -803,6 +805,18 @@ Maybe<bool> ValueSerializer::WriteJSArrayBufferView(JSArrayBufferView* view) {
|
| }
|
|
|
| Maybe<bool> ValueSerializer::WriteWasmModule(Handle<JSObject> object) {
|
| + if (delegate_ != nullptr) {
|
| + Maybe<uint32_t> transfer_id = delegate_->GetWasmModuleTransferId(
|
| + reinterpret_cast<v8::Isolate*>(isolate_),
|
| + v8::Local<v8::WasmCompiledModule>::Cast(Utils::ToLocal(object)));
|
| + uint32_t id = 0;
|
| + if (transfer_id.To(&id)) {
|
| + WriteTag(SerializationTag::kWasmModuleTransfer);
|
| + WriteVarint<uint32_t>(id);
|
| + return Just(true);
|
| + }
|
| + }
|
| +
|
| Handle<WasmCompiledModule> compiled_part(
|
| WasmCompiledModule::cast(object->GetInternalField(0)), isolate_);
|
| WasmEncodingTag encoding_tag = WasmEncodingTag::kRawBytes;
|
| @@ -1150,6 +1164,8 @@ MaybeHandle<Object> ValueDeserializer::ReadObjectInternal() {
|
| }
|
| case SerializationTag::kWasmModule:
|
| return ReadWasmModule();
|
| + case SerializationTag::kWasmModuleTransfer:
|
| + return ReadWasmModuleTransfer();
|
| case SerializationTag::kHostObject:
|
| return ReadHostObject();
|
| default:
|
| @@ -1595,8 +1611,24 @@ MaybeHandle<JSArrayBufferView> ValueDeserializer::ReadJSArrayBufferView(
|
| return typed_array;
|
| }
|
|
|
| -MaybeHandle<JSObject> ValueDeserializer::ReadWasmModule() {
|
| +MaybeHandle<JSObject> ValueDeserializer::ReadWasmModuleTransfer() {
|
| if (FLAG_wasm_disable_structured_cloning) return MaybeHandle<JSObject>();
|
| + uint32_t index = 0;
|
| + v8::Local<v8::Value> module;
|
| + if (delegate_ != nullptr && ReadVarint<uint32_t>().To(&index) &&
|
| + delegate_
|
| + ->GetWasmModuleFromId(reinterpret_cast<v8::Isolate*>(isolate_), index)
|
| + .ToLocal(&module)) {
|
| + return Handle<JSObject>::cast(Utils::OpenHandle(*module));
|
| + } else {
|
| + return MaybeHandle<JSObject>();
|
| + }
|
| +}
|
| +
|
| +MaybeHandle<JSObject> ValueDeserializer::ReadWasmModule() {
|
| + if (FLAG_wasm_disable_structured_cloning || delegate_ == nullptr ||
|
| + !delegate_->AllowInlineWasm())
|
| + return MaybeHandle<JSObject>();
|
|
|
| Vector<const uint8_t> encoding_tag;
|
| if (!ReadRawBytes(sizeof(WasmEncodingTag)).To(&encoding_tag) ||
|
|
|