From c6e9bf0e8e475962e4ba7fcf6c0d4d5df97b8070 Mon Sep 17 00:00:00 2001
From: Bartosz Sosnowski <bartosz@janeasystems.com>
Date: Tue, 23 May 2017 18:25:03 +0200
Subject: [PATCH] deps: fix addons compilation with VS2013

VS2013 does not support defaulting move constructor and assignment
operator. This adds explicit definitions of those methods for two
classes.
This fix is required because we still support building addons with
VS2013 and the incompatibility is in v8.h.

Fixes: https://github.com/nodejs/node-v8/issues/4

PR-URL: https://github.com/nodejs/node/pull/13263
Reviewed-By: Gibson Fahnestock <gibfahn@gmail.com>
Reviewed-By: Ben Noordhuis <info@bnoordhuis.nl>
Reviewed-By: Franziska Hinkelmann <franziska.hinkelmann@gmail.com>
Reviewed-By: Myles Borins <myles.borins@gmail.com>
---
 deps/v8/include/v8.h | 12 ++++++++----
 deps/v8/src/api.cc   | 15 +++++++++++++++
 2 files changed, 23 insertions(+), 4 deletions(-)

diff --git a/deps/v8/include/v8.h b/deps/v8/include/v8.h
index ec2821226fd..f338b1157d3 100644
--- a/deps/v8/include/v8.h
+++ b/deps/v8/include/v8.h
@@ -4161,10 +4161,12 @@ class V8_EXPORT WasmCompiledModule : public Object {
   // supports move semantics, and does not support copy semantics.
   class TransferrableModule final {
    public:
-    TransferrableModule(TransferrableModule&& src) = default;
+    TransferrableModule(TransferrableModule&& src)
+        : compiled_code(std::move(src.compiled_code)),
+          wire_bytes(std::move(src.wire_bytes)) {}
     TransferrableModule(const TransferrableModule& src) = delete;
 
-    TransferrableModule& operator=(TransferrableModule&& src) = default;
+    TransferrableModule& operator=(TransferrableModule&& src);
     TransferrableModule& operator=(const TransferrableModule& src) = delete;
 
    private:
@@ -4277,9 +4279,11 @@ class V8_EXPORT WasmModuleObjectBuilder final {
   // Disable copy semantics *in this implementation*. We can choose to
   // relax this, albeit it's not clear why.
   WasmModuleObjectBuilder(const WasmModuleObjectBuilder&) = delete;
-  WasmModuleObjectBuilder(WasmModuleObjectBuilder&&) = default;
+  WasmModuleObjectBuilder(WasmModuleObjectBuilder&& src)
+      : received_buffers_(std::move(src.received_buffers_)),
+        total_size_(src.total_size_) {}
   WasmModuleObjectBuilder& operator=(const WasmModuleObjectBuilder&) = delete;
-  WasmModuleObjectBuilder& operator=(WasmModuleObjectBuilder&&) = default;
+  WasmModuleObjectBuilder& operator=(WasmModuleObjectBuilder&&);
 
   std::vector<Buffer> received_buffers_;
   size_t total_size_ = 0;
diff --git a/deps/v8/src/api.cc b/deps/v8/src/api.cc
index cd7ad868f1f..a2e26284ba1 100644
--- a/deps/v8/src/api.cc
+++ b/deps/v8/src/api.cc
@@ -7807,6 +7807,14 @@ Local<String> WasmCompiledModule::GetWasmWireBytes() {
   return Local<String>::Cast(Utils::ToLocal(wire_bytes));
 }
 
+WasmCompiledModule::TransferrableModule&
+WasmCompiledModule::TransferrableModule::operator=(
+    TransferrableModule&& src) {
+  compiled_code = std::move(src.compiled_code);
+  wire_bytes = std::move(src.wire_bytes);
+  return *this;
+}
+
 // Currently, wasm modules are bound, both to Isolate and to
 // the Context they were created in. The currently-supported means to
 // decontextualize and then re-contextualize a module is via
@@ -7978,6 +7986,13 @@ MaybeLocal<WasmCompiledModule> WasmModuleObjectBuilder::Finish() {
   return WasmCompiledModule::Compile(isolate_, wire_bytes.get(), total_size_);
 }
 
+WasmModuleObjectBuilder&
+WasmModuleObjectBuilder::operator=(WasmModuleObjectBuilder&& src) {
+  received_buffers_ = std::move(src.received_buffers_);
+  total_size_ = src.total_size_;
+  return *this;
+}
+
 // static
 v8::ArrayBuffer::Allocator* v8::ArrayBuffer::Allocator::NewDefaultAllocator() {
   return new ArrayBufferAllocator();