diff --git a/native_client/README.rst b/native_client/README.rst
index c8f5695c..3ae015d3 100644
--- a/native_client/README.rst
+++ b/native_client/README.rst
@@ -14,7 +14,7 @@ It is required to use our fork of TensorFlow since it includes fixes for common
If you'd like to build the language bindings or the decoder package, you'll also need:
-* `SWIG >= 3.0.12 `_
+* `SWIG >= 3.0.12 `_. If you intend to build NodeJS / ElectronJS bindings you will need a patched version of SWIG. Please refer to the matching section below.
* `node-pre-gyp `_ (for Node.JS bindings only)
Dependencies
@@ -105,37 +105,12 @@ Included are a set of generated Python bindings. After following the above build
The API mirrors the C++ API and is demonstrated in `client.py `_. Refer to `deepspeech.h `_ for documentation.
-Install Node.JS bindings
-^^^^^^^^^^^^^^^^^^^^^^^^
+Install NodeJS / ElectronJS bindings
+^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
-Unfortunately, JavaScript support on SWIG is a bit behind, and while there are
-pending patches proposed to upstream, it is not yet merged.
-
-You would need to patch SWIG, either from your distribution's setup, or do a
-local-patched build of SWIG.
-
-If you patch from a v3.0 SWIG, you will need to apply those:
-
-.. code-block::
-
- native_client/swig_node_v7x-v8x-v9x_0001.patch
- native_client/swig_node_v7x-v8x-v9x_0002.patch
- native_client/swig_node_v12_0001-Upgrade-SWIG-to-support-NodeJS-v12-V8-v7.6-v8-v7.8-r.patch
-
-If you patch from a v4.0 SWIG, you can just apply this:
-
-.. code-block::
-
- native_client/swig_node_v12_0001-Upgrade-SWIG-to-support-NodeJS-v12-V8-v7.6-v8-v7.8-r.patch
-
-On a Debian/Ubuntu system, you would need:
-
-.. code-block::
-
- for patch_file in native_client/swig_node_v7x-v8x-v9x_0001.patch native_client/swig_node_v7x-v8x-v9x_0002.patch native_client/swig_node_v12_0001-Upgrade-SWIG-to-support-NodeJS-v12-V8-v7.6-v8-v7.8-r.patch;
- do
- patch -d /usr/share/swig3.0/ -p2 < $patch_file
- done;
+Unfortunately, JavaScript support on SWIG is a bit behind, and while there are pending patches proposed to upstream, it is not yet merged.
+You should be able to build from `our fork `_, and you can find pre-built binaries on `TaskCluster `_ (please look for swig fork sha1).
+Extract the `ds-swig.tar.gz` to some place in your `$HOME`, then update `$PATH` accordingly. You might need to symlink `ds-swig` as `swig`, and you will have to `export SWIG_LIB=` so that it contains path to `share/swig//`.
After following the above build and installation instructions, the Node.JS bindings can be built:
diff --git a/native_client/swig_node_v10.12.patch b/native_client/swig_node_v10.12.patch
deleted file mode 100644
index 9fb51e39..00000000
--- a/native_client/swig_node_v10.12.patch
+++ /dev/null
@@ -1,203 +0,0 @@
-diff --git a/Lib/javascript/v8/javascripthelpers.swg b/Lib/javascript/v8/javascripthelpers.swg
-index 7b8a5ec237..80fbd7aa1a 100644
---- a/Lib/javascript/v8/javascripthelpers.swg
-+++ b/Lib/javascript/v8/javascripthelpers.swg
-@@ -93,7 +93,7 @@ SWIGRUNTIME void JS_veto_set_variable(v8::Local property, v8::Local sproperty;
- if (property->ToString(SWIGV8_CURRENT_CONTEXT()).ToLocal(&sproperty)) {
-- sproperty->WriteUtf8(buffer, 256);
-+ SWIGV8_WRITE_UTF8(sproperty, buffer, 256);
- res = sprintf(msg, "Tried to write read-only variable: %s.", buffer);
- }
- else {
-diff --git a/Lib/javascript/v8/javascriptprimtypes.swg b/Lib/javascript/v8/javascriptprimtypes.swg
-index c0055c48ee..f76be983b1 100644
---- a/Lib/javascript/v8/javascriptprimtypes.swg
-+++ b/Lib/javascript/v8/javascriptprimtypes.swg
-@@ -22,7 +22,7 @@ int SWIG_AsVal_dec(bool)(v8::Handle obj, bool *val)
- return SWIG_ERROR;
- }
-
-- if (val) *val = obj->BooleanValue();
-+ if (val) *val = SWIGV8_BOOLEAN_VALUE(obj);
- return SWIG_OK;
- }
- }
-@@ -44,7 +44,7 @@ int SWIG_AsVal_dec(int)(v8::Handle valRef, int* val)
- if (!valRef->IsNumber()) {
- return SWIG_TypeError;
- }
-- if(val) *val = valRef->IntegerValue();
-+ if(val) *val = SWIGV8_INTEGER_VALUE(valRef);
-
- return SWIG_OK;
- }
-@@ -68,7 +68,7 @@ int SWIG_AsVal_dec(long)(v8::Handle obj, long* val)
- if (!obj->IsNumber()) {
- return SWIG_TypeError;
- }
-- if(val) *val = (long) obj->IntegerValue();
-+ if(val) *val = (long) SWIGV8_INTEGER_VALUE(obj);
-
- return SWIG_OK;
- }
-@@ -95,7 +95,7 @@ int SWIG_AsVal_dec(unsigned long)(v8::Handle obj, unsigned long *val)
- return SWIG_TypeError;
- }
-
-- long longVal = (long) obj->NumberValue();
-+ long longVal = (long) SWIGV8_NUMBER_VALUE(obj);
-
- if(longVal < 0) {
- return SWIG_OverflowError;
-@@ -133,7 +133,7 @@ int SWIG_AsVal_dec(long long)(v8::Handle obj, long long* val)
- if (!obj->IsNumber()) {
- return SWIG_TypeError;
- }
-- if(val) *val = (long long) obj->IntegerValue();
-+ if(val) *val = (long long) SWIGV8_INTEGER_VALUE(obj);
-
- return SWIG_OK;
- }
-@@ -168,7 +168,7 @@ int SWIG_AsVal_dec(unsigned long long)(v8::Handle obj, unsigned long
- return SWIG_TypeError;
- }
-
-- long long longVal = (long long) obj->NumberValue();
-+ long long longVal = (long long) SWIGV8_NUMBER_VALUE(obj);
-
- if(longVal < 0) {
- return SWIG_OverflowError;
-@@ -198,7 +198,7 @@ int SWIG_AsVal_dec(double)(v8::Handle obj, double *val)
- if(!obj->IsNumber()) {
- return SWIG_TypeError;
- }
-- if(val) *val = obj->NumberValue();
-+ if(val) *val = SWIGV8_NUMBER_VALUE(obj);
-
- return SWIG_OK;
- }
-diff --git a/Lib/javascript/v8/javascriptrun.swg b/Lib/javascript/v8/javascriptrun.swg
-index 84bd4cc67e..2452f4040d 100644
---- a/Lib/javascript/v8/javascriptrun.swg
-+++ b/Lib/javascript/v8/javascriptrun.swg
-@@ -91,6 +91,32 @@ typedef v8::PropertyCallbackInfo SwigV8PropertyCallbackInfo;
- #define SWIGV8_SET_CLASS_TEMPL(class_templ, class) class_templ.Reset(v8::Isolate::GetCurrent(), class);
- #endif
-
-+#ifdef NODE_VERSION
-+#if NODE_VERSION_AT_LEAST(10, 12, 0)
-+#define SWIG_NODE_AT_LEAST_1012
-+#endif
-+#endif
-+
-+//Necessary to check Node.js version because V8 API changes are backported in Node.js
-+#if (defined(NODE_VERSION) && !defined(SWIG_NODE_AT_LEAST_1012)) || \
-+ (!defined(NODE_VERSION) && (V8_MAJOR_VERSION-0) < 7)
-+#define SWIGV8_TO_OBJECT(handle) (handle)->ToObject()
-+#define SWIGV8_TO_STRING(handle) (handle)->ToString()
-+#define SWIGV8_NUMBER_VALUE(handle) (handle)->NumberValue()
-+#define SWIGV8_INTEGER_VALUE(handle) (handle)->IntegerValue()
-+#define SWIGV8_BOOLEAN_VALUE(handle) (handle)->BooleanValue()
-+#define SWIGV8_WRITE_UTF8(handle, buffer, len) (handle)->WriteUtf8(buffer, len)
-+#define SWIGV8_UTF8_LENGTH(handle) (handle)->Utf8Length()
-+#else
-+#define SWIGV8_TO_OBJECT(handle) (handle)->ToObject(SWIGV8_CURRENT_CONTEXT()).ToLocalChecked()
-+#define SWIGV8_TO_STRING(handle) (handle)->ToString(SWIGV8_CURRENT_CONTEXT()).ToLocalChecked()
-+#define SWIGV8_NUMBER_VALUE(handle) (handle)->NumberValue(SWIGV8_CURRENT_CONTEXT()).ToChecked()
-+#define SWIGV8_INTEGER_VALUE(handle) (handle)->IntegerValue(SWIGV8_CURRENT_CONTEXT()).ToChecked()
-+#define SWIGV8_BOOLEAN_VALUE(handle) (handle)->BooleanValue(SWIGV8_CURRENT_CONTEXT()).ToChecked()
-+#define SWIGV8_WRITE_UTF8(handle, buffer, len) (handle)->WriteUtf8(v8::Isolate::GetCurrent(), buffer, len)
-+#define SWIGV8_UTF8_LENGTH(handle) (handle)->Utf8Length(v8::Isolate::GetCurrent())
-+#endif
-+
- /* ---------------------------------------------------------------------------
- * Error handling
- *
-@@ -258,7 +284,7 @@ SWIGRUNTIME int SWIG_V8_GetInstancePtr(v8::Handle valRef, void **ptr)
- if(!valRef->IsObject()) {
- return SWIG_TypeError;
- }
-- v8::Handle objRef = valRef->ToObject();
-+ v8::Handle objRef = SWIGV8_TO_OBJECT(valRef);
-
- if(objRef->InternalFieldCount() < 1) return SWIG_ERROR;
-
-@@ -352,7 +378,7 @@ SWIGRUNTIME int SWIG_V8_ConvertPtr(v8::Handle valRef, void **ptr, swi
- if(!valRef->IsObject()) {
- return SWIG_TypeError;
- }
-- v8::Handle objRef = valRef->ToObject();
-+ v8::Handle objRef = SWIGV8_TO_OBJECT(valRef);
- return SWIG_V8_ConvertInstancePtr(objRef, ptr, info, flags);
- }
-
-@@ -479,7 +505,7 @@ SWIGRUNTIMEINLINE
- int SwigV8Packed_Check(v8::Handle valRef) {
- SWIGV8_HANDLESCOPE();
-
-- v8::Handle objRef = valRef->ToObject();
-+ v8::Handle objRef = SWIGV8_TO_OBJECT(valRef);
- if(objRef->InternalFieldCount() < 1) return false;
- #if (V8_MAJOR_VERSION-0) < 5
- v8::Handle flag = objRef->GetHiddenValue(SWIGV8_STRING_NEW("__swig__packed_data__"));
-@@ -489,7 +515,7 @@ int SwigV8Packed_Check(v8::Handle valRef) {
- if (!objRef->GetPrivate(SWIGV8_CURRENT_CONTEXT(), privateKey).ToLocal(&flag))
- return false;
- #endif
-- return (flag->IsBoolean() && flag->BooleanValue());
-+ return (flag->IsBoolean() && SWIGV8_BOOLEAN_VALUE(flag));
- }
-
- SWIGRUNTIME
-@@ -499,7 +525,7 @@ swig_type_info *SwigV8Packed_UnpackData(v8::Handle valRef, void *ptr,
-
- SwigV8PackedData *sobj;
-
-- v8::Handle objRef = valRef->ToObject();
-+ v8::Handle objRef = SWIGV8_TO_OBJECT(valRef);
-
- #if (V8_MAJOR_VERSION-0) < 4 && (SWIG_V8_VERSION < 0x031511)
- v8::Handle cdataRef = objRef->GetInternalField(0);
-diff --git a/Lib/javascript/v8/javascriptruntime.swg b/Lib/javascript/v8/javascriptruntime.swg
-index 0e40593263..c78e04efbb 100644
---- a/Lib/javascript/v8/javascriptruntime.swg
-+++ b/Lib/javascript/v8/javascriptruntime.swg
-@@ -44,6 +44,8 @@
- #ifdef BUILDING_NODE_EXTENSION
- %insert("runtime") %{
- #include
-+//Older version of node.h does not include this
-+#include
- %}
- #endif
-
-diff --git a/Lib/javascript/v8/javascriptstrings.swg b/Lib/javascript/v8/javascriptstrings.swg
-index 65ba20e5a9..e767a6d662 100644
---- a/Lib/javascript/v8/javascriptstrings.swg
-+++ b/Lib/javascript/v8/javascriptstrings.swg
-@@ -7,11 +7,11 @@ SWIGINTERN int
- SWIG_AsCharPtrAndSize(v8::Handle valRef, char** cptr, size_t* psize, int *alloc)
- {
- if(valRef->IsString()) {
-- v8::Handle js_str = valRef->ToString();
-+ v8::Handle js_str = SWIGV8_TO_STRING(valRef);
-
-- size_t len = js_str->Utf8Length() + 1;
-+ size_t len = SWIGV8_UTF8_LENGTH(js_str) + 1;
- char* cstr = new char[len];
-- js_str->WriteUtf8(cstr, len);
-+ SWIGV8_WRITE_UTF8(js_str, cstr, len);
-
- if(alloc) *alloc = SWIG_NEWOBJ;
- if(psize) *psize = len;
-@@ -20,7 +20,7 @@ SWIG_AsCharPtrAndSize(v8::Handle valRef, char** cptr, size_t* psize,
- return SWIG_OK;
- } else {
- if(valRef->IsObject()) {
-- v8::Handle obj = valRef->ToObject();
-+ v8::Handle obj = SWIGV8_TO_OBJECT(valRef);
- // try if the object is a wrapped char[]
- swig_type_info* pchar_descriptor = SWIG_pchar_descriptor();
- if (pchar_descriptor) {
diff --git a/native_client/swig_node_v12_0001-Upgrade-SWIG-to-support-NodeJS-v12-V8-v7.6-v8-v7.8-r.patch b/native_client/swig_node_v12_0001-Upgrade-SWIG-to-support-NodeJS-v12-V8-v7.6-v8-v7.8-r.patch
deleted file mode 100644
index b37d3f62..00000000
--- a/native_client/swig_node_v12_0001-Upgrade-SWIG-to-support-NodeJS-v12-V8-v7.6-v8-v7.8-r.patch
+++ /dev/null
@@ -1,732 +0,0 @@
-From 7ae52d43e069c6c089dbd431d170493fd18499c2 Mon Sep 17 00:00:00 2001
-From: Alexandre Lissy
-Date: Thu, 25 Apr 2019 12:29:19 +0200
-Subject: [PATCH] Upgrade SWIG to support NodeJS v12 / V8 v7.6, v8 v7.8 runtime
-
----
- Lib/javascript/v8/javascriptcode.swg | 30 +++++----
- Lib/javascript/v8/javascriptcomplex.swg | 10 +--
- Lib/javascript/v8/javascripthelpers.swg | 26 +++++---
- Lib/javascript/v8/javascriptinit.swg | 4 +-
- Lib/javascript/v8/javascriptprimtypes.swg | 28 ++++----
- Lib/javascript/v8/javascriptrun.swg | 78 ++++++++++++++++-------
- Lib/javascript/v8/javascriptruntime.swg | 4 ++
- Lib/javascript/v8/javascriptstrings.swg | 10 +--
- Lib/javascript/v8/javascripttypemaps.swg | 2 +-
- Tools/javascript/v8_shell.cxx | 18 +++---
- 10 files changed, 129 insertions(+), 81 deletions(-)
-
-diff --git a/Lib/javascript/v8/javascriptcode.swg b/Lib/javascript/v8/javascriptcode.swg
-index c4aaf3db0..3fba197c0 100644
---- a/Lib/javascript/v8/javascriptcode.swg
-+++ b/Lib/javascript/v8/javascriptcode.swg
-@@ -11,7 +11,7 @@
- static SwigV8ReturnValue $jswrapper(const SwigV8Arguments &args) {
- SWIGV8_HANDLESCOPE();
-
-- v8::Handle self = args.Holder();
-+ v8::Local self = args.Holder();
- $jslocals
- if(args.Length() != $jsargcount) SWIG_exception_fail(SWIG_ERROR, "Illegal number of arguments for $jswrapper.");
- $jscode
-@@ -53,7 +53,7 @@ static SwigV8ReturnValue $jswrapper(const SwigV8Arguments &args) {
- SWIGV8_HANDLESCOPE();
-
- OverloadErrorHandler errorHandler;
-- v8::Handle self;
-+ v8::Local self;
-
- // switch all cases by means of series of if-returns.
- $jsdispatchcases
-@@ -78,7 +78,7 @@ fail:
- static SwigV8ReturnValue $jswrapper(const SwigV8Arguments &args, V8ErrorHandler &SWIGV8_ErrorHandler) {
- SWIGV8_HANDLESCOPE();
-
-- v8::Handle self = args.Holder();
-+ v8::Local self = args.Holder();
- $jslocals
- if(args.Length() != $jsargcount) SWIG_exception_fail(SWIG_ERROR, "Illegal number of arguments for $jswrapper.");
- $jscode
-@@ -226,7 +226,7 @@ static SwigV8ReturnValue $jswrapper(v8::Local property, const SwigV8Pr
- #endif
- SWIGV8_HANDLESCOPE();
-
-- v8::Handle jsresult;
-+ v8::Local jsresult;
- $jslocals
- $jscode
- SWIGV8_RETURN_INFO(jsresult, info);
-@@ -271,7 +271,7 @@ fail:
- static SwigV8ReturnValue $jswrapper(const SwigV8Arguments &args) {
- SWIGV8_HANDLESCOPE();
-
-- v8::Handle jsresult;
-+ v8::Local jsresult;
- $jslocals
- if(args.Length() != $jsargcount) SWIG_exception_fail(SWIG_ERROR, "Illegal number of arguments for $jswrapper.");
-
-@@ -296,7 +296,7 @@ fail:
- static SwigV8ReturnValue $jswrapper(const SwigV8Arguments &args) {
- SWIGV8_HANDLESCOPE();
-
-- v8::Handle jsresult;
-+ v8::Local jsresult;
- OverloadErrorHandler errorHandler;
- $jscode
-
-@@ -320,7 +320,7 @@ static SwigV8ReturnValue $jswrapper(const SwigV8Arguments &args, V8ErrorHandler
- {
- SWIGV8_HANDLESCOPE();
-
-- v8::Handle jsresult;
-+ v8::Local jsresult;
- $jslocals
- $jscode
- SWIGV8_RETURN(jsresult);
-@@ -374,7 +374,7 @@ fail:
- %fragment("jsv8_define_class_template", "templates")
- %{
- /* Name: $jsmangledname, Type: $jsmangledtype, Dtor: $jsdtor */
-- v8::Handle $jsmangledname_class = SWIGV8_CreateClassTemplate("$jsmangledname");
-+ v8::Local $jsmangledname_class = SWIGV8_CreateClassTemplate("$jsmangledname");
- SWIGV8_SET_CLASS_TEMPL($jsmangledname_clientData.class_templ, $jsmangledname_class);
- $jsmangledname_clientData.dtor = $jsdtor;
- if (SWIGTYPE_$jsmangledtype->clientdata == 0) {
-@@ -420,11 +420,15 @@ fail:
- %fragment("jsv8_create_class_instance", "templates")
- %{
- /* Class: $jsname ($jsmangledname) */
-- v8::Handle $jsmangledname_class_0 = SWIGV8_CreateClassTemplate("$jsname");
-+ v8::Local $jsmangledname_class_0 = SWIGV8_CreateClassTemplate("$jsname");
- $jsmangledname_class_0->SetCallHandler($jsctor);
- $jsmangledname_class_0->Inherit($jsmangledname_class);
-+#if (SWIG_V8_VERSION < 0x0705)
- $jsmangledname_class_0->SetHiddenPrototype(true);
-- v8::Handle $jsmangledname_obj = $jsmangledname_class_0->GetFunction();
-+ v8::Local $jsmangledname_obj = $jsmangledname_class_0->GetFunction();
-+#else
-+ v8::Local $jsmangledname_obj = $jsmangledname_class_0->GetFunction(SWIGV8_CURRENT_CONTEXT()).ToLocalChecked();
-+#endif
- %}
-
- /* -----------------------------------------------------------------------------
-@@ -435,7 +439,11 @@ fail:
- * ----------------------------------------------------------------------------- */
- %fragment("jsv8_register_class", "templates")
- %{
-+#if (SWIG_V8_VERSION < 0x0708)
- $jsparent_obj->Set(SWIGV8_SYMBOL_NEW("$jsname"), $jsmangledname_obj);
-+#else
-+ $jsparent_obj->Set(SWIGV8_CURRENT_CONTEXT(), SWIGV8_SYMBOL_NEW("$jsname"), $jsmangledname_obj);
-+#endif
- %}
-
- /* -----------------------------------------------------------------------------
-@@ -444,7 +452,7 @@ fail:
- * ----------------------------------------------------------------------------- */
- %fragment("jsv8_create_namespace", "templates")
- %{
-- v8::Handle $jsmangledname_obj = SWIGV8_OBJECT_NEW();
-+ v8::Local $jsmangledname_obj = SWIGV8_OBJECT_NEW();
- %}
-
- /* -----------------------------------------------------------------------------
-diff --git a/Lib/javascript/v8/javascriptcomplex.swg b/Lib/javascript/v8/javascriptcomplex.swg
-index d3b4aaffa..533e54813 100644
---- a/Lib/javascript/v8/javascriptcomplex.swg
-+++ b/Lib/javascript/v8/javascriptcomplex.swg
-@@ -12,7 +12,7 @@
- %fragment(SWIG_From_frag(Type),"header",
- fragment=SWIG_From_frag(double))
- {
--SWIGINTERNINLINE v8::Handle
-+SWIGINTERNINLINE v8::Local
- SWIG_From_dec(Type)(%ifcplusplus(const Type&, Type) c)
- {
- SWIGV8_HANDLESCOPE_ESC();
-@@ -32,12 +32,12 @@ SWIG_From_dec(Type)(%ifcplusplus(const Type&, Type) c)
- fragment=SWIG_AsVal_frag(double))
- {
- SWIGINTERN int
--SWIG_AsVal_dec(Type) (v8::Handle o, Type* val)
-+SWIG_AsVal_dec(Type) (v8::Local o, Type* val)
- {
- SWIGV8_HANDLESCOPE();
-
- if (o->IsArray()) {
-- v8::Handle array = v8::Handle::Cast(o);
-+ v8::Local array = v8::Local::Cast(o);
-
- if(array->Length() != 2) SWIG_Error(SWIG_TypeError, "Illegal argument for complex: must be array[2].");
- double re, im;
-@@ -74,12 +74,12 @@ SWIG_AsVal_dec(Type) (v8::Handle o, Type* val)
- %fragment(SWIG_AsVal_frag(Type),"header",
- fragment=SWIG_AsVal_frag(float)) {
- SWIGINTERN int
--SWIG_AsVal_dec(Type) (v8::Handle o, Type* val)
-+SWIG_AsVal_dec(Type) (v8::Local o, Type* val)
- {
- SWIGV8_HANDLESCOPE();
-
- if (o->IsArray()) {
-- v8::Handle array = v8::Handle::Cast(o);
-+ v8::Local array = v8::Local::Cast(o);
-
- if(array->Length() != 2) SWIG_Error(SWIG_TypeError, "Illegal argument for complex: must be array[2].");
- double re, im;
-diff --git a/Lib/javascript/v8/javascripthelpers.swg b/Lib/javascript/v8/javascripthelpers.swg
-index 80fbd7aa1..7b42e888e 100644
---- a/Lib/javascript/v8/javascripthelpers.swg
-+++ b/Lib/javascript/v8/javascripthelpers.swg
-@@ -21,19 +21,19 @@ typedef v8::PropertyCallbackInfo SwigV8PropertyCallbackInfoVoid;
- /**
- * Creates a class template for a class with specified initialization function.
- */
--SWIGRUNTIME v8::Handle SWIGV8_CreateClassTemplate(const char* symbol) {
-+SWIGRUNTIME v8::Local SWIGV8_CreateClassTemplate(const char* symbol) {
- SWIGV8_HANDLESCOPE_ESC();
-
- v8::Local class_templ = SWIGV8_FUNCTEMPLATE_NEW_VOID();
- class_templ->SetClassName(SWIGV8_SYMBOL_NEW(symbol));
-
-- v8::Handle inst_templ = class_templ->InstanceTemplate();
-+ v8::Local inst_templ = class_templ->InstanceTemplate();
- inst_templ->SetInternalFieldCount(1);
-
-- v8::Handle equals_templ = class_templ->PrototypeTemplate();
-+ v8::Local equals_templ = class_templ->PrototypeTemplate();
- equals_templ->Set(SWIGV8_SYMBOL_NEW("equals"), SWIGV8_FUNCTEMPLATE_NEW(_SWIGV8_wrap_equals));
-
-- v8::Handle cptr_templ = class_templ->PrototypeTemplate();
-+ v8::Local cptr_templ = class_templ->PrototypeTemplate();
- cptr_templ->Set(SWIGV8_SYMBOL_NEW("getCPtr"), SWIGV8_FUNCTEMPLATE_NEW(_wrap_getCPtr));
-
- SWIGV8_ESCAPE(class_templ);
-@@ -42,33 +42,39 @@ SWIGRUNTIME v8::Handle SWIGV8_CreateClassTemplate(const ch
- /**
- * Registers a class method with given name for a given class template.
- */
--SWIGRUNTIME void SWIGV8_AddMemberFunction(v8::Handle class_templ, const char* symbol,
-+SWIGRUNTIME void SWIGV8_AddMemberFunction(v8::Local class_templ, const char* symbol,
- SwigV8FunctionCallback _func) {
-- v8::Handle proto_templ = class_templ->PrototypeTemplate();
-+ v8::Local proto_templ = class_templ->PrototypeTemplate();
- proto_templ->Set(SWIGV8_SYMBOL_NEW(symbol), SWIGV8_FUNCTEMPLATE_NEW(_func));
- }
-
- /**
- * Registers a class property with given name for a given class template.
- */
--SWIGRUNTIME void SWIGV8_AddMemberVariable(v8::Handle class_templ, const char* symbol,
-+SWIGRUNTIME void SWIGV8_AddMemberVariable(v8::Local class_templ, const char* symbol,
- SwigV8AccessorGetterCallback getter, SwigV8AccessorSetterCallback setter) {
-- v8::Handle proto_templ = class_templ->InstanceTemplate();
-+ v8::Local proto_templ = class_templ->InstanceTemplate();
- proto_templ->SetAccessor(SWIGV8_SYMBOL_NEW(symbol), getter, setter);
- }
-
- /**
- * Registers a class method with given name for a given object.
- */
--SWIGRUNTIME void SWIGV8_AddStaticFunction(v8::Handle obj, const char* symbol,
-+SWIGRUNTIME void SWIGV8_AddStaticFunction(v8::Local obj, const char* symbol,
- const SwigV8FunctionCallback& _func) {
-+#if (SWIG_V8_VERSION < 0x0705)
- obj->Set(SWIGV8_SYMBOL_NEW(symbol), SWIGV8_FUNCTEMPLATE_NEW(_func)->GetFunction());
-+#elif (SWIG_V8_VERSION < 0x0708)
-+ obj->Set(SWIGV8_SYMBOL_NEW(symbol), SWIGV8_FUNCTEMPLATE_NEW(_func)->GetFunction(SWIGV8_CURRENT_CONTEXT()).ToLocalChecked());
-+#else
-+ obj->Set(SWIGV8_CURRENT_CONTEXT(), SWIGV8_SYMBOL_NEW(symbol), SWIGV8_FUNCTEMPLATE_NEW(_func)->GetFunction(SWIGV8_CURRENT_CONTEXT()).ToLocalChecked());
-+#endif
- }
-
- /**
- * Registers a class method with given name for a given object.
- */
--SWIGRUNTIME void SWIGV8_AddStaticVariable(v8::Handle obj, const char* symbol,
-+SWIGRUNTIME void SWIGV8_AddStaticVariable(v8::Local obj, const char* symbol,
- SwigV8AccessorGetterCallback getter, SwigV8AccessorSetterCallback setter) {
- #if (V8_MAJOR_VERSION-0) < 5
- obj->SetAccessor(SWIGV8_SYMBOL_NEW(symbol), getter, setter);
-diff --git a/Lib/javascript/v8/javascriptinit.swg b/Lib/javascript/v8/javascriptinit.swg
-index 8faf2dd8e..450aa9c6d 100644
---- a/Lib/javascript/v8/javascriptinit.swg
-+++ b/Lib/javascript/v8/javascriptinit.swg
-@@ -70,14 +70,14 @@ extern "C"
- #if (NODE_MODULE_VERSION < 0x000C)
- void SWIGV8_INIT (v8::Handle exports)
- #else
--void SWIGV8_INIT (v8::Handle exports, v8::Handle /*module*/)
-+void SWIGV8_INIT (v8::Local exports, v8::Local /*module*/)
- #endif
- {
- SWIG_InitializeModule(static_cast(&exports));
-
- SWIGV8_HANDLESCOPE();
-
-- v8::Handle exports_obj = exports;
-+ v8::Local exports_obj = exports;
- %}
-
-
-diff --git a/Lib/javascript/v8/javascriptprimtypes.swg b/Lib/javascript/v8/javascriptprimtypes.swg
-index f76be983b..24f5daf7c 100644
---- a/Lib/javascript/v8/javascriptprimtypes.swg
-+++ b/Lib/javascript/v8/javascriptprimtypes.swg
-@@ -6,7 +6,7 @@
-
- %fragment(SWIG_From_frag(bool),"header") {
- SWIGINTERNINLINE
--v8::Handle
-+v8::Local
- SWIG_From_dec(bool)(bool value)
- {
- return SWIGV8_BOOLEAN_NEW(value);
-@@ -16,7 +16,7 @@ SWIG_From_dec(bool)(bool value)
- %fragment(SWIG_AsVal_frag(bool),"header",
- fragment=SWIG_AsVal_frag(long)) {
- SWIGINTERN
--int SWIG_AsVal_dec(bool)(v8::Handle obj, bool *val)
-+int SWIG_AsVal_dec(bool)(v8::Local obj, bool *val)
- {
- if(!obj->IsBoolean()) {
- return SWIG_ERROR;
-@@ -31,7 +31,7 @@ int SWIG_AsVal_dec(bool)(v8::Handle obj, bool *val)
-
- %fragment(SWIG_From_frag(int),"header") {
- SWIGINTERNINLINE
--v8::Handle SWIG_From_dec(int)(int value)
-+v8::Local SWIG_From_dec(int)(int value)
- {
- return SWIGV8_INT32_NEW(value);
- }
-@@ -39,7 +39,7 @@ v8::Handle SWIG_From_dec(int)(int value)
-
- %fragment(SWIG_AsVal_frag(int),"header") {
- SWIGINTERN
--int SWIG_AsVal_dec(int)(v8::Handle valRef, int* val)
-+int SWIG_AsVal_dec(int)(v8::Local valRef, int* val)
- {
- if (!valRef->IsNumber()) {
- return SWIG_TypeError;
-@@ -54,7 +54,7 @@ int SWIG_AsVal_dec(int)(v8::Handle valRef, int* val)
-
- %fragment(SWIG_From_frag(long),"header") {
- SWIGINTERNINLINE
--v8::Handle SWIG_From_dec(long)(long value)
-+v8::Local SWIG_From_dec(long)(long value)
- {
- return SWIGV8_NUMBER_NEW(value);
- }
-@@ -63,7 +63,7 @@ v8::Handle SWIG_From_dec(long)(long value)
- %fragment(SWIG_AsVal_frag(long),"header",
- fragment="SWIG_CanCastAsInteger") {
- SWIGINTERN
--int SWIG_AsVal_dec(long)(v8::Handle obj, long* val)
-+int SWIG_AsVal_dec(long)(v8::Local obj, long* val)
- {
- if (!obj->IsNumber()) {
- return SWIG_TypeError;
-@@ -79,7 +79,7 @@ int SWIG_AsVal_dec(long)(v8::Handle obj, long* val)
- %fragment(SWIG_From_frag(unsigned long),"header",
- fragment=SWIG_From_frag(long)) {
- SWIGINTERNINLINE
--v8::Handle SWIG_From_dec(unsigned long)(unsigned long value)
-+v8::Local SWIG_From_dec(unsigned long)(unsigned long value)
- {
- return (value > LONG_MAX) ?
- SWIGV8_INTEGER_NEW_UNS(value) : SWIGV8_INTEGER_NEW(%numeric_cast(value,long));
-@@ -89,7 +89,7 @@ v8::Handle SWIG_From_dec(unsigned long)(unsigned long value)
- %fragment(SWIG_AsVal_frag(unsigned long),"header",
- fragment="SWIG_CanCastAsInteger") {
- SWIGINTERN
--int SWIG_AsVal_dec(unsigned long)(v8::Handle obj, unsigned long *val)
-+int SWIG_AsVal_dec(unsigned long)(v8::Local obj, unsigned long *val)
- {
- if(!obj->IsNumber()) {
- return SWIG_TypeError;
-@@ -115,7 +115,7 @@ int SWIG_AsVal_dec(unsigned long)(v8::Handle obj, unsigned long *val)
- fragment="SWIG_LongLongAvailable") {
- %#ifdef SWIG_LONG_LONG_AVAILABLE
- SWIGINTERNINLINE
--v8::Handle SWIG_From_dec(long long)(long long value)
-+v8::Local SWIG_From_dec(long long)(long long value)
- {
- return SWIGV8_NUMBER_NEW(value);
- }
-@@ -128,7 +128,7 @@ v8::Handle SWIG_From_dec(long long)(long long value)
- fragment="SWIG_LongLongAvailable") {
- %#ifdef SWIG_LONG_LONG_AVAILABLE
- SWIGINTERN
--int SWIG_AsVal_dec(long long)(v8::Handle obj, long long* val)
-+int SWIG_AsVal_dec(long long)(v8::Local obj, long long* val)
- {
- if (!obj->IsNumber()) {
- return SWIG_TypeError;
-@@ -148,7 +148,7 @@ int SWIG_AsVal_dec(long long)(v8::Handle obj, long long* val)
- fragment="SWIG_LongLongAvailable") {
- %#ifdef SWIG_LONG_LONG_AVAILABLE
- SWIGINTERNINLINE
--v8::Handle SWIG_From_dec(unsigned long long)(unsigned long long value)
-+v8::Local SWIG_From_dec(unsigned long long)(unsigned long long value)
- {
- return (value > LONG_MAX) ?
- SWIGV8_INTEGER_NEW_UNS(value) : SWIGV8_INTEGER_NEW(%numeric_cast(value,long));
-@@ -162,7 +162,7 @@ v8::Handle SWIG_From_dec(unsigned long long)(unsigned long long value
- fragment="SWIG_LongLongAvailable") {
- %#ifdef SWIG_LONG_LONG_AVAILABLE
- SWIGINTERN
--int SWIG_AsVal_dec(unsigned long long)(v8::Handle obj, unsigned long long *val)
-+int SWIG_AsVal_dec(unsigned long long)(v8::Local obj, unsigned long long *val)
- {
- if(!obj->IsNumber()) {
- return SWIG_TypeError;
-@@ -185,7 +185,7 @@ int SWIG_AsVal_dec(unsigned long long)(v8::Handle obj, unsigned long
-
- %fragment(SWIG_From_frag(double),"header") {
- SWIGINTERN
--v8::Handle SWIG_From_dec(double) (double val)
-+v8::Local SWIG_From_dec(double) (double val)
- {
- return SWIGV8_NUMBER_NEW(val);
- }
-@@ -193,7 +193,7 @@ v8::Handle SWIG_From_dec(double) (double val)
-
- %fragment(SWIG_AsVal_frag(double),"header") {
- SWIGINTERN
--int SWIG_AsVal_dec(double)(v8::Handle obj, double *val)
-+int SWIG_AsVal_dec(double)(v8::Local obj, double *val)
- {
- if(!obj->IsNumber()) {
- return SWIG_TypeError;
-diff --git a/Lib/javascript/v8/javascriptrun.swg b/Lib/javascript/v8/javascriptrun.swg
-index 2452f4040..78e7ea018 100644
---- a/Lib/javascript/v8/javascriptrun.swg
-+++ b/Lib/javascript/v8/javascriptrun.swg
-@@ -10,7 +10,11 @@
- #if (V8_MAJOR_VERSION-0) < 4 && (SWIG_V8_VERSION < 0x031803)
- #define SWIGV8_STRING_NEW2(cstr, len) v8::String::New(cstr, len)
- #else
-+#if (SWIG_V8_VERSION < 0x0706)
- #define SWIGV8_STRING_NEW2(cstr, len) v8::String::NewFromUtf8(v8::Isolate::GetCurrent(), cstr, v8::String::kNormalString, len)
-+#else
-+#define SWIGV8_STRING_NEW2(cstr, len) (v8::String::NewFromUtf8(v8::Isolate::GetCurrent(), cstr, v8::NewStringType::kNormal, len)).ToLocalChecked()
-+#endif
- #endif
-
- #if (V8_MAJOR_VERSION-0) < 4 && (SWIG_V8_VERSION < 0x031903)
-@@ -47,12 +51,18 @@ typedef v8::PropertyCallbackInfo SwigV8PropertyCallbackInfo;
- #define SWIGV8_THROW_EXCEPTION(err) v8::ThrowException(err)
- #define SWIGV8_STRING_NEW(str) v8::String::New(str)
- #define SWIGV8_SYMBOL_NEW(sym) v8::String::NewSymbol(sym)
--#else
-+#elif (SWIG_V8_VERSION < 0x0706)
- #define SWIGV8_ADJUST_MEMORY(size) v8::Isolate::GetCurrent()->AdjustAmountOfExternalAllocatedMemory(size)
- #define SWIGV8_CURRENT_CONTEXT() v8::Isolate::GetCurrent()->GetCurrentContext()
- #define SWIGV8_THROW_EXCEPTION(err) v8::Isolate::GetCurrent()->ThrowException(err)
- #define SWIGV8_STRING_NEW(str) v8::String::NewFromUtf8(v8::Isolate::GetCurrent(), str)
- #define SWIGV8_SYMBOL_NEW(sym) v8::String::NewFromUtf8(v8::Isolate::GetCurrent(), sym)
-+#else
-+#define SWIGV8_ADJUST_MEMORY(size) v8::Isolate::GetCurrent()->AdjustAmountOfExternalAllocatedMemory(size)
-+#define SWIGV8_CURRENT_CONTEXT() v8::Isolate::GetCurrent()->GetCurrentContext()
-+#define SWIGV8_THROW_EXCEPTION(err) v8::Isolate::GetCurrent()->ThrowException(err)
-+#define SWIGV8_STRING_NEW(str) (v8::String::NewFromUtf8(v8::Isolate::GetCurrent(), str)).ToLocalChecked()
-+#define SWIGV8_SYMBOL_NEW(sym) (v8::String::NewFromUtf8(v8::Isolate::GetCurrent(), sym)).ToLocalChecked()
- #endif
-
- #if (V8_MAJOR_VERSION-0) < 4 && (SWIG_V8_VERSION < 0x032318)
-@@ -107,7 +117,7 @@ typedef v8::PropertyCallbackInfo SwigV8PropertyCallbackInfo;
- #define SWIGV8_BOOLEAN_VALUE(handle) (handle)->BooleanValue()
- #define SWIGV8_WRITE_UTF8(handle, buffer, len) (handle)->WriteUtf8(buffer, len)
- #define SWIGV8_UTF8_LENGTH(handle) (handle)->Utf8Length()
--#else
-+#elif (SWIG_V8_VERSION < 0x0706)
- #define SWIGV8_TO_OBJECT(handle) (handle)->ToObject(SWIGV8_CURRENT_CONTEXT()).ToLocalChecked()
- #define SWIGV8_TO_STRING(handle) (handle)->ToString(SWIGV8_CURRENT_CONTEXT()).ToLocalChecked()
- #define SWIGV8_NUMBER_VALUE(handle) (handle)->NumberValue(SWIGV8_CURRENT_CONTEXT()).ToChecked()
-@@ -115,6 +125,14 @@ typedef v8::PropertyCallbackInfo SwigV8PropertyCallbackInfo;
- #define SWIGV8_BOOLEAN_VALUE(handle) (handle)->BooleanValue(SWIGV8_CURRENT_CONTEXT()).ToChecked()
- #define SWIGV8_WRITE_UTF8(handle, buffer, len) (handle)->WriteUtf8(v8::Isolate::GetCurrent(), buffer, len)
- #define SWIGV8_UTF8_LENGTH(handle) (handle)->Utf8Length(v8::Isolate::GetCurrent())
-+#else
-+#define SWIGV8_TO_OBJECT(handle) (handle)->ToObject(SWIGV8_CURRENT_CONTEXT()).ToLocalChecked()
-+#define SWIGV8_TO_STRING(handle) (handle)->ToString(SWIGV8_CURRENT_CONTEXT()).ToLocalChecked()
-+#define SWIGV8_NUMBER_VALUE(handle) (handle)->NumberValue(SWIGV8_CURRENT_CONTEXT()).ToChecked()
-+#define SWIGV8_INTEGER_VALUE(handle) (handle)->IntegerValue(SWIGV8_CURRENT_CONTEXT()).ToChecked()
-+#define SWIGV8_BOOLEAN_VALUE(handle) (handle)->BooleanValue(v8::Isolate::GetCurrent())
-+#define SWIGV8_WRITE_UTF8(handle, buffer, len) (handle)->WriteUtf8(v8::Isolate::GetCurrent(), buffer, len)
-+#define SWIGV8_UTF8_LENGTH(handle) (handle)->Utf8Length(v8::Isolate::GetCurrent())
- #endif
-
- /* ---------------------------------------------------------------------------
-@@ -163,7 +181,7 @@ public:
- SWIGV8_THROW_EXCEPTION(err);
- }
- }
-- v8::Handle err;
-+ v8::Local err;
- };
-
- /* ---------------------------------------------------------------------------
-@@ -228,13 +246,13 @@ public:
-
- SWIGRUNTIME v8::Persistent SWIGV8_SWIGTYPE_Proxy_class_templ;
-
--SWIGRUNTIME int SWIG_V8_ConvertInstancePtr(v8::Handle objRef, void **ptr, swig_type_info *info, int flags) {
-+SWIGRUNTIME int SWIG_V8_ConvertInstancePtr(v8::Local objRef, void **ptr, swig_type_info *info, int flags) {
- SWIGV8_HANDLESCOPE();
-
- if(objRef->InternalFieldCount() < 1) return SWIG_ERROR;
-
- #if (V8_MAJOR_VERSION-0) < 4 && (SWIG_V8_VERSION < 0x031511)
-- v8::Handle cdataRef = objRef->GetInternalField(0);
-+ v8::Local cdataRef = objRef->GetInternalField(0);
- SWIGV8_Proxy *cdata = static_cast(v8::External::Unwrap(cdataRef));
- #else
- SWIGV8_Proxy *cdata = static_cast(objRef->GetAlignedPointerFromInternalField(0));
-@@ -280,11 +298,11 @@ SWIGRUNTIME void SWIGV8_Proxy_DefaultDtor(const v8::WeakCallbackInfo valRef, void **ptr) {
-+SWIGRUNTIME int SWIG_V8_GetInstancePtr(v8::Local valRef, void **ptr) {
- if(!valRef->IsObject()) {
- return SWIG_TypeError;
- }
-- v8::Handle objRef = SWIGV8_TO_OBJECT(valRef);
-+ v8::Local objRef = SWIGV8_TO_OBJECT(valRef);
-
- if(objRef->InternalFieldCount() < 1) return SWIG_ERROR;
-
-@@ -304,7 +322,7 @@ SWIGRUNTIME int SWIG_V8_GetInstancePtr(v8::Handle valRef, void **ptr)
- return SWIG_OK;
- }
-
--SWIGRUNTIME void SWIGV8_SetPrivateData(v8::Handle obj, void *ptr, swig_type_info *info, int flags) {
-+SWIGRUNTIME void SWIGV8_SetPrivateData(v8::Local obj, void *ptr, swig_type_info *info, int flags) {
- SWIGV8_Proxy *cdata = new SWIGV8_Proxy();
- cdata->swigCObject = ptr;
- cdata->swigCMemOwn = (flags & SWIG_POINTER_OWN) ? 1 : 0;
-@@ -361,13 +379,15 @@ SWIGRUNTIME void SWIGV8_SetPrivateData(v8::Handle obj, void *ptr, sw
- cdata->handle.MarkIndependent();
- #elif (V8_MAJOR_VERSION-0) < 4 && (SWIG_V8_VERSION < 0x032100)
- cdata->handle.MarkIndependent(v8::Isolate::GetCurrent());
--#else
-+#elif (SWIG_V8_VERSION < 0x0706)
- cdata->handle.MarkIndependent();
-+// Looks like future versions do not require that anymore:
-+// https://monorail-prod.appspot.com/p/chromium/issues/detail?id=923361#c11
- #endif
-
- }
-
--SWIGRUNTIME int SWIG_V8_ConvertPtr(v8::Handle valRef, void **ptr, swig_type_info *info, int flags) {
-+SWIGRUNTIME int SWIG_V8_ConvertPtr(v8::Local valRef, void **ptr, swig_type_info *info, int flags) {
- SWIGV8_HANDLESCOPE();
-
- /* special case: JavaScript null => C NULL pointer */
-@@ -378,14 +398,14 @@ SWIGRUNTIME int SWIG_V8_ConvertPtr(v8::Handle valRef, void **ptr, swi
- if(!valRef->IsObject()) {
- return SWIG_TypeError;
- }
-- v8::Handle objRef = SWIGV8_TO_OBJECT(valRef);
-+ v8::Local objRef = SWIGV8_TO_OBJECT(valRef);
- return SWIG_V8_ConvertInstancePtr(objRef, ptr, info, flags);
- }
-
--SWIGRUNTIME v8::Handle SWIG_V8_NewPointerObj(void *ptr, swig_type_info *info, int flags) {
-+SWIGRUNTIME v8::Local SWIG_V8_NewPointerObj(void *ptr, swig_type_info *info, int flags) {
- SWIGV8_HANDLESCOPE_ESC();
-
-- v8::Handle class_templ;
-+ v8::Local class_templ;
-
- if (ptr == NULL) {
- #if (V8_MAJOR_VERSION-0) < 4 && (SWIG_V8_VERSION < 0x031903)
-@@ -412,8 +432,11 @@ SWIGRUNTIME v8::Handle SWIG_V8_NewPointerObj(void *ptr, swig_type_inf
- }
- #endif
-
--// v8::Handle result = class_templ->InstanceTemplate()->NewInstance();
-+#if (SWIG_V8_VERSION < 0x0705)
- v8::Local result = class_templ->InstanceTemplate()->NewInstance();
-+#else
-+ v8::Local result = class_templ->InstanceTemplate()->NewInstance(SWIGV8_CURRENT_CONTEXT()).ToLocalChecked();
-+#endif
- SWIGV8_SetPrivateData(result, ptr, info, flags);
-
- SWIGV8_ESCAPE(result);
-@@ -433,7 +456,7 @@ SWIGRUNTIME v8::Handle SWIG_V8_NewPointerObj(void *ptr, swig_type_inf
- SWIGRUNTIME SwigV8ReturnValue _SWIGV8_wrap_equals(const SwigV8Arguments &args) {
- SWIGV8_HANDLESCOPE();
-
-- v8::Handle jsresult;
-+ v8::Local jsresult;
- void *arg1 = (void *) 0 ;
- void *arg2 = (void *) 0 ;
- bool result;
-@@ -463,7 +486,7 @@ fail:
- SWIGRUNTIME SwigV8ReturnValue _wrap_getCPtr(const SwigV8Arguments &args) {
- SWIGV8_HANDLESCOPE();
-
-- v8::Handle jsresult;
-+ v8::Local jsresult;
- void *arg1 = (void *) 0 ;
- long result;
- int res1;
-@@ -502,10 +525,10 @@ public:
- };
-
- SWIGRUNTIMEINLINE
--int SwigV8Packed_Check(v8::Handle valRef) {
-+int SwigV8Packed_Check(v8::Local valRef) {
- SWIGV8_HANDLESCOPE();
-
-- v8::Handle objRef = SWIGV8_TO_OBJECT(valRef);
-+ v8::Local objRef = SWIGV8_TO_OBJECT(valRef);
- if(objRef->InternalFieldCount() < 1) return false;
- #if (V8_MAJOR_VERSION-0) < 5
- v8::Handle flag = objRef->GetHiddenValue(SWIGV8_STRING_NEW("__swig__packed_data__"));
-@@ -519,13 +542,13 @@ int SwigV8Packed_Check(v8::Handle valRef) {
- }
-
- SWIGRUNTIME
--swig_type_info *SwigV8Packed_UnpackData(v8::Handle valRef, void *ptr, size_t size) {
-+swig_type_info *SwigV8Packed_UnpackData(v8::Local valRef, void *ptr, size_t size) {
- if (SwigV8Packed_Check(valRef)) {
- SWIGV8_HANDLESCOPE();
-
- SwigV8PackedData *sobj;
-
-- v8::Handle objRef = SWIGV8_TO_OBJECT(valRef);
-+ v8::Local objRef = SWIGV8_TO_OBJECT(valRef);
-
- #if (V8_MAJOR_VERSION-0) < 4 && (SWIG_V8_VERSION < 0x031511)
- v8::Handle cdataRef = objRef->GetInternalField(0);
-@@ -542,7 +565,7 @@ swig_type_info *SwigV8Packed_UnpackData(v8::Handle valRef, void *ptr,
- }
-
- SWIGRUNTIME
--int SWIGV8_ConvertPacked(v8::Handle valRef, void *ptr, size_t sz, swig_type_info *ty) {
-+int SWIGV8_ConvertPacked(v8::Local valRef, void *ptr, size_t sz, swig_type_info *ty) {
- swig_type_info *to = SwigV8Packed_UnpackData(valRef, ptr, sz);
- if (!to) return SWIG_ERROR;
- if (ty) {
-@@ -590,7 +613,7 @@ SWIGRUNTIME void _wrap_SwigV8PackedData_delete(const v8::WeakCallbackInfo SWIGV8_NewPackedObj(void *data, size_t size, swig_type_info *type) {
-+v8::Local SWIGV8_NewPackedObj(void *data, size_t size, swig_type_info *type) {
- SWIGV8_HANDLESCOPE_ESC();
-
- SwigV8PackedData *cdata = new SwigV8PackedData(data, size, type);
-@@ -636,8 +659,10 @@ v8::Handle SWIGV8_NewPackedObj(void *data, size_t size, swig_type_inf
- cdata->handle.MarkIndependent();
- #elif (V8_MAJOR_VERSION-0) < 4 && (SWIG_V8_VERSION < 0x032100)
- cdata->handle.MarkIndependent(v8::Isolate::GetCurrent());
--#else
-+#elif (SWIG_V8_VERSION < 0x0706)
- cdata->handle.MarkIndependent();
-+// Looks like future versions do not require that anymore:
-+// https://monorail-prod.appspot.com/p/chromium/issues/detail?id=923361#c11
- #endif
-
- SWIGV8_ESCAPE(obj);
-@@ -657,7 +682,7 @@ SWIGRUNTIME
- #if (V8_MAJOR_VERSION-0) < 4 && (SWIG_V8_VERSION < 0x031903)
- v8::Handle SWIGV8_AppendOutput(v8::Handle result, v8::Handle obj) {
- #else
--v8::Handle SWIGV8_AppendOutput(v8::Local result, v8::Handle obj) {
-+v8::Local SWIGV8_AppendOutput(v8::Local result, v8::Local obj) {
- #endif
- SWIGV8_HANDLESCOPE_ESC();
-
-@@ -669,7 +694,12 @@ v8::Handle SWIGV8_AppendOutput(v8::Local result, v8::Handl
- #else
- v8::Local arr = v8::Local::Cast(result);
- #endif
-+
-+#if (SWIG_V8_VERSION < 0x0708)
- arr->Set(arr->Length(), obj);
-+#else
-+ arr->Set(SWIGV8_CURRENT_CONTEXT(), arr->Length(), obj);
-+#endif
-
- SWIGV8_ESCAPE(arr);
- }
-diff --git a/Lib/javascript/v8/javascriptruntime.swg b/Lib/javascript/v8/javascriptruntime.swg
-index c78e04efb..e7941d657 100644
---- a/Lib/javascript/v8/javascriptruntime.swg
-+++ b/Lib/javascript/v8/javascriptruntime.swg
-@@ -56,6 +56,10 @@
- %insert(runtime) %{
- #include
-
-+#if defined(V8_MAJOR_VERSION) && defined(V8_MINOR_VERSION)
-+#define SWIG_V8_VERSION (V8_MAJOR_VERSION * 256 + V8_MINOR_VERSION)
-+#endif
-+
- #include
- #include
- #include
-diff --git a/Lib/javascript/v8/javascriptstrings.swg b/Lib/javascript/v8/javascriptstrings.swg
-index e767a6d66..61a937fa5 100644
---- a/Lib/javascript/v8/javascriptstrings.swg
-+++ b/Lib/javascript/v8/javascriptstrings.swg
-@@ -4,10 +4,10 @@
- * ------------------------------------------------------------ */
- %fragment("SWIG_AsCharPtrAndSize", "header", fragment="SWIG_pchar_descriptor") {
- SWIGINTERN int
--SWIG_AsCharPtrAndSize(v8::Handle valRef, char** cptr, size_t* psize, int *alloc)
-+SWIG_AsCharPtrAndSize(v8::Local valRef, char** cptr, size_t* psize, int *alloc)
- {
- if(valRef->IsString()) {
-- v8::Handle js_str = SWIGV8_TO_STRING(valRef);
-+ v8::Local js_str = SWIGV8_TO_STRING(valRef);
-
- size_t len = SWIGV8_UTF8_LENGTH(js_str) + 1;
- char* cstr = new char[len];
-@@ -20,7 +20,7 @@ SWIG_AsCharPtrAndSize(v8::Handle valRef, char** cptr, size_t* psize,
- return SWIG_OK;
- } else {
- if(valRef->IsObject()) {
-- v8::Handle obj = SWIGV8_TO_OBJECT(valRef);
-+ v8::Local obj = SWIGV8_TO_OBJECT(valRef);
- // try if the object is a wrapped char[]
- swig_type_info* pchar_descriptor = SWIG_pchar_descriptor();
- if (pchar_descriptor) {
-@@ -41,7 +41,7 @@ SWIG_AsCharPtrAndSize(v8::Handle valRef, char** cptr, size_t* psize,
- }
-
- %fragment("SWIG_FromCharPtrAndSize","header",fragment="SWIG_pchar_descriptor") {
--SWIGINTERNINLINE v8::Handle
-+SWIGINTERNINLINE v8::Local
- SWIG_FromCharPtrAndSize(const char* carray, size_t size)
- {
- if (carray) {
-@@ -49,7 +49,7 @@ SWIG_FromCharPtrAndSize(const char* carray, size_t size)
- // TODO: handle extra long strings
- return SWIGV8_UNDEFINED();
- } else {
-- v8::Handle js_str = SWIGV8_STRING_NEW2(carray, size);
-+ v8::Local js_str = SWIGV8_STRING_NEW2(carray, size);
- return js_str;
- }
- } else {
-diff --git a/Lib/javascript/v8/javascripttypemaps.swg b/Lib/javascript/v8/javascripttypemaps.swg
-index 4601698e0..fbe7849cd 100644
---- a/Lib/javascript/v8/javascripttypemaps.swg
-+++ b/Lib/javascript/v8/javascripttypemaps.swg
-@@ -25,7 +25,7 @@
-
- /* Javascript types */
-
--#define SWIG_Object v8::Handle
-+#define SWIG_Object v8::Local
- #define VOID_Object SWIGV8_UNDEFINED()
-
- /* Overload of the output/constant/exception/dirout handling */
---
-2.20.1
-
diff --git a/native_client/swig_node_v7x-v8x-v9x_0001.patch b/native_client/swig_node_v7x-v8x-v9x_0001.patch
deleted file mode 100644
index 7ce26e95..00000000
--- a/native_client/swig_node_v7x-v8x-v9x_0001.patch
+++ /dev/null
@@ -1,325 +0,0 @@
-From f08d7a63a92a3ba89d97bdfcc206e1e1c4804c0f Mon Sep 17 00:00:00 2001
-From: Patrick Schneider
-Date: Thu, 13 Apr 2017 15:02:53 +0200
-Subject: [PATCH 1/2] Add Node 7.x aka V8 5.2+ support
-
-* Use WeakCallbackInfo instead of WeakCallbackData
-* Use GetPrivate instead of GetHiddenValue
-* Adopted new signature for SetWeak to support destructor calling
-* SetAccessor deprecation fixed
-* Proper version checks where applicable
----
- Lib/javascript/v8/javascriptcode.swg | 27 +++++++++++++++++-----
- Lib/javascript/v8/javascripthelpers.swg | 29 +++++++++++++++++++++---
- Lib/javascript/v8/javascriptinit.swg | 16 +++++++++++--
- Lib/javascript/v8/javascriptrun.swg | 40 ++++++++++++++++++++++++++++-----
- 4 files changed, 95 insertions(+), 17 deletions(-)
-
-diff --git a/Lib/javascript/v8/javascriptcode.swg b/Lib/javascript/v8/javascriptcode.swg
-index fb7d55c2ad..b8c5089816 100644
---- a/Lib/javascript/v8/javascriptcode.swg
-+++ b/Lib/javascript/v8/javascriptcode.swg
-@@ -133,10 +133,13 @@ static void $jswrapper(v8::Isolate *isolate, v8::Persistent object, v
- SWIGV8_Proxy *proxy = static_cast(parameter);
- #elif (V8_MAJOR_VERSION-0) < 4 && (SWIG_V8_VERSION < SWIGV8_SETWEAK_VERSION)
- static void $jswrapper(v8::Isolate *isolate, v8::Persistent *object, SWIGV8_Proxy *proxy) {
--#else
-+#elif (V8_MAJOR_VERSION-0) < 5 || (V8_MAJOR_VERSION == 5 && V8_MINOR_VERSION < 2)
- static void $jswrapper(const v8::WeakCallbackData &data) {
- v8::Local object = data.GetValue();
- SWIGV8_Proxy *proxy = data.GetParameter();
-+#else
-+ static void $jswrapper(const v8::WeakCallbackInfo &data) {
-+ SWIGV8_Proxy *proxy = data.GetParameter();
- #endif
-
- if(proxy->swigCMemOwn && proxy->swigCObject) {
-@@ -147,7 +150,9 @@ static void $jswrapper(const v8::WeakCallbackData &dat
- }
- delete proxy;
-
-+#if (V8_MAJOR_VERSION-0) < 5 || (V8_MAJOR_VERSION == 5 && V8_MINOR_VERSION < 2)
- object.Clear();
-+#endif
-
- #if (V8_MAJOR_VERSION-0) < 4 && (SWIG_V8_VERSION < 0x031710)
- object.Dispose();
-@@ -155,7 +160,7 @@ static void $jswrapper(const v8::WeakCallbackData &dat
- object.Dispose(isolate);
- #elif (V8_MAJOR_VERSION-0) < 4 && (SWIG_V8_VERSION < 0x032100)
- object->Dispose(isolate);
--#else
-+#elif (V8_MAJOR_VERSION-0) < 5 || (V8_MAJOR_VERSION == 5 && V8_MINOR_VERSION < 2)
- object->Dispose();
- #endif
- }
-@@ -177,10 +182,13 @@ static void $jswrapper(v8::Isolate *isolate, v8::Persistent object, v
- SWIGV8_Proxy *proxy = static_cast(parameter);
- #elif (V8_MAJOR_VERSION-0) < 4 && (SWIG_V8_VERSION < SWIGV8_SETWEAK_VERSION)
- static void $jswrapper(v8::Isolate *isolate, v8::Persistent< v8::Object> *object, SWIGV8_Proxy *proxy) {
--#else
-+#elif (V8_MAJOR_VERSION-0) < 5 || (V8_MAJOR_VERSION == 5 && V8_MINOR_VERSION < 2)
- static void $jswrapper(const v8::WeakCallbackData &data) {
- v8::Local object = data.GetValue();
- SWIGV8_Proxy *proxy = data.GetParameter();
-+#else
-+static void $jswrapper(const v8::WeakCallbackInfo &data) {
-+ SWIGV8_Proxy *proxy = data.GetParameter();
- #endif
-
- if(proxy->swigCMemOwn && proxy->swigCObject) {
-@@ -197,7 +205,7 @@ static void $jswrapper(const v8::WeakCallbackData &dat
- object->Dispose(isolate);
- #elif (V8_MAJOR_VERSION-0) < 4 && (SWIG_V8_VERSION < SWIGV8_SETWEAK_VERSION)
- object->Dispose();
--#else
-+#elif (V8_MAJOR_VERSION-0) < 5 || (V8_MAJOR_VERSION == 5 && V8_MINOR_VERSION < 2)
- object.Clear();
- #endif
- }
-@@ -211,7 +219,11 @@ static void $jswrapper(const v8::WeakCallbackData &dat
- * ----------------------------------------------------------------------------- */
- %fragment("js_getter", "templates")
- %{
-+#if (V8_MAJOR_VERSION-0) < 5 || (V8_MAJOR_VERSION == 5 && V8_MINOR_VERSION < 2)
- static SwigV8ReturnValue $jswrapper(v8::Local property, const SwigV8PropertyCallbackInfo &info) {
-+#else
-+static SwigV8ReturnValue $jswrapper(v8::Local