All of lore.kernel.org
 help / color / mirror / Atom feed
* [Buildroot] [PATCH] package/swig: enable support for Node.js >= 12.x
@ 2020-07-07  5:10 yegorslists at googlemail.com
  2020-07-07  6:32 ` Yegor Yefremov
  2020-07-07 20:26 ` Yann E. MORIN
  0 siblings, 2 replies; 6+ messages in thread
From: yegorslists at googlemail.com @ 2020-07-07  5:10 UTC (permalink / raw)
  To: buildroot

From: Yegor Yefremov <yegorslists@googlemail.com>

Recent Node.js versions have removed some depreciated API calls,
that swig still relies on. Patches taken from this PR [1] fix
this issue.

[1] https://github.com/swig/swig/pull/1746

Signed-off-by: Yegor Yefremov <yegorslists@googlemail.com>
---
 ...-to-support-both-Handle-and-Local-ty.patch |  53 ++
 ...ith-Local-depending-on-Node.js-versi.patch | 649 ++++++++++++++++++
 .../0003-Add-support-for-Node.js-v12.patch    | 207 ++++++
 3 files changed, 909 insertions(+)
 create mode 100644 package/swig/0001-Introduce-macros-to-support-both-Handle-and-Local-ty.patch
 create mode 100644 package/swig/0002-Replace-Handle-with-Local-depending-on-Node.js-versi.patch
 create mode 100644 package/swig/0003-Add-support-for-Node.js-v12.patch

diff --git a/package/swig/0001-Introduce-macros-to-support-both-Handle-and-Local-ty.patch b/package/swig/0001-Introduce-macros-to-support-both-Handle-and-Local-ty.patch
new file mode 100644
index 0000000000..f52d599723
--- /dev/null
+++ b/package/swig/0001-Introduce-macros-to-support-both-Handle-and-Local-ty.patch
@@ -0,0 +1,53 @@
+From a40f8b18b31cc882c8fb9cf8b6b3fd597adc1745 Mon Sep 17 00:00:00 2001
+From: Tom Leavy <tom@wickr.com>
+Date: Wed, 25 Mar 2020 17:10:51 -0400
+Subject: [PATCH] Introduce macros to support both Handle and Local types
+
+The old Node.js versions don't treat v8::Handle and v8::Local as
+the same types, and the latest versions (v12 and newer) have
+removed v8::Handle at all.
+
+This patch introduces the following macros that use v8::Handle or
+v8::Local depending on the selected Node.js version:
+
+- SWIGV8_ARRAY
+- SWIGV8_FUNCTION_TEMPLATE
+- SWIGV8_OBJECT
+- SWIGV8_OBJECT_TEMPLATE
+- SWIGV8_VALUE
+
+Signed-off-by: Yegor Yefremov <yegorslists@googlemail.com>
+---
+ Lib/javascript/v8/javascriptrun.swg | 10 ++++++++++
+ 1 file changed, 10 insertions(+)
+
+diff --git a/Lib/javascript/v8/javascriptrun.swg b/Lib/javascript/v8/javascriptrun.swg
+index 2452f4040..cf3215334 100644
+--- a/Lib/javascript/v8/javascriptrun.swg
++++ b/Lib/javascript/v8/javascriptrun.swg
+@@ -67,6 +67,11 @@ typedef v8::PropertyCallbackInfo<v8::Value> SwigV8PropertyCallbackInfo;
+ #define SWIGV8_NUMBER_NEW(num) v8::Number::New(num)
+ #define SWIGV8_OBJECT_NEW() v8::Object::New()
+ #define SWIGV8_UNDEFINED() v8::Undefined()
++#define SWIGV8_ARRAY v8::Handle<v8::Array>
++#define SWIGV8_FUNCTION_TEMPLATE v8::Handle<v8::FunctionTemplate>
++#define SWIGV8_OBJECT v8::Handle<v8::Object>
++#define SWIGV8_OBJECT_TEMPLATE v8::Handle<v8::ObjectTemplate>
++#define SWIGV8_VALUE v8::Handle<v8::Value>
+ #define SWIGV8_NULL() v8::Null()
+ #else
+ #define SWIGV8_ARRAY_NEW() v8::Array::New(v8::Isolate::GetCurrent())
+@@ -80,6 +85,11 @@ typedef v8::PropertyCallbackInfo<v8::Value> SwigV8PropertyCallbackInfo;
+ #define SWIGV8_NUMBER_NEW(num) v8::Number::New(v8::Isolate::GetCurrent(), num)
+ #define SWIGV8_OBJECT_NEW() v8::Object::New(v8::Isolate::GetCurrent())
+ #define SWIGV8_UNDEFINED() v8::Undefined(v8::Isolate::GetCurrent())
++#define SWIGV8_ARRAY v8::Local<v8::Array>
++#define SWIGV8_FUNCTION_TEMPLATE v8::Local<v8::FunctionTemplate>
++#define SWIGV8_OBJECT v8::Local<v8::Object>
++#define SWIGV8_OBJECT_TEMPLATE v8::Local<v8::ObjectTemplate>
++#define SWIGV8_VALUE v8::Local<v8::Value>
+ #define SWIGV8_NULL() v8::Null(v8::Isolate::GetCurrent())
+ #endif
+
+--
+2.17.0
diff --git a/package/swig/0002-Replace-Handle-with-Local-depending-on-Node.js-versi.patch b/package/swig/0002-Replace-Handle-with-Local-depending-on-Node.js-versi.patch
new file mode 100644
index 0000000000..86b7b04c6c
--- /dev/null
+++ b/package/swig/0002-Replace-Handle-with-Local-depending-on-Node.js-versi.patch
@@ -0,0 +1,649 @@
+From 9f245da9b6dd4c9e874fa1fd1a576ea550983dbe Mon Sep 17 00:00:00 2001
+From: Yegor Yefremov <yegorslists@googlemail.com>
+Date: Wed, 26 Feb 2020 15:55:18 +0100
+Subject: [PATCH] Replace Handle with Local depending on Node.js version
+
+Use newly introduced macros like SWIGV8_VALUE to use v8::Handle or
+v8::Local depending on the selected Node.js version where possible.
+
+Signed-off-by: Yegor Yefremov <yegorslists@googlemail.com>
+---
+ Examples/javascript/native/example.i      |  2 +-
+ Examples/test-suite/native_directive.i    |  2 +-
+ Lib/javascript/v8/javascriptcode.swg      | 24 +++++++-----
+ Lib/javascript/v8/javascriptcomplex.swg   | 10 ++---
+ Lib/javascript/v8/javascripthelpers.swg   | 21 +++++-----
+ Lib/javascript/v8/javascriptinit.swg      |  6 +--
+ Lib/javascript/v8/javascriptprimtypes.swg | 29 +++++++-------
+ Lib/javascript/v8/javascriptrun.swg       | 48 ++++++++++-------------
+ Lib/javascript/v8/javascriptstrings.swg   | 14 +++++--
+ Lib/javascript/v8/javascripttypemaps.swg  |  2 +-
+ 10 files changed, 82 insertions(+), 76 deletions(-)
+
+diff --git a/Examples/javascript/native/example.i b/Examples/javascript/native/example.i
+index 8c6160060..a9ca094a7 100644
+--- a/Examples/javascript/native/example.i
++++ b/Examples/javascript/native/example.i
+@@ -15,7 +15,7 @@ int placeholder() { return 0; }
+     static SwigV8ReturnValue JavaScript_do_work(const SwigV8Arguments &args) {
+         SWIGV8_HANDLESCOPE();
+         const int MY_MAGIC_NUMBER = 5;
+-        v8::Handle<v8::Value> jsresult =
++        SWIGV8_VALUE jsresult =
+             SWIG_From_int(static_cast< int >(MY_MAGIC_NUMBER));
+         if (args.Length() != 0)
+             SWIG_exception_fail(SWIG_ERROR, "Illegal number of arguments.");
+diff --git a/Examples/test-suite/native_directive.i b/Examples/test-suite/native_directive.i
+index 9ae76e0b7..3d4858032 100644
+--- a/Examples/test-suite/native_directive.i
++++ b/Examples/test-suite/native_directive.i
+@@ -53,7 +53,7 @@ extern "C" JNIEXPORT jint JNICALL Java_native_1directive_native_1directiveJNI_Co
+
+ static SwigV8ReturnValue JavaScript_alpha_count(const SwigV8Arguments &args) {
+   SWIGV8_HANDLESCOPE();
+-  v8::Handle<v8::Value> jsresult;
++  SWIGV8_VALUE jsresult;
+   char *arg1 = (char *)0;
+   int res1;
+   char *buf1 = 0;
+diff --git a/Lib/javascript/v8/javascriptcode.swg b/Lib/javascript/v8/javascriptcode.swg
+index c4aaf3db0..65e0d39d1 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<v8::Object> self = args.Holder();
++  SWIGV8_OBJECT 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<v8::Value> self;
++  SWIGV8_VALUE 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<v8::Object> self = args.Holder();
++  SWIGV8_OBJECT 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<v8::Name> property, const SwigV8Pr
+ #endif
+   SWIGV8_HANDLESCOPE();
+
+-  v8::Handle<v8::Value> jsresult;
++  SWIGV8_VALUE jsresult;
+   $jslocals
+   $jscode
+   SWIGV8_RETURN_INFO(jsresult, info);
+@@ -271,7 +271,7 @@ fail:
+ static SwigV8ReturnValue $jswrapper(const SwigV8Arguments &args) {
+   SWIGV8_HANDLESCOPE();
+
+-  v8::Handle<v8::Value> jsresult;
++  SWIGV8_VALUE 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<v8::Value> jsresult;
++  SWIGV8_VALUE jsresult;
+   OverloadErrorHandler errorHandler;
+   $jscode
+
+@@ -320,7 +320,7 @@ static SwigV8ReturnValue $jswrapper(const SwigV8Arguments &args, V8ErrorHandler
+ {
+   SWIGV8_HANDLESCOPE();
+
+-  v8::Handle<v8::Value> jsresult;
++  SWIGV8_VALUE 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<v8::FunctionTemplate> $jsmangledname_class = SWIGV8_CreateClassTemplate("$jsmangledname");
++  SWIGV8_FUNCTION_TEMPLATE $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<v8::FunctionTemplate> $jsmangledname_class_0 = SWIGV8_CreateClassTemplate("$jsname");
++  SWIGV8_FUNCTION_TEMPLATE $jsmangledname_class_0 = SWIGV8_CreateClassTemplate("$jsname");
+   $jsmangledname_class_0->SetCallHandler($jsctor);
+   $jsmangledname_class_0->Inherit($jsmangledname_class);
+   $jsmangledname_class_0->SetHiddenPrototype(true);
++#if (V8_MAJOR_VERSION-0) < 4 && (SWIG_V8_VERSION < 0x031903)
+   v8::Handle<v8::Object> $jsmangledname_obj = $jsmangledname_class_0->GetFunction();
++#else
++  v8::Local<v8::Object> $jsmangledname_obj = $jsmangledname_class_0->GetFunction();
++#endif
+ %}
+
+ /* -----------------------------------------------------------------------------
+@@ -444,7 +448,7 @@ fail:
+  * ----------------------------------------------------------------------------- */
+ %fragment("jsv8_create_namespace", "templates")
+ %{
+-  v8::Handle<v8::Object> $jsmangledname_obj = SWIGV8_OBJECT_NEW();
++  SWIGV8_OBJECT $jsmangledname_obj = SWIGV8_OBJECT_NEW();
+ %}
+
+ /* -----------------------------------------------------------------------------
+diff --git a/Lib/javascript/v8/javascriptcomplex.swg b/Lib/javascript/v8/javascriptcomplex.swg
+index d3b4aaffa..b894d7389 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<v8::Value>
++SWIGINTERNINLINE SWIGV8_VALUE
+ 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<v8::Value> o, Type* val)
++SWIG_AsVal_dec(Type) (SWIGV8_VALUE o, Type* val)
+ {
+   SWIGV8_HANDLESCOPE();
+
+   if (o->IsArray()) {
+-    v8::Handle<v8::Array> array = v8::Handle<v8::Array>::Cast(o);
++    SWIGV8_ARRAY array = SWIGV8_ARRAY::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<v8::Value> o, Type* val)
+ %fragment(SWIG_AsVal_frag(Type),"header",
+           fragment=SWIG_AsVal_frag(float)) {
+ SWIGINTERN int
+-SWIG_AsVal_dec(Type) (v8::Handle<v8::Value> o, Type* val)
++SWIG_AsVal_dec(Type) (SWIGV8_VALUE o, Type* val)
+ {
+   SWIGV8_HANDLESCOPE();
+
+   if (o->IsArray()) {
+-    v8::Handle<v8::Array> array = v8::Handle<v8::Array>::Cast(o);
++    SWIGV8_ARRAY array = SWIGV8_ARRAY::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..465d3ee48 100644
+--- a/Lib/javascript/v8/javascripthelpers.swg
++++ b/Lib/javascript/v8/javascripthelpers.swg
+@@ -21,19 +21,19 @@ typedef v8::PropertyCallbackInfo<void>  SwigV8PropertyCallbackInfoVoid;
+ /**
+  * Creates a class template for a class with specified initialization function.
+  */
+-SWIGRUNTIME v8::Handle<v8::FunctionTemplate> SWIGV8_CreateClassTemplate(const char* symbol) {
++SWIGRUNTIME SWIGV8_FUNCTION_TEMPLATE SWIGV8_CreateClassTemplate(const char* symbol) {
+     SWIGV8_HANDLESCOPE_ESC();
+
+     v8::Local<v8::FunctionTemplate> class_templ = SWIGV8_FUNCTEMPLATE_NEW_VOID();
+     class_templ->SetClassName(SWIGV8_SYMBOL_NEW(symbol));
+
+-    v8::Handle<v8::ObjectTemplate> inst_templ = class_templ->InstanceTemplate();
++    SWIGV8_OBJECT_TEMPLATE inst_templ = class_templ->InstanceTemplate();
+     inst_templ->SetInternalFieldCount(1);
+
+-    v8::Handle<v8::ObjectTemplate> equals_templ = class_templ->PrototypeTemplate();
++    SWIGV8_OBJECT_TEMPLATE equals_templ = class_templ->PrototypeTemplate();
+     equals_templ->Set(SWIGV8_SYMBOL_NEW("equals"), SWIGV8_FUNCTEMPLATE_NEW(_SWIGV8_wrap_equals));
+
+-    v8::Handle<v8::ObjectTemplate> cptr_templ = class_templ->PrototypeTemplate();
++    SWIGV8_OBJECT_TEMPLATE cptr_templ = class_templ->PrototypeTemplate();
+     cptr_templ->Set(SWIGV8_SYMBOL_NEW("getCPtr"), SWIGV8_FUNCTEMPLATE_NEW(_wrap_getCPtr));
+
+     SWIGV8_ESCAPE(class_templ);
+@@ -42,33 +42,34 @@ SWIGRUNTIME v8::Handle<v8::FunctionTemplate> SWIGV8_CreateClassTemplate(const ch
+ /**
+  * Registers a class method with given name for a given class template.
+  */
+-SWIGRUNTIME void SWIGV8_AddMemberFunction(v8::Handle<v8::FunctionTemplate> class_templ, const char* symbol,
++SWIGRUNTIME void SWIGV8_AddMemberFunction(SWIGV8_FUNCTION_TEMPLATE class_templ, const char* symbol,
+   SwigV8FunctionCallback _func) {
+-    v8::Handle<v8::ObjectTemplate> proto_templ = class_templ->PrototypeTemplate();
++    SWIGV8_OBJECT_TEMPLATE 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<v8::FunctionTemplate> class_templ, const char* symbol,
++SWIGRUNTIME void SWIGV8_AddMemberVariable(SWIGV8_FUNCTION_TEMPLATE class_templ, const char* symbol,
+   SwigV8AccessorGetterCallback getter, SwigV8AccessorSetterCallback setter) {
+-  v8::Handle<v8::ObjectTemplate> proto_templ = class_templ->InstanceTemplate();
++  SWIGV8_OBJECT_TEMPLATE 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<v8::Object> obj, const char* symbol,
++SWIGRUNTIME void SWIGV8_AddStaticFunction(SWIGV8_OBJECT obj, const char* symbol,
+   const SwigV8FunctionCallback& _func) {
++#if (V8_MAJOR_VERSION-0) < 4 && (SWIG_V8_VERSION < 0x031903) || (SWIG_V8_VERSION < 0x0705)
+   obj->Set(SWIGV8_SYMBOL_NEW(symbol), SWIGV8_FUNCTEMPLATE_NEW(_func)->GetFunction());
+ }
+
+ /**
+  * Registers a class method with given name for a given object.
+  */
+-SWIGRUNTIME void SWIGV8_AddStaticVariable(v8::Handle<v8::Object> obj, const char* symbol,
++SWIGRUNTIME void SWIGV8_AddStaticVariable(SWIGV8_OBJECT 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..401f9ae1f 100644
+--- a/Lib/javascript/v8/javascriptinit.swg
++++ b/Lib/javascript/v8/javascriptinit.swg
+@@ -68,16 +68,16 @@ SWIG_V8_GetModule(void *) {
+ // TODO: is it ok to do that?
+ extern "C"
+ #if (NODE_MODULE_VERSION < 0x000C)
+-void SWIGV8_INIT (v8::Handle<v8::Object> exports)
++void SWIGV8_INIT (SWIGV8_OBJECT exports)
+ #else
+-void SWIGV8_INIT (v8::Handle<v8::Object> exports, v8::Handle<v8::Object> /*module*/)
++void SWIGV8_INIT (SWIGV8_OBJECT exports, SWIGV8_OBJECT /*module*/)
+ #endif
+ {
+   SWIG_InitializeModule(static_cast<void *>(&exports));
+
+   SWIGV8_HANDLESCOPE();
+
+-  v8::Handle<v8::Object> exports_obj = exports;
++  SWIGV8_OBJECT exports_obj = exports;
+ %}
+
+
+diff --git a/Lib/javascript/v8/javascriptprimtypes.swg b/Lib/javascript/v8/javascriptprimtypes.swg
+index f76be983b..a6577ded2 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::Value>
++SWIGV8_VALUE
+ 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<v8::Value> obj, bool *val)
++int SWIG_AsVal_dec(bool)(SWIGV8_VALUE obj, bool *val)
+ {
+   if(!obj->IsBoolean()) {
+     return SWIG_ERROR;
+@@ -31,7 +31,7 @@ int SWIG_AsVal_dec(bool)(v8::Handle<v8::Value> obj, bool *val)
+
+ %fragment(SWIG_From_frag(int),"header") {
+ SWIGINTERNINLINE
+-v8::Handle<v8::Value> SWIG_From_dec(int)(int value)
++SWIGV8_VALUE SWIG_From_dec(int)(int value)
+ {
+   return SWIGV8_INT32_NEW(value);
+ }
+@@ -39,7 +39,7 @@ v8::Handle<v8::Value> SWIG_From_dec(int)(int value)
+
+ %fragment(SWIG_AsVal_frag(int),"header") {
+ SWIGINTERN
+-int SWIG_AsVal_dec(int)(v8::Handle<v8::Value> valRef, int* val)
++int SWIG_AsVal_dec(int)(SWIGV8_VALUE valRef, int* val)
+ {
+   if (!valRef->IsNumber()) {
+     return SWIG_TypeError;
+@@ -54,7 +54,7 @@ int SWIG_AsVal_dec(int)(v8::Handle<v8::Value> valRef, int* val)
+
+ %fragment(SWIG_From_frag(long),"header") {
+ SWIGINTERNINLINE
+-v8::Handle<v8::Value> SWIG_From_dec(long)(long value)
++SWIGV8_VALUE SWIG_From_dec(long)(long value)
+ {
+   return SWIGV8_NUMBER_NEW(value);
+ }
+@@ -63,7 +63,7 @@ v8::Handle<v8::Value> SWIG_From_dec(long)(long value)
+ %fragment(SWIG_AsVal_frag(long),"header",
+           fragment="SWIG_CanCastAsInteger") {
+ SWIGINTERN
+-int SWIG_AsVal_dec(long)(v8::Handle<v8::Value> obj, long* val)
++int SWIG_AsVal_dec(long)(SWIGV8_VALUE obj, long* val)
+ {
+   if (!obj->IsNumber()) {
+     return SWIG_TypeError;
+@@ -79,7 +79,7 @@ int SWIG_AsVal_dec(long)(v8::Handle<v8::Value> obj, long* val)
+ %fragment(SWIG_From_frag(unsigned long),"header",
+           fragment=SWIG_From_frag(long)) {
+ SWIGINTERNINLINE
+-v8::Handle<v8::Value> SWIG_From_dec(unsigned long)(unsigned long value)
++SWIGV8_VALUE 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<v8::Value> 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<v8::Value> obj, unsigned long *val)
++int SWIG_AsVal_dec(unsigned long)(SWIGV8_VALUE obj, unsigned long *val)
+ {
+   if(!obj->IsNumber()) {
+     return SWIG_TypeError;
+@@ -115,7 +115,7 @@ int SWIG_AsVal_dec(unsigned long)(v8::Handle<v8::Value> obj, unsigned long *val)
+     fragment="SWIG_LongLongAvailable") {
+ %#ifdef SWIG_LONG_LONG_AVAILABLE
+ SWIGINTERNINLINE
+-v8::Handle<v8::Value> SWIG_From_dec(long long)(long long value)
++SWIGV8_VALUE SWIG_From_dec(long long)(long long value)
+ {
+   return SWIGV8_NUMBER_NEW(value);
+ }
+@@ -128,7 +128,7 @@ v8::Handle<v8::Value> 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<v8::Value> obj, long long* val)
++int SWIG_AsVal_dec(long long)(SWIGV8_VALUE obj, long long* val)
+ {
+   if (!obj->IsNumber()) {
+     return SWIG_TypeError;
+@@ -148,7 +148,7 @@ int SWIG_AsVal_dec(long long)(v8::Handle<v8::Value> obj, long long* val)
+     fragment="SWIG_LongLongAvailable") {
+ %#ifdef SWIG_LONG_LONG_AVAILABLE
+ SWIGINTERNINLINE
+-v8::Handle<v8::Value> SWIG_From_dec(unsigned long long)(unsigned long long value)
++SWIGV8_VALUE 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<v8::Value> 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<v8::Value> obj, unsigned long long *val)
++int SWIG_AsVal_dec(unsigned long long)(SWIGV8_VALUE obj, unsigned long long *val)
+ {
+   if(!obj->IsNumber()) {
+     return SWIG_TypeError;
+@@ -185,7 +185,7 @@ int SWIG_AsVal_dec(unsigned long long)(v8::Handle<v8::Value> obj, unsigned long
+
+ %fragment(SWIG_From_frag(double),"header") {
+ SWIGINTERN
+-v8::Handle<v8::Value> SWIG_From_dec(double) (double val)
++SWIGV8_VALUE SWIG_From_dec(double) (double val)
+ {
+   return SWIGV8_NUMBER_NEW(val);
+ }
+@@ -193,7 +193,7 @@ v8::Handle<v8::Value> SWIG_From_dec(double) (double val)
+
+ %fragment(SWIG_AsVal_frag(double),"header") {
+ SWIGINTERN
+-int SWIG_AsVal_dec(double)(v8::Handle<v8::Value> obj, double *val)
++int SWIG_AsVal_dec(double)(SWIGV8_VALUE obj, double *val)
+ {
+   if(!obj->IsNumber()) {
+     return SWIG_TypeError;
+@@ -203,4 +203,3 @@ int SWIG_AsVal_dec(double)(v8::Handle<v8::Value> obj, double *val)
+   return SWIG_OK;
+ }
+ }
+-
+diff --git a/Lib/javascript/v8/javascriptrun.swg b/Lib/javascript/v8/javascriptrun.swg
+index cf3215334..1d74e3747 100644
+--- a/Lib/javascript/v8/javascriptrun.swg
++++ b/Lib/javascript/v8/javascriptrun.swg
+@@ -173,7 +173,7 @@ public:
+         SWIGV8_THROW_EXCEPTION(err);
+     }
+   }
+-  v8::Handle<v8::Value> err;
++  SWIGV8_VALUE err;
+ };
+
+ /* ---------------------------------------------------------------------------
+@@ -238,7 +238,7 @@ public:
+
+ SWIGRUNTIME v8::Persistent<v8::FunctionTemplate> SWIGV8_SWIGTYPE_Proxy_class_templ;
+
+-SWIGRUNTIME int SWIG_V8_ConvertInstancePtr(v8::Handle<v8::Object> objRef, void **ptr, swig_type_info *info, int flags) {
++SWIGRUNTIME int SWIG_V8_ConvertInstancePtr(SWIGV8_OBJECT objRef, void **ptr, swig_type_info *info, int flags) {
+   SWIGV8_HANDLESCOPE();
+
+   if(objRef->InternalFieldCount() < 1) return SWIG_ERROR;
+@@ -290,11 +290,11 @@ SWIGRUNTIME void SWIGV8_Proxy_DefaultDtor(const v8::WeakCallbackInfo<SWIGV8_Prox
+   delete proxy;
+ }
+
+-SWIGRUNTIME int SWIG_V8_GetInstancePtr(v8::Handle<v8::Value> valRef, void **ptr) {
++SWIGRUNTIME int SWIG_V8_GetInstancePtr(SWIGV8_VALUE valRef, void **ptr) {
+   if(!valRef->IsObject()) {
+     return SWIG_TypeError;
+   }
+-  v8::Handle<v8::Object> objRef = SWIGV8_TO_OBJECT(valRef);
++  SWIGV8_OBJECT objRef = SWIGV8_TO_OBJECT(valRef);
+
+   if(objRef->InternalFieldCount() < 1) return SWIG_ERROR;
+
+@@ -314,7 +314,7 @@ SWIGRUNTIME int SWIG_V8_GetInstancePtr(v8::Handle<v8::Value> valRef, void **ptr)
+   return SWIG_OK;
+ }
+
+-SWIGRUNTIME void SWIGV8_SetPrivateData(v8::Handle<v8::Object> obj, void *ptr, swig_type_info *info, int flags) {
++SWIGRUNTIME void SWIGV8_SetPrivateData(SWIGV8_OBJECT 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;
+@@ -377,7 +377,7 @@ SWIGRUNTIME void SWIGV8_SetPrivateData(v8::Handle<v8::Object> obj, void *ptr, sw
+
+ }
+
+-SWIGRUNTIME int SWIG_V8_ConvertPtr(v8::Handle<v8::Value> valRef, void **ptr, swig_type_info *info, int flags) {
++SWIGRUNTIME int SWIG_V8_ConvertPtr(SWIGV8_VALUE valRef, void **ptr, swig_type_info *info, int flags) {
+   SWIGV8_HANDLESCOPE();
+
+   /* special case: JavaScript null => C NULL pointer */
+@@ -388,14 +388,14 @@ SWIGRUNTIME int SWIG_V8_ConvertPtr(v8::Handle<v8::Value> valRef, void **ptr, swi
+   if(!valRef->IsObject()) {
+     return SWIG_TypeError;
+   }
+-  v8::Handle<v8::Object> objRef = SWIGV8_TO_OBJECT(valRef);
++  SWIGV8_OBJECT objRef = SWIGV8_TO_OBJECT(valRef);
+   return SWIG_V8_ConvertInstancePtr(objRef, ptr, info, flags);
+ }
+
+-SWIGRUNTIME v8::Handle<v8::Value> SWIG_V8_NewPointerObj(void *ptr, swig_type_info *info, int flags) {
++SWIGRUNTIME SWIGV8_VALUE SWIG_V8_NewPointerObj(void *ptr, swig_type_info *info, int flags) {
+   SWIGV8_HANDLESCOPE_ESC();
+
+-  v8::Handle<v8::FunctionTemplate> class_templ;
++  SWIGV8_FUNCTION_TEMPLATE class_templ;
+
+   if (ptr == NULL) {
+ #if (V8_MAJOR_VERSION-0) < 4 && (SWIG_V8_VERSION < 0x031903)
+@@ -443,7 +443,7 @@ SWIGRUNTIME v8::Handle<v8::Value> SWIG_V8_NewPointerObj(void *ptr, swig_type_inf
+ SWIGRUNTIME SwigV8ReturnValue _SWIGV8_wrap_equals(const SwigV8Arguments &args) {
+   SWIGV8_HANDLESCOPE();
+
+-  v8::Handle<v8::Value> jsresult;
++  SWIGV8_VALUE jsresult;
+   void *arg1 = (void *) 0 ;
+   void *arg2 = (void *) 0 ;
+   bool result;
+@@ -473,7 +473,7 @@ fail:
+ SWIGRUNTIME SwigV8ReturnValue _wrap_getCPtr(const SwigV8Arguments &args) {
+   SWIGV8_HANDLESCOPE();
+
+-  v8::Handle<v8::Value> jsresult;
++  SWIGV8_VALUE jsresult;
+   void *arg1 = (void *) 0 ;
+   long result;
+   int res1;
+@@ -512,10 +512,10 @@ public:
+ };
+
+ SWIGRUNTIMEINLINE
+-int SwigV8Packed_Check(v8::Handle<v8::Value> valRef) {
++int SwigV8Packed_Check(SWIGV8_VALUE valRef) {
+   SWIGV8_HANDLESCOPE();
+
+-  v8::Handle<v8::Object> objRef = SWIGV8_TO_OBJECT(valRef);
++  SWIGV8_OBJECT objRef = SWIGV8_TO_OBJECT(valRef);
+   if(objRef->InternalFieldCount() < 1) return false;
+ #if (V8_MAJOR_VERSION-0) < 5
+   v8::Handle<v8::Value> flag = objRef->GetHiddenValue(SWIGV8_STRING_NEW("__swig__packed_data__"));
+@@ -529,13 +529,13 @@ int SwigV8Packed_Check(v8::Handle<v8::Value> valRef) {
+ }
+
+ SWIGRUNTIME
+-swig_type_info *SwigV8Packed_UnpackData(v8::Handle<v8::Value> valRef, void *ptr, size_t size) {
++swig_type_info *SwigV8Packed_UnpackData(SWIGV8_VALUE valRef, void *ptr, size_t size) {
+   if (SwigV8Packed_Check(valRef)) {
+     SWIGV8_HANDLESCOPE();
+
+     SwigV8PackedData *sobj;
+
+-    v8::Handle<v8::Object> objRef = SWIGV8_TO_OBJECT(valRef);
++    SWIGV8_OBJECT objRef = SWIGV8_TO_OBJECT(valRef);
+
+ #if (V8_MAJOR_VERSION-0) < 4 && (SWIG_V8_VERSION < 0x031511)
+     v8::Handle<v8::Value> cdataRef = objRef->GetInternalField(0);
+@@ -552,7 +552,7 @@ swig_type_info *SwigV8Packed_UnpackData(v8::Handle<v8::Value> valRef, void *ptr,
+ }
+
+ SWIGRUNTIME
+-int SWIGV8_ConvertPacked(v8::Handle<v8::Value> valRef, void *ptr, size_t sz, swig_type_info *ty) {
++int SWIGV8_ConvertPacked(SWIGV8_VALUE 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) {
+@@ -600,7 +600,7 @@ SWIGRUNTIME void _wrap_SwigV8PackedData_delete(const v8::WeakCallbackInfo<SwigV8
+ }
+
+ SWIGRUNTIME
+-v8::Handle<v8::Value> SWIGV8_NewPackedObj(void *data, size_t size, swig_type_info *type) {
++SWIGV8_VALUE SWIGV8_NewPackedObj(void *data, size_t size, swig_type_info *type) {
+   SWIGV8_HANDLESCOPE_ESC();
+
+   SwigV8PackedData *cdata = new SwigV8PackedData(data, size, type);
+@@ -664,21 +664,15 @@ v8::Handle<v8::Value> SWIGV8_NewPackedObj(void *data, size_t size, swig_type_inf
+
+ SWIGRUNTIME
+
+-#if (V8_MAJOR_VERSION-0) < 4 && (SWIG_V8_VERSION < 0x031903)
+-v8::Handle<v8::Value> SWIGV8_AppendOutput(v8::Handle<v8::Value> result, v8::Handle<v8::Value> obj) {
+-#else
+-v8::Handle<v8::Value> SWIGV8_AppendOutput(v8::Local<v8::Value> result, v8::Handle<v8::Value> obj) {
+-#endif
++SWIGV8_VALUE SWIGV8_AppendOutput(SWIGV8_VALUE result, SWIGV8_VALUE obj) {
+   SWIGV8_HANDLESCOPE_ESC();
+
+   if (result->IsUndefined()) {
+     result = SWIGV8_ARRAY_NEW();
+   }
+-#if (V8_MAJOR_VERSION-0) < 4 && (SWIG_V8_VERSION < 0x031903)
+-  v8::Handle<v8::Array> arr = v8::Handle<v8::Array>::Cast(result);
+-#else
+-  v8::Local<v8::Array> arr = v8::Local<v8::Array>::Cast(result);
+-#endif
++  SWIGV8_ARRAY arr = SWIGV8_ARRAY::Cast(result);
++
++#if (V8_MAJOR_VERSION-0) < 4 && (SWIG_V8_VERSION < 0x031903) || (SWIG_V8_VERSION < 0x0706)
+   arr->Set(arr->Length(), obj);
+
+   SWIGV8_ESCAPE(arr);
+diff --git a/Lib/javascript/v8/javascriptstrings.swg b/Lib/javascript/v8/javascriptstrings.swg
+index e767a6d66..9c0919172 100644
+--- a/Lib/javascript/v8/javascriptstrings.swg
++++ b/Lib/javascript/v8/javascriptstrings.swg
+@@ -4,10 +4,14 @@
+  * ------------------------------------------------------------ */
+ %fragment("SWIG_AsCharPtrAndSize", "header", fragment="SWIG_pchar_descriptor") {
+ SWIGINTERN int
+-SWIG_AsCharPtrAndSize(v8::Handle<v8::Value> valRef, char** cptr, size_t* psize, int *alloc)
++SWIG_AsCharPtrAndSize(SWIGV8_VALUE valRef, char** cptr, size_t* psize, int *alloc)
+ {
+   if(valRef->IsString()) {
++%#if (V8_MAJOR_VERSION-0) < 4 && (SWIG_V8_VERSION < 0x031903)
+     v8::Handle<v8::String> js_str = SWIGV8_TO_STRING(valRef);
++%#else
++    v8::Local<v8::String> js_str = SWIGV8_TO_STRING(valRef);
++%#endif
+
+     size_t len = SWIGV8_UTF8_LENGTH(js_str) + 1;
+     char* cstr = new char[len];
+@@ -20,7 +24,7 @@ SWIG_AsCharPtrAndSize(v8::Handle<v8::Value> valRef, char** cptr, size_t* psize,
+     return SWIG_OK;
+   } else {
+     if(valRef->IsObject()) {
+-      v8::Handle<v8::Object> obj = SWIGV8_TO_OBJECT(valRef);
++      SWIGV8_OBJECT 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 +45,7 @@ SWIG_AsCharPtrAndSize(v8::Handle<v8::Value> valRef, char** cptr, size_t* psize,
+ }
+
+ %fragment("SWIG_FromCharPtrAndSize","header",fragment="SWIG_pchar_descriptor") {
+-SWIGINTERNINLINE v8::Handle<v8::Value>
++SWIGINTERNINLINE SWIGV8_VALUE
+ SWIG_FromCharPtrAndSize(const char* carray, size_t size)
+ {
+   if (carray) {
+@@ -49,7 +53,11 @@ SWIG_FromCharPtrAndSize(const char* carray, size_t size)
+       // TODO: handle extra long strings
+       return SWIGV8_UNDEFINED();
+     } else {
++%#if (V8_MAJOR_VERSION-0) < 4 && (SWIG_V8_VERSION < 0x031903)
+       v8::Handle<v8::String> js_str = SWIGV8_STRING_NEW2(carray, size);
++%#else
++      v8::Local<v8::String> js_str = SWIGV8_STRING_NEW2(carray, size);
++%#endif
+       return js_str;
+     }
+   } else {
+diff --git a/Lib/javascript/v8/javascripttypemaps.swg b/Lib/javascript/v8/javascripttypemaps.swg
+index 4601698e0..cb31100c5 100644
+--- a/Lib/javascript/v8/javascripttypemaps.swg
++++ b/Lib/javascript/v8/javascripttypemaps.swg
+@@ -25,7 +25,7 @@
+
+ /* Javascript types */
+
+-#define SWIG_Object                     v8::Handle<v8::Value>
++#define SWIG_Object                     SWIGV8_VALUE
+ #define VOID_Object                     SWIGV8_UNDEFINED()
+
+ /* Overload of the output/constant/exception/dirout handling */
+--
+2.17.0
diff --git a/package/swig/0003-Add-support-for-Node.js-v12.patch b/package/swig/0003-Add-support-for-Node.js-v12.patch
new file mode 100644
index 0000000000..9dd9f949f4
--- /dev/null
+++ b/package/swig/0003-Add-support-for-Node.js-v12.patch
@@ -0,0 +1,207 @@
+From 789da9ead59a8fbbc727d2be38cee3ad4e118603 Mon Sep 17 00:00:00 2001
+From: Yegor Yefremov <yegorslists@googlemail.com>
+Date: Mon, 2 Mar 2020 14:44:04 +0100
+Subject: [PATCH] Add support for Node.js v12
+
+Signed-off-by: Yegor Yefremov <yegorslists@googlemail.com>
+---
+ Lib/javascript/v8/javascriptcode.swg    | 16 +++++++--
+ Lib/javascript/v8/javascripthelpers.swg |  5 +++
+ Lib/javascript/v8/javascriptrun.swg     | 43 ++++++++++++++++++++-----
+ Lib/javascript/v8/javascriptruntime.swg |  5 +++
+ 4 files changed, 59 insertions(+), 10 deletions(-)
+
+diff --git a/Lib/javascript/v8/javascriptcode.swg b/Lib/javascript/v8/javascriptcode.swg
+index 65e0d39d1..edcc1fd90 100644
+--- a/Lib/javascript/v8/javascriptcode.swg
++++ b/Lib/javascript/v8/javascriptcode.swg
+@@ -423,11 +423,14 @@ fail:
+   SWIGV8_FUNCTION_TEMPLATE $jsmangledname_class_0 = SWIGV8_CreateClassTemplate("$jsname");
+   $jsmangledname_class_0->SetCallHandler($jsctor);
+   $jsmangledname_class_0->Inherit($jsmangledname_class);
+-  $jsmangledname_class_0->SetHiddenPrototype(true);
+ #if (V8_MAJOR_VERSION-0) < 4 && (SWIG_V8_VERSION < 0x031903)
++  $jsmangledname_class_0->SetHiddenPrototype(true);
+   v8::Handle<v8::Object> $jsmangledname_obj = $jsmangledname_class_0->GetFunction();
+-#else
++#elif (SWIG_V8_VERSION < 0x0705)
++  $jsmangledname_class_0->SetHiddenPrototype(true);
+   v8::Local<v8::Object> $jsmangledname_obj = $jsmangledname_class_0->GetFunction();
++#else
++  v8::Local<v8::Object> $jsmangledname_obj = $jsmangledname_class_0->GetFunction(SWIGV8_CURRENT_CONTEXT()).ToLocalChecked();
+ #endif
+ %}
+
+@@ -439,7 +442,12 @@ fail:
+  * ----------------------------------------------------------------------------- */
+ %fragment("jsv8_register_class", "templates")
+ %{
++#if (V8_MAJOR_VERSION-0) < 4 && (SWIG_V8_VERSION < 0x031903)
+   $jsparent_obj->Set(SWIGV8_SYMBOL_NEW("$jsname"), $jsmangledname_obj);
++#else
++  $jsparent_obj->Set(SWIGV8_CURRENT_CONTEXT(), SWIGV8_SYMBOL_NEW("$jsname"), $jsmangledname_obj);
++#endif
++
+ %}
+
+ /* -----------------------------------------------------------------------------
+@@ -459,7 +467,11 @@ fail:
+  * ----------------------------------------------------------------------------- */
+ %fragment("jsv8_register_namespace", "templates")
+ %{
++#if (V8_MAJOR_VERSION-0) < 4 && (SWIG_V8_VERSION < 0x031903)
+   $jsparent_obj->Set(SWIGV8_SYMBOL_NEW("$jsname"), $jsmangledname_obj);
++#else
++  $jsparent_obj->Set(SWIGV8_CURRENT_CONTEXT(), SWIGV8_SYMBOL_NEW("$jsname"), $jsmangledname_obj);
++#endif
+ %}
+
+ /* -----------------------------------------------------------------------------
+diff --git a/Lib/javascript/v8/javascripthelpers.swg b/Lib/javascript/v8/javascripthelpers.swg
+index 465d3ee48..cbb43b56d 100644
+--- a/Lib/javascript/v8/javascripthelpers.swg
++++ b/Lib/javascript/v8/javascripthelpers.swg
+@@ -64,6 +64,11 @@ SWIGRUNTIME void SWIGV8_AddStaticFunction(SWIGV8_OBJECT obj, const char* symbol,
+   const SwigV8FunctionCallback& _func) {
+ #if (V8_MAJOR_VERSION-0) < 4 && (SWIG_V8_VERSION < 0x031903) || (SWIG_V8_VERSION < 0x0705)
+   obj->Set(SWIGV8_SYMBOL_NEW(symbol), SWIGV8_FUNCTEMPLATE_NEW(_func)->GetFunction());
++#elif (SWIG_V8_VERSION < 0x0706)
++  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
+ }
+
+ /**
+diff --git a/Lib/javascript/v8/javascriptrun.swg b/Lib/javascript/v8/javascriptrun.swg
+index 1d74e3747..8ce8ff567 100644
+--- a/Lib/javascript/v8/javascriptrun.swg
++++ b/Lib/javascript/v8/javascriptrun.swg
+@@ -9,8 +9,10 @@
+
+ #if (V8_MAJOR_VERSION-0) < 4 && (SWIG_V8_VERSION < 0x031803)
+ #define SWIGV8_STRING_NEW2(cstr, len) v8::String::New(cstr, len)
+-#else
++#elif (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
+
+ #if (V8_MAJOR_VERSION-0) < 4 && (SWIG_V8_VERSION < 0x031903)
+@@ -47,12 +49,18 @@ typedef v8::PropertyCallbackInfo<v8::Value> 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)
++#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, v8::String::kNormalString)
++#define SWIGV8_SYMBOL_NEW(sym) v8::String::NewFromUtf8(v8::Isolate::GetCurrent(), sym, v8::String::kNormalString)
+ #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)
+-#define SWIGV8_SYMBOL_NEW(sym) v8::String::NewFromUtf8(v8::Isolate::GetCurrent(), sym)
++#define SWIGV8_STRING_NEW(str) (v8::String::NewFromUtf8(v8::Isolate::GetCurrent(), str, v8::NewStringType::kNormal)).ToLocalChecked()
++#define SWIGV8_SYMBOL_NEW(sym) (v8::String::NewFromUtf8(v8::Isolate::GetCurrent(), sym, v8::NewStringType::kNormal)).ToLocalChecked()
+ #endif
+
+ #if (V8_MAJOR_VERSION-0) < 4 && (SWIG_V8_VERSION < 0x032318)
+@@ -117,7 +125,7 @@ typedef v8::PropertyCallbackInfo<v8::Value> 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()
+@@ -125,8 +133,17 @@ typedef v8::PropertyCallbackInfo<v8::Value> 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
+
++
+ /* ---------------------------------------------------------------------------
+  * Error handling
+  *
+@@ -371,10 +388,11 @@ SWIGRUNTIME void SWIGV8_SetPrivateData(SWIGV8_OBJECT obj, void *ptr, swig_type_i
+   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(SWIGV8_VALUE valRef, void **ptr, swig_type_info *info, int flags) {
+@@ -422,8 +440,12 @@ SWIGRUNTIME SWIGV8_VALUE SWIG_V8_NewPointerObj(void *ptr, swig_type_info *info,
+   }
+ #endif
+
+-//  v8::Handle<v8::Object> result = class_templ->InstanceTemplate()->NewInstance();
++#if (V8_MAJOR_VERSION-0) < 4 && (SWIG_V8_VERSION < 0x031903) || (SWIG_V8_VERSION < 0x0705)
+   v8::Local<v8::Object> result = class_templ->InstanceTemplate()->NewInstance();
++#else
++  v8::Local<v8::Object> result = class_templ->InstanceTemplate()->NewInstance(SWIGV8_CURRENT_CONTEXT()).ToLocalChecked();
++#endif
++
+   SWIGV8_SetPrivateData(result, ptr, info, flags);
+
+   SWIGV8_ESCAPE(result);
+@@ -646,8 +668,10 @@ SWIGV8_VALUE SWIGV8_NewPackedObj(void *data, size_t size, swig_type_info *type)
+   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);
+@@ -674,6 +698,9 @@ SWIGV8_VALUE SWIGV8_AppendOutput(SWIGV8_VALUE result, SWIGV8_VALUE obj) {
+
+ #if (V8_MAJOR_VERSION-0) < 4 && (SWIG_V8_VERSION < 0x031903) || (SWIG_V8_VERSION < 0x0706)
+   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..773014f2a 100644
+--- a/Lib/javascript/v8/javascriptruntime.swg
++++ b/Lib/javascript/v8/javascriptruntime.swg
+@@ -56,6 +56,11 @@
+ %insert(runtime) %{
+ #include <v8.h>
+
++#if defined(V8_MAJOR_VERSION) && defined(V8_MINOR_VERSION)
++#undef SWIG_V8_VERSION
++#define SWIG_V8_VERSION (V8_MAJOR_VERSION * 256 + V8_MINOR_VERSION)
++#endif
++
+ #include <errno.h>
+ #include <limits.h>
+ #include <stdlib.h>
+--
+2.17.0
-- 
2.17.0

^ permalink raw reply related	[flat|nested] 6+ messages in thread

* [Buildroot] [PATCH] package/swig: enable support for Node.js >= 12.x
  2020-07-07  5:10 [Buildroot] [PATCH] package/swig: enable support for Node.js >= 12.x yegorslists at googlemail.com
@ 2020-07-07  6:32 ` Yegor Yefremov
  2020-07-07 16:43   ` Yegor Yefremov
  2020-07-07 20:26 ` Yann E. MORIN
  1 sibling, 1 reply; 6+ messages in thread
From: Yegor Yefremov @ 2020-07-07  6:32 UTC (permalink / raw)
  To: buildroot

On Tue, Jul 7, 2020 at 7:10 AM <yegorslists@googlemail.com> wrote:
>
> From: Yegor Yefremov <yegorslists@googlemail.com>
>
> Recent Node.js versions have removed some depreciated API calls,
> that swig still relies on. Patches taken from this PR [1] fix
> this issue.
>
> [1] https://github.com/swig/swig/pull/1746
>
> Signed-off-by: Yegor Yefremov <yegorslists@googlemail.com>
> ---
>  ...-to-support-both-Handle-and-Local-ty.patch |  53 ++
>  ...ith-Local-depending-on-Node.js-versi.patch | 649 ++++++++++++++++++
>  .../0003-Add-support-for-Node.js-v12.patch    | 207 ++++++
>  3 files changed, 909 insertions(+)
>  create mode 100644 package/swig/0001-Introduce-macros-to-support-both-Handle-and-Local-ty.patch
>  create mode 100644 package/swig/0002-Replace-Handle-with-Local-depending-on-Node.js-versi.patch
>  create mode 100644 package/swig/0003-Add-support-for-Node.js-v12.patch
>
> diff --git a/package/swig/0001-Introduce-macros-to-support-both-Handle-and-Local-ty.patch b/package/swig/0001-Introduce-macros-to-support-both-Handle-and-Local-ty.patch
> new file mode 100644
> index 0000000000..f52d599723
> --- /dev/null
> +++ b/package/swig/0001-Introduce-macros-to-support-both-Handle-and-Local-ty.patch
> @@ -0,0 +1,53 @@
> +From a40f8b18b31cc882c8fb9cf8b6b3fd597adc1745 Mon Sep 17 00:00:00 2001
> +From: Tom Leavy <tom@wickr.com>
> +Date: Wed, 25 Mar 2020 17:10:51 -0400
> +Subject: [PATCH] Introduce macros to support both Handle and Local types
> +
> +The old Node.js versions don't treat v8::Handle and v8::Local as
> +the same types, and the latest versions (v12 and newer) have
> +removed v8::Handle at all.
> +
> +This patch introduces the following macros that use v8::Handle or
> +v8::Local depending on the selected Node.js version:
> +
> +- SWIGV8_ARRAY
> +- SWIGV8_FUNCTION_TEMPLATE
> +- SWIGV8_OBJECT
> +- SWIGV8_OBJECT_TEMPLATE
> +- SWIGV8_VALUE
> +
> +Signed-off-by: Yegor Yefremov <yegorslists@googlemail.com>
> +---
> + Lib/javascript/v8/javascriptrun.swg | 10 ++++++++++
> + 1 file changed, 10 insertions(+)
> +
> +diff --git a/Lib/javascript/v8/javascriptrun.swg b/Lib/javascript/v8/javascriptrun.swg
> +index 2452f4040..cf3215334 100644
> +--- a/Lib/javascript/v8/javascriptrun.swg
> ++++ b/Lib/javascript/v8/javascriptrun.swg
> +@@ -67,6 +67,11 @@ typedef v8::PropertyCallbackInfo<v8::Value> SwigV8PropertyCallbackInfo;
> + #define SWIGV8_NUMBER_NEW(num) v8::Number::New(num)
> + #define SWIGV8_OBJECT_NEW() v8::Object::New()
> + #define SWIGV8_UNDEFINED() v8::Undefined()
> ++#define SWIGV8_ARRAY v8::Handle<v8::Array>
> ++#define SWIGV8_FUNCTION_TEMPLATE v8::Handle<v8::FunctionTemplate>
> ++#define SWIGV8_OBJECT v8::Handle<v8::Object>
> ++#define SWIGV8_OBJECT_TEMPLATE v8::Handle<v8::ObjectTemplate>
> ++#define SWIGV8_VALUE v8::Handle<v8::Value>
> + #define SWIGV8_NULL() v8::Null()
> + #else
> + #define SWIGV8_ARRAY_NEW() v8::Array::New(v8::Isolate::GetCurrent())
> +@@ -80,6 +85,11 @@ typedef v8::PropertyCallbackInfo<v8::Value> SwigV8PropertyCallbackInfo;
> + #define SWIGV8_NUMBER_NEW(num) v8::Number::New(v8::Isolate::GetCurrent(), num)
> + #define SWIGV8_OBJECT_NEW() v8::Object::New(v8::Isolate::GetCurrent())
> + #define SWIGV8_UNDEFINED() v8::Undefined(v8::Isolate::GetCurrent())
> ++#define SWIGV8_ARRAY v8::Local<v8::Array>
> ++#define SWIGV8_FUNCTION_TEMPLATE v8::Local<v8::FunctionTemplate>
> ++#define SWIGV8_OBJECT v8::Local<v8::Object>
> ++#define SWIGV8_OBJECT_TEMPLATE v8::Local<v8::ObjectTemplate>
> ++#define SWIGV8_VALUE v8::Local<v8::Value>
> + #define SWIGV8_NULL() v8::Null(v8::Isolate::GetCurrent())
> + #endif
> +
> +--
> +2.17.0
> diff --git a/package/swig/0002-Replace-Handle-with-Local-depending-on-Node.js-versi.patch b/package/swig/0002-Replace-Handle-with-Local-depending-on-Node.js-versi.patch
> new file mode 100644
> index 0000000000..86b7b04c6c
> --- /dev/null
> +++ b/package/swig/0002-Replace-Handle-with-Local-depending-on-Node.js-versi.patch
> @@ -0,0 +1,649 @@
> +From 9f245da9b6dd4c9e874fa1fd1a576ea550983dbe Mon Sep 17 00:00:00 2001
> +From: Yegor Yefremov <yegorslists@googlemail.com>
> +Date: Wed, 26 Feb 2020 15:55:18 +0100
> +Subject: [PATCH] Replace Handle with Local depending on Node.js version
> +
> +Use newly introduced macros like SWIGV8_VALUE to use v8::Handle or
> +v8::Local depending on the selected Node.js version where possible.
> +
> +Signed-off-by: Yegor Yefremov <yegorslists@googlemail.com>
> +---
> + Examples/javascript/native/example.i      |  2 +-
> + Examples/test-suite/native_directive.i    |  2 +-
> + Lib/javascript/v8/javascriptcode.swg      | 24 +++++++-----
> + Lib/javascript/v8/javascriptcomplex.swg   | 10 ++---
> + Lib/javascript/v8/javascripthelpers.swg   | 21 +++++-----
> + Lib/javascript/v8/javascriptinit.swg      |  6 +--
> + Lib/javascript/v8/javascriptprimtypes.swg | 29 +++++++-------
> + Lib/javascript/v8/javascriptrun.swg       | 48 ++++++++++-------------
> + Lib/javascript/v8/javascriptstrings.swg   | 14 +++++--
> + Lib/javascript/v8/javascripttypemaps.swg  |  2 +-
> + 10 files changed, 82 insertions(+), 76 deletions(-)
> +
> +diff --git a/Examples/javascript/native/example.i b/Examples/javascript/native/example.i
> +index 8c6160060..a9ca094a7 100644
> +--- a/Examples/javascript/native/example.i
> ++++ b/Examples/javascript/native/example.i
> +@@ -15,7 +15,7 @@ int placeholder() { return 0; }
> +     static SwigV8ReturnValue JavaScript_do_work(const SwigV8Arguments &args) {
> +         SWIGV8_HANDLESCOPE();
> +         const int MY_MAGIC_NUMBER = 5;
> +-        v8::Handle<v8::Value> jsresult =
> ++        SWIGV8_VALUE jsresult =
> +             SWIG_From_int(static_cast< int >(MY_MAGIC_NUMBER));
> +         if (args.Length() != 0)
> +             SWIG_exception_fail(SWIG_ERROR, "Illegal number of arguments.");
> +diff --git a/Examples/test-suite/native_directive.i b/Examples/test-suite/native_directive.i
> +index 9ae76e0b7..3d4858032 100644
> +--- a/Examples/test-suite/native_directive.i
> ++++ b/Examples/test-suite/native_directive.i
> +@@ -53,7 +53,7 @@ extern "C" JNIEXPORT jint JNICALL Java_native_1directive_native_1directiveJNI_Co
> +
> + static SwigV8ReturnValue JavaScript_alpha_count(const SwigV8Arguments &args) {
> +   SWIGV8_HANDLESCOPE();
> +-  v8::Handle<v8::Value> jsresult;
> ++  SWIGV8_VALUE jsresult;
> +   char *arg1 = (char *)0;
> +   int res1;
> +   char *buf1 = 0;
> +diff --git a/Lib/javascript/v8/javascriptcode.swg b/Lib/javascript/v8/javascriptcode.swg
> +index c4aaf3db0..65e0d39d1 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<v8::Object> self = args.Holder();
> ++  SWIGV8_OBJECT 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<v8::Value> self;
> ++  SWIGV8_VALUE 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<v8::Object> self = args.Holder();
> ++  SWIGV8_OBJECT 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<v8::Name> property, const SwigV8Pr
> + #endif
> +   SWIGV8_HANDLESCOPE();
> +
> +-  v8::Handle<v8::Value> jsresult;
> ++  SWIGV8_VALUE jsresult;
> +   $jslocals
> +   $jscode
> +   SWIGV8_RETURN_INFO(jsresult, info);
> +@@ -271,7 +271,7 @@ fail:
> + static SwigV8ReturnValue $jswrapper(const SwigV8Arguments &args) {
> +   SWIGV8_HANDLESCOPE();
> +
> +-  v8::Handle<v8::Value> jsresult;
> ++  SWIGV8_VALUE 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<v8::Value> jsresult;
> ++  SWIGV8_VALUE jsresult;
> +   OverloadErrorHandler errorHandler;
> +   $jscode
> +
> +@@ -320,7 +320,7 @@ static SwigV8ReturnValue $jswrapper(const SwigV8Arguments &args, V8ErrorHandler
> + {
> +   SWIGV8_HANDLESCOPE();
> +
> +-  v8::Handle<v8::Value> jsresult;
> ++  SWIGV8_VALUE 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<v8::FunctionTemplate> $jsmangledname_class = SWIGV8_CreateClassTemplate("$jsmangledname");
> ++  SWIGV8_FUNCTION_TEMPLATE $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<v8::FunctionTemplate> $jsmangledname_class_0 = SWIGV8_CreateClassTemplate("$jsname");
> ++  SWIGV8_FUNCTION_TEMPLATE $jsmangledname_class_0 = SWIGV8_CreateClassTemplate("$jsname");
> +   $jsmangledname_class_0->SetCallHandler($jsctor);
> +   $jsmangledname_class_0->Inherit($jsmangledname_class);
> +   $jsmangledname_class_0->SetHiddenPrototype(true);
> ++#if (V8_MAJOR_VERSION-0) < 4 && (SWIG_V8_VERSION < 0x031903)
> +   v8::Handle<v8::Object> $jsmangledname_obj = $jsmangledname_class_0->GetFunction();
> ++#else
> ++  v8::Local<v8::Object> $jsmangledname_obj = $jsmangledname_class_0->GetFunction();
> ++#endif
> + %}
> +
> + /* -----------------------------------------------------------------------------
> +@@ -444,7 +448,7 @@ fail:
> +  * ----------------------------------------------------------------------------- */
> + %fragment("jsv8_create_namespace", "templates")
> + %{
> +-  v8::Handle<v8::Object> $jsmangledname_obj = SWIGV8_OBJECT_NEW();
> ++  SWIGV8_OBJECT $jsmangledname_obj = SWIGV8_OBJECT_NEW();
> + %}
> +
> + /* -----------------------------------------------------------------------------
> +diff --git a/Lib/javascript/v8/javascriptcomplex.swg b/Lib/javascript/v8/javascriptcomplex.swg
> +index d3b4aaffa..b894d7389 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<v8::Value>
> ++SWIGINTERNINLINE SWIGV8_VALUE
> + 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<v8::Value> o, Type* val)
> ++SWIG_AsVal_dec(Type) (SWIGV8_VALUE o, Type* val)
> + {
> +   SWIGV8_HANDLESCOPE();
> +
> +   if (o->IsArray()) {
> +-    v8::Handle<v8::Array> array = v8::Handle<v8::Array>::Cast(o);
> ++    SWIGV8_ARRAY array = SWIGV8_ARRAY::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<v8::Value> o, Type* val)
> + %fragment(SWIG_AsVal_frag(Type),"header",
> +           fragment=SWIG_AsVal_frag(float)) {
> + SWIGINTERN int
> +-SWIG_AsVal_dec(Type) (v8::Handle<v8::Value> o, Type* val)
> ++SWIG_AsVal_dec(Type) (SWIGV8_VALUE o, Type* val)
> + {
> +   SWIGV8_HANDLESCOPE();
> +
> +   if (o->IsArray()) {
> +-    v8::Handle<v8::Array> array = v8::Handle<v8::Array>::Cast(o);
> ++    SWIGV8_ARRAY array = SWIGV8_ARRAY::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..465d3ee48 100644
> +--- a/Lib/javascript/v8/javascripthelpers.swg
> ++++ b/Lib/javascript/v8/javascripthelpers.swg
> +@@ -21,19 +21,19 @@ typedef v8::PropertyCallbackInfo<void>  SwigV8PropertyCallbackInfoVoid;
> + /**
> +  * Creates a class template for a class with specified initialization function.
> +  */
> +-SWIGRUNTIME v8::Handle<v8::FunctionTemplate> SWIGV8_CreateClassTemplate(const char* symbol) {
> ++SWIGRUNTIME SWIGV8_FUNCTION_TEMPLATE SWIGV8_CreateClassTemplate(const char* symbol) {
> +     SWIGV8_HANDLESCOPE_ESC();
> +
> +     v8::Local<v8::FunctionTemplate> class_templ = SWIGV8_FUNCTEMPLATE_NEW_VOID();
> +     class_templ->SetClassName(SWIGV8_SYMBOL_NEW(symbol));
> +
> +-    v8::Handle<v8::ObjectTemplate> inst_templ = class_templ->InstanceTemplate();
> ++    SWIGV8_OBJECT_TEMPLATE inst_templ = class_templ->InstanceTemplate();
> +     inst_templ->SetInternalFieldCount(1);
> +
> +-    v8::Handle<v8::ObjectTemplate> equals_templ = class_templ->PrototypeTemplate();
> ++    SWIGV8_OBJECT_TEMPLATE equals_templ = class_templ->PrototypeTemplate();
> +     equals_templ->Set(SWIGV8_SYMBOL_NEW("equals"), SWIGV8_FUNCTEMPLATE_NEW(_SWIGV8_wrap_equals));
> +
> +-    v8::Handle<v8::ObjectTemplate> cptr_templ = class_templ->PrototypeTemplate();
> ++    SWIGV8_OBJECT_TEMPLATE cptr_templ = class_templ->PrototypeTemplate();
> +     cptr_templ->Set(SWIGV8_SYMBOL_NEW("getCPtr"), SWIGV8_FUNCTEMPLATE_NEW(_wrap_getCPtr));
> +
> +     SWIGV8_ESCAPE(class_templ);
> +@@ -42,33 +42,34 @@ SWIGRUNTIME v8::Handle<v8::FunctionTemplate> SWIGV8_CreateClassTemplate(const ch
> + /**
> +  * Registers a class method with given name for a given class template.
> +  */
> +-SWIGRUNTIME void SWIGV8_AddMemberFunction(v8::Handle<v8::FunctionTemplate> class_templ, const char* symbol,
> ++SWIGRUNTIME void SWIGV8_AddMemberFunction(SWIGV8_FUNCTION_TEMPLATE class_templ, const char* symbol,
> +   SwigV8FunctionCallback _func) {
> +-    v8::Handle<v8::ObjectTemplate> proto_templ = class_templ->PrototypeTemplate();
> ++    SWIGV8_OBJECT_TEMPLATE 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<v8::FunctionTemplate> class_templ, const char* symbol,
> ++SWIGRUNTIME void SWIGV8_AddMemberVariable(SWIGV8_FUNCTION_TEMPLATE class_templ, const char* symbol,
> +   SwigV8AccessorGetterCallback getter, SwigV8AccessorSetterCallback setter) {
> +-  v8::Handle<v8::ObjectTemplate> proto_templ = class_templ->InstanceTemplate();
> ++  SWIGV8_OBJECT_TEMPLATE 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<v8::Object> obj, const char* symbol,
> ++SWIGRUNTIME void SWIGV8_AddStaticFunction(SWIGV8_OBJECT obj, const char* symbol,
> +   const SwigV8FunctionCallback& _func) {
> ++#if (V8_MAJOR_VERSION-0) < 4 && (SWIG_V8_VERSION < 0x031903) || (SWIG_V8_VERSION < 0x0705)
> +   obj->Set(SWIGV8_SYMBOL_NEW(symbol), SWIGV8_FUNCTEMPLATE_NEW(_func)->GetFunction());
> + }
> +
> + /**
> +  * Registers a class method with given name for a given object.
> +  */
> +-SWIGRUNTIME void SWIGV8_AddStaticVariable(v8::Handle<v8::Object> obj, const char* symbol,
> ++SWIGRUNTIME void SWIGV8_AddStaticVariable(SWIGV8_OBJECT 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..401f9ae1f 100644
> +--- a/Lib/javascript/v8/javascriptinit.swg
> ++++ b/Lib/javascript/v8/javascriptinit.swg
> +@@ -68,16 +68,16 @@ SWIG_V8_GetModule(void *) {
> + // TODO: is it ok to do that?
> + extern "C"
> + #if (NODE_MODULE_VERSION < 0x000C)
> +-void SWIGV8_INIT (v8::Handle<v8::Object> exports)
> ++void SWIGV8_INIT (SWIGV8_OBJECT exports)
> + #else
> +-void SWIGV8_INIT (v8::Handle<v8::Object> exports, v8::Handle<v8::Object> /*module*/)
> ++void SWIGV8_INIT (SWIGV8_OBJECT exports, SWIGV8_OBJECT /*module*/)
> + #endif
> + {
> +   SWIG_InitializeModule(static_cast<void *>(&exports));
> +
> +   SWIGV8_HANDLESCOPE();
> +
> +-  v8::Handle<v8::Object> exports_obj = exports;
> ++  SWIGV8_OBJECT exports_obj = exports;
> + %}
> +
> +
> +diff --git a/Lib/javascript/v8/javascriptprimtypes.swg b/Lib/javascript/v8/javascriptprimtypes.swg
> +index f76be983b..a6577ded2 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::Value>
> ++SWIGV8_VALUE
> + 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<v8::Value> obj, bool *val)
> ++int SWIG_AsVal_dec(bool)(SWIGV8_VALUE obj, bool *val)
> + {
> +   if(!obj->IsBoolean()) {
> +     return SWIG_ERROR;
> +@@ -31,7 +31,7 @@ int SWIG_AsVal_dec(bool)(v8::Handle<v8::Value> obj, bool *val)
> +
> + %fragment(SWIG_From_frag(int),"header") {
> + SWIGINTERNINLINE
> +-v8::Handle<v8::Value> SWIG_From_dec(int)(int value)
> ++SWIGV8_VALUE SWIG_From_dec(int)(int value)
> + {
> +   return SWIGV8_INT32_NEW(value);
> + }
> +@@ -39,7 +39,7 @@ v8::Handle<v8::Value> SWIG_From_dec(int)(int value)
> +
> + %fragment(SWIG_AsVal_frag(int),"header") {
> + SWIGINTERN
> +-int SWIG_AsVal_dec(int)(v8::Handle<v8::Value> valRef, int* val)
> ++int SWIG_AsVal_dec(int)(SWIGV8_VALUE valRef, int* val)
> + {
> +   if (!valRef->IsNumber()) {
> +     return SWIG_TypeError;
> +@@ -54,7 +54,7 @@ int SWIG_AsVal_dec(int)(v8::Handle<v8::Value> valRef, int* val)
> +
> + %fragment(SWIG_From_frag(long),"header") {
> + SWIGINTERNINLINE
> +-v8::Handle<v8::Value> SWIG_From_dec(long)(long value)
> ++SWIGV8_VALUE SWIG_From_dec(long)(long value)
> + {
> +   return SWIGV8_NUMBER_NEW(value);
> + }
> +@@ -63,7 +63,7 @@ v8::Handle<v8::Value> SWIG_From_dec(long)(long value)
> + %fragment(SWIG_AsVal_frag(long),"header",
> +           fragment="SWIG_CanCastAsInteger") {
> + SWIGINTERN
> +-int SWIG_AsVal_dec(long)(v8::Handle<v8::Value> obj, long* val)
> ++int SWIG_AsVal_dec(long)(SWIGV8_VALUE obj, long* val)
> + {
> +   if (!obj->IsNumber()) {
> +     return SWIG_TypeError;
> +@@ -79,7 +79,7 @@ int SWIG_AsVal_dec(long)(v8::Handle<v8::Value> obj, long* val)
> + %fragment(SWIG_From_frag(unsigned long),"header",
> +           fragment=SWIG_From_frag(long)) {
> + SWIGINTERNINLINE
> +-v8::Handle<v8::Value> SWIG_From_dec(unsigned long)(unsigned long value)
> ++SWIGV8_VALUE 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<v8::Value> 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<v8::Value> obj, unsigned long *val)
> ++int SWIG_AsVal_dec(unsigned long)(SWIGV8_VALUE obj, unsigned long *val)
> + {
> +   if(!obj->IsNumber()) {
> +     return SWIG_TypeError;
> +@@ -115,7 +115,7 @@ int SWIG_AsVal_dec(unsigned long)(v8::Handle<v8::Value> obj, unsigned long *val)
> +     fragment="SWIG_LongLongAvailable") {
> + %#ifdef SWIG_LONG_LONG_AVAILABLE
> + SWIGINTERNINLINE
> +-v8::Handle<v8::Value> SWIG_From_dec(long long)(long long value)
> ++SWIGV8_VALUE SWIG_From_dec(long long)(long long value)
> + {
> +   return SWIGV8_NUMBER_NEW(value);
> + }
> +@@ -128,7 +128,7 @@ v8::Handle<v8::Value> 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<v8::Value> obj, long long* val)
> ++int SWIG_AsVal_dec(long long)(SWIGV8_VALUE obj, long long* val)
> + {
> +   if (!obj->IsNumber()) {
> +     return SWIG_TypeError;
> +@@ -148,7 +148,7 @@ int SWIG_AsVal_dec(long long)(v8::Handle<v8::Value> obj, long long* val)
> +     fragment="SWIG_LongLongAvailable") {
> + %#ifdef SWIG_LONG_LONG_AVAILABLE
> + SWIGINTERNINLINE
> +-v8::Handle<v8::Value> SWIG_From_dec(unsigned long long)(unsigned long long value)
> ++SWIGV8_VALUE 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<v8::Value> 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<v8::Value> obj, unsigned long long *val)
> ++int SWIG_AsVal_dec(unsigned long long)(SWIGV8_VALUE obj, unsigned long long *val)
> + {
> +   if(!obj->IsNumber()) {
> +     return SWIG_TypeError;
> +@@ -185,7 +185,7 @@ int SWIG_AsVal_dec(unsigned long long)(v8::Handle<v8::Value> obj, unsigned long
> +
> + %fragment(SWIG_From_frag(double),"header") {
> + SWIGINTERN
> +-v8::Handle<v8::Value> SWIG_From_dec(double) (double val)
> ++SWIGV8_VALUE SWIG_From_dec(double) (double val)
> + {
> +   return SWIGV8_NUMBER_NEW(val);
> + }
> +@@ -193,7 +193,7 @@ v8::Handle<v8::Value> SWIG_From_dec(double) (double val)
> +
> + %fragment(SWIG_AsVal_frag(double),"header") {
> + SWIGINTERN
> +-int SWIG_AsVal_dec(double)(v8::Handle<v8::Value> obj, double *val)
> ++int SWIG_AsVal_dec(double)(SWIGV8_VALUE obj, double *val)
> + {
> +   if(!obj->IsNumber()) {
> +     return SWIG_TypeError;
> +@@ -203,4 +203,3 @@ int SWIG_AsVal_dec(double)(v8::Handle<v8::Value> obj, double *val)
> +   return SWIG_OK;
> + }
> + }
> +-
> +diff --git a/Lib/javascript/v8/javascriptrun.swg b/Lib/javascript/v8/javascriptrun.swg
> +index cf3215334..1d74e3747 100644
> +--- a/Lib/javascript/v8/javascriptrun.swg
> ++++ b/Lib/javascript/v8/javascriptrun.swg
> +@@ -173,7 +173,7 @@ public:
> +         SWIGV8_THROW_EXCEPTION(err);
> +     }
> +   }
> +-  v8::Handle<v8::Value> err;
> ++  SWIGV8_VALUE err;
> + };
> +
> + /* ---------------------------------------------------------------------------
> +@@ -238,7 +238,7 @@ public:
> +
> + SWIGRUNTIME v8::Persistent<v8::FunctionTemplate> SWIGV8_SWIGTYPE_Proxy_class_templ;
> +
> +-SWIGRUNTIME int SWIG_V8_ConvertInstancePtr(v8::Handle<v8::Object> objRef, void **ptr, swig_type_info *info, int flags) {
> ++SWIGRUNTIME int SWIG_V8_ConvertInstancePtr(SWIGV8_OBJECT objRef, void **ptr, swig_type_info *info, int flags) {
> +   SWIGV8_HANDLESCOPE();
> +
> +   if(objRef->InternalFieldCount() < 1) return SWIG_ERROR;
> +@@ -290,11 +290,11 @@ SWIGRUNTIME void SWIGV8_Proxy_DefaultDtor(const v8::WeakCallbackInfo<SWIGV8_Prox
> +   delete proxy;
> + }
> +
> +-SWIGRUNTIME int SWIG_V8_GetInstancePtr(v8::Handle<v8::Value> valRef, void **ptr) {
> ++SWIGRUNTIME int SWIG_V8_GetInstancePtr(SWIGV8_VALUE valRef, void **ptr) {
> +   if(!valRef->IsObject()) {
> +     return SWIG_TypeError;
> +   }
> +-  v8::Handle<v8::Object> objRef = SWIGV8_TO_OBJECT(valRef);
> ++  SWIGV8_OBJECT objRef = SWIGV8_TO_OBJECT(valRef);
> +
> +   if(objRef->InternalFieldCount() < 1) return SWIG_ERROR;
> +
> +@@ -314,7 +314,7 @@ SWIGRUNTIME int SWIG_V8_GetInstancePtr(v8::Handle<v8::Value> valRef, void **ptr)
> +   return SWIG_OK;
> + }
> +
> +-SWIGRUNTIME void SWIGV8_SetPrivateData(v8::Handle<v8::Object> obj, void *ptr, swig_type_info *info, int flags) {
> ++SWIGRUNTIME void SWIGV8_SetPrivateData(SWIGV8_OBJECT 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;
> +@@ -377,7 +377,7 @@ SWIGRUNTIME void SWIGV8_SetPrivateData(v8::Handle<v8::Object> obj, void *ptr, sw
> +
> + }
> +
> +-SWIGRUNTIME int SWIG_V8_ConvertPtr(v8::Handle<v8::Value> valRef, void **ptr, swig_type_info *info, int flags) {
> ++SWIGRUNTIME int SWIG_V8_ConvertPtr(SWIGV8_VALUE valRef, void **ptr, swig_type_info *info, int flags) {
> +   SWIGV8_HANDLESCOPE();
> +
> +   /* special case: JavaScript null => C NULL pointer */
> +@@ -388,14 +388,14 @@ SWIGRUNTIME int SWIG_V8_ConvertPtr(v8::Handle<v8::Value> valRef, void **ptr, swi
> +   if(!valRef->IsObject()) {
> +     return SWIG_TypeError;
> +   }
> +-  v8::Handle<v8::Object> objRef = SWIGV8_TO_OBJECT(valRef);
> ++  SWIGV8_OBJECT objRef = SWIGV8_TO_OBJECT(valRef);
> +   return SWIG_V8_ConvertInstancePtr(objRef, ptr, info, flags);
> + }
> +
> +-SWIGRUNTIME v8::Handle<v8::Value> SWIG_V8_NewPointerObj(void *ptr, swig_type_info *info, int flags) {
> ++SWIGRUNTIME SWIGV8_VALUE SWIG_V8_NewPointerObj(void *ptr, swig_type_info *info, int flags) {
> +   SWIGV8_HANDLESCOPE_ESC();
> +
> +-  v8::Handle<v8::FunctionTemplate> class_templ;
> ++  SWIGV8_FUNCTION_TEMPLATE class_templ;
> +
> +   if (ptr == NULL) {
> + #if (V8_MAJOR_VERSION-0) < 4 && (SWIG_V8_VERSION < 0x031903)
> +@@ -443,7 +443,7 @@ SWIGRUNTIME v8::Handle<v8::Value> SWIG_V8_NewPointerObj(void *ptr, swig_type_inf
> + SWIGRUNTIME SwigV8ReturnValue _SWIGV8_wrap_equals(const SwigV8Arguments &args) {
> +   SWIGV8_HANDLESCOPE();
> +
> +-  v8::Handle<v8::Value> jsresult;
> ++  SWIGV8_VALUE jsresult;
> +   void *arg1 = (void *) 0 ;
> +   void *arg2 = (void *) 0 ;
> +   bool result;
> +@@ -473,7 +473,7 @@ fail:
> + SWIGRUNTIME SwigV8ReturnValue _wrap_getCPtr(const SwigV8Arguments &args) {
> +   SWIGV8_HANDLESCOPE();
> +
> +-  v8::Handle<v8::Value> jsresult;
> ++  SWIGV8_VALUE jsresult;
> +   void *arg1 = (void *) 0 ;
> +   long result;
> +   int res1;
> +@@ -512,10 +512,10 @@ public:
> + };
> +
> + SWIGRUNTIMEINLINE
> +-int SwigV8Packed_Check(v8::Handle<v8::Value> valRef) {
> ++int SwigV8Packed_Check(SWIGV8_VALUE valRef) {
> +   SWIGV8_HANDLESCOPE();
> +
> +-  v8::Handle<v8::Object> objRef = SWIGV8_TO_OBJECT(valRef);
> ++  SWIGV8_OBJECT objRef = SWIGV8_TO_OBJECT(valRef);
> +   if(objRef->InternalFieldCount() < 1) return false;
> + #if (V8_MAJOR_VERSION-0) < 5
> +   v8::Handle<v8::Value> flag = objRef->GetHiddenValue(SWIGV8_STRING_NEW("__swig__packed_data__"));
> +@@ -529,13 +529,13 @@ int SwigV8Packed_Check(v8::Handle<v8::Value> valRef) {
> + }
> +
> + SWIGRUNTIME
> +-swig_type_info *SwigV8Packed_UnpackData(v8::Handle<v8::Value> valRef, void *ptr, size_t size) {
> ++swig_type_info *SwigV8Packed_UnpackData(SWIGV8_VALUE valRef, void *ptr, size_t size) {
> +   if (SwigV8Packed_Check(valRef)) {
> +     SWIGV8_HANDLESCOPE();
> +
> +     SwigV8PackedData *sobj;
> +
> +-    v8::Handle<v8::Object> objRef = SWIGV8_TO_OBJECT(valRef);
> ++    SWIGV8_OBJECT objRef = SWIGV8_TO_OBJECT(valRef);
> +
> + #if (V8_MAJOR_VERSION-0) < 4 && (SWIG_V8_VERSION < 0x031511)
> +     v8::Handle<v8::Value> cdataRef = objRef->GetInternalField(0);
> +@@ -552,7 +552,7 @@ swig_type_info *SwigV8Packed_UnpackData(v8::Handle<v8::Value> valRef, void *ptr,
> + }
> +
> + SWIGRUNTIME
> +-int SWIGV8_ConvertPacked(v8::Handle<v8::Value> valRef, void *ptr, size_t sz, swig_type_info *ty) {
> ++int SWIGV8_ConvertPacked(SWIGV8_VALUE 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) {
> +@@ -600,7 +600,7 @@ SWIGRUNTIME void _wrap_SwigV8PackedData_delete(const v8::WeakCallbackInfo<SwigV8
> + }
> +
> + SWIGRUNTIME
> +-v8::Handle<v8::Value> SWIGV8_NewPackedObj(void *data, size_t size, swig_type_info *type) {
> ++SWIGV8_VALUE SWIGV8_NewPackedObj(void *data, size_t size, swig_type_info *type) {
> +   SWIGV8_HANDLESCOPE_ESC();
> +
> +   SwigV8PackedData *cdata = new SwigV8PackedData(data, size, type);
> +@@ -664,21 +664,15 @@ v8::Handle<v8::Value> SWIGV8_NewPackedObj(void *data, size_t size, swig_type_inf
> +
> + SWIGRUNTIME
> +
> +-#if (V8_MAJOR_VERSION-0) < 4 && (SWIG_V8_VERSION < 0x031903)
> +-v8::Handle<v8::Value> SWIGV8_AppendOutput(v8::Handle<v8::Value> result, v8::Handle<v8::Value> obj) {
> +-#else
> +-v8::Handle<v8::Value> SWIGV8_AppendOutput(v8::Local<v8::Value> result, v8::Handle<v8::Value> obj) {
> +-#endif
> ++SWIGV8_VALUE SWIGV8_AppendOutput(SWIGV8_VALUE result, SWIGV8_VALUE obj) {
> +   SWIGV8_HANDLESCOPE_ESC();
> +
> +   if (result->IsUndefined()) {
> +     result = SWIGV8_ARRAY_NEW();
> +   }
> +-#if (V8_MAJOR_VERSION-0) < 4 && (SWIG_V8_VERSION < 0x031903)
> +-  v8::Handle<v8::Array> arr = v8::Handle<v8::Array>::Cast(result);
> +-#else
> +-  v8::Local<v8::Array> arr = v8::Local<v8::Array>::Cast(result);
> +-#endif
> ++  SWIGV8_ARRAY arr = SWIGV8_ARRAY::Cast(result);
> ++
> ++#if (V8_MAJOR_VERSION-0) < 4 && (SWIG_V8_VERSION < 0x031903) || (SWIG_V8_VERSION < 0x0706)
> +   arr->Set(arr->Length(), obj);
> +
> +   SWIGV8_ESCAPE(arr);
> +diff --git a/Lib/javascript/v8/javascriptstrings.swg b/Lib/javascript/v8/javascriptstrings.swg
> +index e767a6d66..9c0919172 100644
> +--- a/Lib/javascript/v8/javascriptstrings.swg
> ++++ b/Lib/javascript/v8/javascriptstrings.swg
> +@@ -4,10 +4,14 @@
> +  * ------------------------------------------------------------ */
> + %fragment("SWIG_AsCharPtrAndSize", "header", fragment="SWIG_pchar_descriptor") {
> + SWIGINTERN int
> +-SWIG_AsCharPtrAndSize(v8::Handle<v8::Value> valRef, char** cptr, size_t* psize, int *alloc)
> ++SWIG_AsCharPtrAndSize(SWIGV8_VALUE valRef, char** cptr, size_t* psize, int *alloc)
> + {
> +   if(valRef->IsString()) {
> ++%#if (V8_MAJOR_VERSION-0) < 4 && (SWIG_V8_VERSION < 0x031903)
> +     v8::Handle<v8::String> js_str = SWIGV8_TO_STRING(valRef);
> ++%#else
> ++    v8::Local<v8::String> js_str = SWIGV8_TO_STRING(valRef);
> ++%#endif
> +
> +     size_t len = SWIGV8_UTF8_LENGTH(js_str) + 1;
> +     char* cstr = new char[len];
> +@@ -20,7 +24,7 @@ SWIG_AsCharPtrAndSize(v8::Handle<v8::Value> valRef, char** cptr, size_t* psize,
> +     return SWIG_OK;
> +   } else {
> +     if(valRef->IsObject()) {
> +-      v8::Handle<v8::Object> obj = SWIGV8_TO_OBJECT(valRef);
> ++      SWIGV8_OBJECT 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 +45,7 @@ SWIG_AsCharPtrAndSize(v8::Handle<v8::Value> valRef, char** cptr, size_t* psize,
> + }
> +
> + %fragment("SWIG_FromCharPtrAndSize","header",fragment="SWIG_pchar_descriptor") {
> +-SWIGINTERNINLINE v8::Handle<v8::Value>
> ++SWIGINTERNINLINE SWIGV8_VALUE
> + SWIG_FromCharPtrAndSize(const char* carray, size_t size)
> + {
> +   if (carray) {
> +@@ -49,7 +53,11 @@ SWIG_FromCharPtrAndSize(const char* carray, size_t size)
> +       // TODO: handle extra long strings
> +       return SWIGV8_UNDEFINED();
> +     } else {
> ++%#if (V8_MAJOR_VERSION-0) < 4 && (SWIG_V8_VERSION < 0x031903)
> +       v8::Handle<v8::String> js_str = SWIGV8_STRING_NEW2(carray, size);
> ++%#else
> ++      v8::Local<v8::String> js_str = SWIGV8_STRING_NEW2(carray, size);
> ++%#endif
> +       return js_str;
> +     }
> +   } else {
> +diff --git a/Lib/javascript/v8/javascripttypemaps.swg b/Lib/javascript/v8/javascripttypemaps.swg
> +index 4601698e0..cb31100c5 100644
> +--- a/Lib/javascript/v8/javascripttypemaps.swg
> ++++ b/Lib/javascript/v8/javascripttypemaps.swg
> +@@ -25,7 +25,7 @@
> +
> + /* Javascript types */
> +
> +-#define SWIG_Object                     v8::Handle<v8::Value>
> ++#define SWIG_Object                     SWIGV8_VALUE
> + #define VOID_Object                     SWIGV8_UNDEFINED()
> +
> + /* Overload of the output/constant/exception/dirout handling */
> +--
> +2.17.0
> diff --git a/package/swig/0003-Add-support-for-Node.js-v12.patch b/package/swig/0003-Add-support-for-Node.js-v12.patch
> new file mode 100644
> index 0000000000..9dd9f949f4
> --- /dev/null
> +++ b/package/swig/0003-Add-support-for-Node.js-v12.patch
> @@ -0,0 +1,207 @@
> +From 789da9ead59a8fbbc727d2be38cee3ad4e118603 Mon Sep 17 00:00:00 2001
> +From: Yegor Yefremov <yegorslists@googlemail.com>
> +Date: Mon, 2 Mar 2020 14:44:04 +0100
> +Subject: [PATCH] Add support for Node.js v12
> +
> +Signed-off-by: Yegor Yefremov <yegorslists@googlemail.com>
> +---
> + Lib/javascript/v8/javascriptcode.swg    | 16 +++++++--
> + Lib/javascript/v8/javascripthelpers.swg |  5 +++
> + Lib/javascript/v8/javascriptrun.swg     | 43 ++++++++++++++++++++-----
> + Lib/javascript/v8/javascriptruntime.swg |  5 +++
> + 4 files changed, 59 insertions(+), 10 deletions(-)
> +
> +diff --git a/Lib/javascript/v8/javascriptcode.swg b/Lib/javascript/v8/javascriptcode.swg
> +index 65e0d39d1..edcc1fd90 100644
> +--- a/Lib/javascript/v8/javascriptcode.swg
> ++++ b/Lib/javascript/v8/javascriptcode.swg
> +@@ -423,11 +423,14 @@ fail:
> +   SWIGV8_FUNCTION_TEMPLATE $jsmangledname_class_0 = SWIGV8_CreateClassTemplate("$jsname");
> +   $jsmangledname_class_0->SetCallHandler($jsctor);
> +   $jsmangledname_class_0->Inherit($jsmangledname_class);
> +-  $jsmangledname_class_0->SetHiddenPrototype(true);
> + #if (V8_MAJOR_VERSION-0) < 4 && (SWIG_V8_VERSION < 0x031903)
> ++  $jsmangledname_class_0->SetHiddenPrototype(true);
> +   v8::Handle<v8::Object> $jsmangledname_obj = $jsmangledname_class_0->GetFunction();
> +-#else
> ++#elif (SWIG_V8_VERSION < 0x0705)
> ++  $jsmangledname_class_0->SetHiddenPrototype(true);
> +   v8::Local<v8::Object> $jsmangledname_obj = $jsmangledname_class_0->GetFunction();
> ++#else
> ++  v8::Local<v8::Object> $jsmangledname_obj = $jsmangledname_class_0->GetFunction(SWIGV8_CURRENT_CONTEXT()).ToLocalChecked();
> + #endif
> + %}
> +
> +@@ -439,7 +442,12 @@ fail:
> +  * ----------------------------------------------------------------------------- */
> + %fragment("jsv8_register_class", "templates")
> + %{
> ++#if (V8_MAJOR_VERSION-0) < 4 && (SWIG_V8_VERSION < 0x031903)
> +   $jsparent_obj->Set(SWIGV8_SYMBOL_NEW("$jsname"), $jsmangledname_obj);
> ++#else
> ++  $jsparent_obj->Set(SWIGV8_CURRENT_CONTEXT(), SWIGV8_SYMBOL_NEW("$jsname"), $jsmangledname_obj);
> ++#endif
> ++
> + %}
> +
> + /* -----------------------------------------------------------------------------
> +@@ -459,7 +467,11 @@ fail:
> +  * ----------------------------------------------------------------------------- */
> + %fragment("jsv8_register_namespace", "templates")
> + %{
> ++#if (V8_MAJOR_VERSION-0) < 4 && (SWIG_V8_VERSION < 0x031903)
> +   $jsparent_obj->Set(SWIGV8_SYMBOL_NEW("$jsname"), $jsmangledname_obj);
> ++#else
> ++  $jsparent_obj->Set(SWIGV8_CURRENT_CONTEXT(), SWIGV8_SYMBOL_NEW("$jsname"), $jsmangledname_obj);
> ++#endif
> + %}
> +
> + /* -----------------------------------------------------------------------------
> +diff --git a/Lib/javascript/v8/javascripthelpers.swg b/Lib/javascript/v8/javascripthelpers.swg
> +index 465d3ee48..cbb43b56d 100644
> +--- a/Lib/javascript/v8/javascripthelpers.swg
> ++++ b/Lib/javascript/v8/javascripthelpers.swg
> +@@ -64,6 +64,11 @@ SWIGRUNTIME void SWIGV8_AddStaticFunction(SWIGV8_OBJECT obj, const char* symbol,
> +   const SwigV8FunctionCallback& _func) {
> + #if (V8_MAJOR_VERSION-0) < 4 && (SWIG_V8_VERSION < 0x031903) || (SWIG_V8_VERSION < 0x0705)
> +   obj->Set(SWIGV8_SYMBOL_NEW(symbol), SWIGV8_FUNCTEMPLATE_NEW(_func)->GetFunction());
> ++#elif (SWIG_V8_VERSION < 0x0706)
> ++  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
> + }
> +
> + /**
> +diff --git a/Lib/javascript/v8/javascriptrun.swg b/Lib/javascript/v8/javascriptrun.swg
> +index 1d74e3747..8ce8ff567 100644
> +--- a/Lib/javascript/v8/javascriptrun.swg
> ++++ b/Lib/javascript/v8/javascriptrun.swg
> +@@ -9,8 +9,10 @@
> +
> + #if (V8_MAJOR_VERSION-0) < 4 && (SWIG_V8_VERSION < 0x031803)
> + #define SWIGV8_STRING_NEW2(cstr, len) v8::String::New(cstr, len)
> +-#else
> ++#elif (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
> +
> + #if (V8_MAJOR_VERSION-0) < 4 && (SWIG_V8_VERSION < 0x031903)
> +@@ -47,12 +49,18 @@ typedef v8::PropertyCallbackInfo<v8::Value> 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)
> ++#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, v8::String::kNormalString)
> ++#define SWIGV8_SYMBOL_NEW(sym) v8::String::NewFromUtf8(v8::Isolate::GetCurrent(), sym, v8::String::kNormalString)
> + #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)
> +-#define SWIGV8_SYMBOL_NEW(sym) v8::String::NewFromUtf8(v8::Isolate::GetCurrent(), sym)
> ++#define SWIGV8_STRING_NEW(str) (v8::String::NewFromUtf8(v8::Isolate::GetCurrent(), str, v8::NewStringType::kNormal)).ToLocalChecked()
> ++#define SWIGV8_SYMBOL_NEW(sym) (v8::String::NewFromUtf8(v8::Isolate::GetCurrent(), sym, v8::NewStringType::kNormal)).ToLocalChecked()
> + #endif
> +
> + #if (V8_MAJOR_VERSION-0) < 4 && (SWIG_V8_VERSION < 0x032318)
> +@@ -117,7 +125,7 @@ typedef v8::PropertyCallbackInfo<v8::Value> 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()
> +@@ -125,8 +133,17 @@ typedef v8::PropertyCallbackInfo<v8::Value> 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
> +
> ++
> + /* ---------------------------------------------------------------------------
> +  * Error handling
> +  *
> +@@ -371,10 +388,11 @@ SWIGRUNTIME void SWIGV8_SetPrivateData(SWIGV8_OBJECT obj, void *ptr, swig_type_i
> +   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(SWIGV8_VALUE valRef, void **ptr, swig_type_info *info, int flags) {
> +@@ -422,8 +440,12 @@ SWIGRUNTIME SWIGV8_VALUE SWIG_V8_NewPointerObj(void *ptr, swig_type_info *info,
> +   }
> + #endif
> +
> +-//  v8::Handle<v8::Object> result = class_templ->InstanceTemplate()->NewInstance();
> ++#if (V8_MAJOR_VERSION-0) < 4 && (SWIG_V8_VERSION < 0x031903) || (SWIG_V8_VERSION < 0x0705)
> +   v8::Local<v8::Object> result = class_templ->InstanceTemplate()->NewInstance();
> ++#else
> ++  v8::Local<v8::Object> result = class_templ->InstanceTemplate()->NewInstance(SWIGV8_CURRENT_CONTEXT()).ToLocalChecked();
> ++#endif
> ++
> +   SWIGV8_SetPrivateData(result, ptr, info, flags);
> +
> +   SWIGV8_ESCAPE(result);
> +@@ -646,8 +668,10 @@ SWIGV8_VALUE SWIGV8_NewPackedObj(void *data, size_t size, swig_type_info *type)
> +   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);
> +@@ -674,6 +698,9 @@ SWIGV8_VALUE SWIGV8_AppendOutput(SWIGV8_VALUE result, SWIGV8_VALUE obj) {
> +
> + #if (V8_MAJOR_VERSION-0) < 4 && (SWIG_V8_VERSION < 0x031903) || (SWIG_V8_VERSION < 0x0706)
> +   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..773014f2a 100644
> +--- a/Lib/javascript/v8/javascriptruntime.swg
> ++++ b/Lib/javascript/v8/javascriptruntime.swg
> +@@ -56,6 +56,11 @@
> + %insert(runtime) %{
> + #include <v8.h>
> +
> ++#if defined(V8_MAJOR_VERSION) && defined(V8_MINOR_VERSION)
> ++#undef SWIG_V8_VERSION
> ++#define SWIG_V8_VERSION (V8_MAJOR_VERSION * 256 + V8_MINOR_VERSION)
> ++#endif
> ++
> + #include <errno.h>
> + #include <limits.h>
> + #include <stdlib.h>
> +--
> +2.17.0
> --
> 2.17.0
>

Ignore this. Will send v2.

Regards,
Yegor

^ permalink raw reply	[flat|nested] 6+ messages in thread

* [Buildroot] [PATCH] package/swig: enable support for Node.js >= 12.x
  2020-07-07  6:32 ` Yegor Yefremov
@ 2020-07-07 16:43   ` Yegor Yefremov
  0 siblings, 0 replies; 6+ messages in thread
From: Yegor Yefremov @ 2020-07-07 16:43 UTC (permalink / raw)
  To: buildroot

On Tue, Jul 7, 2020 at 8:32 AM Yegor Yefremov
<yegorslists@googlemail.com> wrote:
>
> On Tue, Jul 7, 2020 at 7:10 AM <yegorslists@googlemail.com> wrote:
> >
> > From: Yegor Yefremov <yegorslists@googlemail.com>
> >
> > Recent Node.js versions have removed some depreciated API calls,
> > that swig still relies on. Patches taken from this PR [1] fix
> > this issue.
> >
> > [1] https://github.com/swig/swig/pull/1746
> >
> > Signed-off-by: Yegor Yefremov <yegorslists@googlemail.com>
> > ---
> >  ...-to-support-both-Handle-and-Local-ty.patch |  53 ++
> >  ...ith-Local-depending-on-Node.js-versi.patch | 649 ++++++++++++++++++
> >  .../0003-Add-support-for-Node.js-v12.patch    | 207 ++++++
> >  3 files changed, 909 insertions(+)
> >  create mode 100644 package/swig/0001-Introduce-macros-to-support-both-Handle-and-Local-ty.patch
> >  create mode 100644 package/swig/0002-Replace-Handle-with-Local-depending-on-Node.js-versi.patch
> >  create mode 100644 package/swig/0003-Add-support-for-Node.js-v12.patch
> >
> > diff --git a/package/swig/0001-Introduce-macros-to-support-both-Handle-and-Local-ty.patch b/package/swig/0001-Introduce-macros-to-support-both-Handle-and-Local-ty.patch
> > new file mode 100644
> > index 0000000000..f52d599723
> > --- /dev/null
> > +++ b/package/swig/0001-Introduce-macros-to-support-both-Handle-and-Local-ty.patch
> > @@ -0,0 +1,53 @@
> > +From a40f8b18b31cc882c8fb9cf8b6b3fd597adc1745 Mon Sep 17 00:00:00 2001
> > +From: Tom Leavy <tom@wickr.com>
> > +Date: Wed, 25 Mar 2020 17:10:51 -0400
> > +Subject: [PATCH] Introduce macros to support both Handle and Local types
> > +
> > +The old Node.js versions don't treat v8::Handle and v8::Local as
> > +the same types, and the latest versions (v12 and newer) have
> > +removed v8::Handle at all.
> > +
> > +This patch introduces the following macros that use v8::Handle or
> > +v8::Local depending on the selected Node.js version:
> > +
> > +- SWIGV8_ARRAY
> > +- SWIGV8_FUNCTION_TEMPLATE
> > +- SWIGV8_OBJECT
> > +- SWIGV8_OBJECT_TEMPLATE
> > +- SWIGV8_VALUE
> > +
> > +Signed-off-by: Yegor Yefremov <yegorslists@googlemail.com>
> > +---
> > + Lib/javascript/v8/javascriptrun.swg | 10 ++++++++++
> > + 1 file changed, 10 insertions(+)
> > +
> > +diff --git a/Lib/javascript/v8/javascriptrun.swg b/Lib/javascript/v8/javascriptrun.swg
> > +index 2452f4040..cf3215334 100644
> > +--- a/Lib/javascript/v8/javascriptrun.swg
> > ++++ b/Lib/javascript/v8/javascriptrun.swg
> > +@@ -67,6 +67,11 @@ typedef v8::PropertyCallbackInfo<v8::Value> SwigV8PropertyCallbackInfo;
> > + #define SWIGV8_NUMBER_NEW(num) v8::Number::New(num)
> > + #define SWIGV8_OBJECT_NEW() v8::Object::New()
> > + #define SWIGV8_UNDEFINED() v8::Undefined()
> > ++#define SWIGV8_ARRAY v8::Handle<v8::Array>
> > ++#define SWIGV8_FUNCTION_TEMPLATE v8::Handle<v8::FunctionTemplate>
> > ++#define SWIGV8_OBJECT v8::Handle<v8::Object>
> > ++#define SWIGV8_OBJECT_TEMPLATE v8::Handle<v8::ObjectTemplate>
> > ++#define SWIGV8_VALUE v8::Handle<v8::Value>
> > + #define SWIGV8_NULL() v8::Null()
> > + #else
> > + #define SWIGV8_ARRAY_NEW() v8::Array::New(v8::Isolate::GetCurrent())
> > +@@ -80,6 +85,11 @@ typedef v8::PropertyCallbackInfo<v8::Value> SwigV8PropertyCallbackInfo;
> > + #define SWIGV8_NUMBER_NEW(num) v8::Number::New(v8::Isolate::GetCurrent(), num)
> > + #define SWIGV8_OBJECT_NEW() v8::Object::New(v8::Isolate::GetCurrent())
> > + #define SWIGV8_UNDEFINED() v8::Undefined(v8::Isolate::GetCurrent())
> > ++#define SWIGV8_ARRAY v8::Local<v8::Array>
> > ++#define SWIGV8_FUNCTION_TEMPLATE v8::Local<v8::FunctionTemplate>
> > ++#define SWIGV8_OBJECT v8::Local<v8::Object>
> > ++#define SWIGV8_OBJECT_TEMPLATE v8::Local<v8::ObjectTemplate>
> > ++#define SWIGV8_VALUE v8::Local<v8::Value>
> > + #define SWIGV8_NULL() v8::Null(v8::Isolate::GetCurrent())
> > + #endif
> > +
> > +--
> > +2.17.0
> > diff --git a/package/swig/0002-Replace-Handle-with-Local-depending-on-Node.js-versi.patch b/package/swig/0002-Replace-Handle-with-Local-depending-on-Node.js-versi.patch
> > new file mode 100644
> > index 0000000000..86b7b04c6c
> > --- /dev/null
> > +++ b/package/swig/0002-Replace-Handle-with-Local-depending-on-Node.js-versi.patch
> > @@ -0,0 +1,649 @@
> > +From 9f245da9b6dd4c9e874fa1fd1a576ea550983dbe Mon Sep 17 00:00:00 2001
> > +From: Yegor Yefremov <yegorslists@googlemail.com>
> > +Date: Wed, 26 Feb 2020 15:55:18 +0100
> > +Subject: [PATCH] Replace Handle with Local depending on Node.js version
> > +
> > +Use newly introduced macros like SWIGV8_VALUE to use v8::Handle or
> > +v8::Local depending on the selected Node.js version where possible.
> > +
> > +Signed-off-by: Yegor Yefremov <yegorslists@googlemail.com>
> > +---
> > + Examples/javascript/native/example.i      |  2 +-
> > + Examples/test-suite/native_directive.i    |  2 +-
> > + Lib/javascript/v8/javascriptcode.swg      | 24 +++++++-----
> > + Lib/javascript/v8/javascriptcomplex.swg   | 10 ++---
> > + Lib/javascript/v8/javascripthelpers.swg   | 21 +++++-----
> > + Lib/javascript/v8/javascriptinit.swg      |  6 +--
> > + Lib/javascript/v8/javascriptprimtypes.swg | 29 +++++++-------
> > + Lib/javascript/v8/javascriptrun.swg       | 48 ++++++++++-------------
> > + Lib/javascript/v8/javascriptstrings.swg   | 14 +++++--
> > + Lib/javascript/v8/javascripttypemaps.swg  |  2 +-
> > + 10 files changed, 82 insertions(+), 76 deletions(-)
> > +
> > +diff --git a/Examples/javascript/native/example.i b/Examples/javascript/native/example.i
> > +index 8c6160060..a9ca094a7 100644
> > +--- a/Examples/javascript/native/example.i
> > ++++ b/Examples/javascript/native/example.i
> > +@@ -15,7 +15,7 @@ int placeholder() { return 0; }
> > +     static SwigV8ReturnValue JavaScript_do_work(const SwigV8Arguments &args) {
> > +         SWIGV8_HANDLESCOPE();
> > +         const int MY_MAGIC_NUMBER = 5;
> > +-        v8::Handle<v8::Value> jsresult =
> > ++        SWIGV8_VALUE jsresult =
> > +             SWIG_From_int(static_cast< int >(MY_MAGIC_NUMBER));
> > +         if (args.Length() != 0)
> > +             SWIG_exception_fail(SWIG_ERROR, "Illegal number of arguments.");
> > +diff --git a/Examples/test-suite/native_directive.i b/Examples/test-suite/native_directive.i
> > +index 9ae76e0b7..3d4858032 100644
> > +--- a/Examples/test-suite/native_directive.i
> > ++++ b/Examples/test-suite/native_directive.i
> > +@@ -53,7 +53,7 @@ extern "C" JNIEXPORT jint JNICALL Java_native_1directive_native_1directiveJNI_Co
> > +
> > + static SwigV8ReturnValue JavaScript_alpha_count(const SwigV8Arguments &args) {
> > +   SWIGV8_HANDLESCOPE();
> > +-  v8::Handle<v8::Value> jsresult;
> > ++  SWIGV8_VALUE jsresult;
> > +   char *arg1 = (char *)0;
> > +   int res1;
> > +   char *buf1 = 0;
> > +diff --git a/Lib/javascript/v8/javascriptcode.swg b/Lib/javascript/v8/javascriptcode.swg
> > +index c4aaf3db0..65e0d39d1 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<v8::Object> self = args.Holder();
> > ++  SWIGV8_OBJECT 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<v8::Value> self;
> > ++  SWIGV8_VALUE 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<v8::Object> self = args.Holder();
> > ++  SWIGV8_OBJECT 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<v8::Name> property, const SwigV8Pr
> > + #endif
> > +   SWIGV8_HANDLESCOPE();
> > +
> > +-  v8::Handle<v8::Value> jsresult;
> > ++  SWIGV8_VALUE jsresult;
> > +   $jslocals
> > +   $jscode
> > +   SWIGV8_RETURN_INFO(jsresult, info);
> > +@@ -271,7 +271,7 @@ fail:
> > + static SwigV8ReturnValue $jswrapper(const SwigV8Arguments &args) {
> > +   SWIGV8_HANDLESCOPE();
> > +
> > +-  v8::Handle<v8::Value> jsresult;
> > ++  SWIGV8_VALUE 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<v8::Value> jsresult;
> > ++  SWIGV8_VALUE jsresult;
> > +   OverloadErrorHandler errorHandler;
> > +   $jscode
> > +
> > +@@ -320,7 +320,7 @@ static SwigV8ReturnValue $jswrapper(const SwigV8Arguments &args, V8ErrorHandler
> > + {
> > +   SWIGV8_HANDLESCOPE();
> > +
> > +-  v8::Handle<v8::Value> jsresult;
> > ++  SWIGV8_VALUE 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<v8::FunctionTemplate> $jsmangledname_class = SWIGV8_CreateClassTemplate("$jsmangledname");
> > ++  SWIGV8_FUNCTION_TEMPLATE $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<v8::FunctionTemplate> $jsmangledname_class_0 = SWIGV8_CreateClassTemplate("$jsname");
> > ++  SWIGV8_FUNCTION_TEMPLATE $jsmangledname_class_0 = SWIGV8_CreateClassTemplate("$jsname");
> > +   $jsmangledname_class_0->SetCallHandler($jsctor);
> > +   $jsmangledname_class_0->Inherit($jsmangledname_class);
> > +   $jsmangledname_class_0->SetHiddenPrototype(true);
> > ++#if (V8_MAJOR_VERSION-0) < 4 && (SWIG_V8_VERSION < 0x031903)
> > +   v8::Handle<v8::Object> $jsmangledname_obj = $jsmangledname_class_0->GetFunction();
> > ++#else
> > ++  v8::Local<v8::Object> $jsmangledname_obj = $jsmangledname_class_0->GetFunction();
> > ++#endif
> > + %}
> > +
> > + /* -----------------------------------------------------------------------------
> > +@@ -444,7 +448,7 @@ fail:
> > +  * ----------------------------------------------------------------------------- */
> > + %fragment("jsv8_create_namespace", "templates")
> > + %{
> > +-  v8::Handle<v8::Object> $jsmangledname_obj = SWIGV8_OBJECT_NEW();
> > ++  SWIGV8_OBJECT $jsmangledname_obj = SWIGV8_OBJECT_NEW();
> > + %}
> > +
> > + /* -----------------------------------------------------------------------------
> > +diff --git a/Lib/javascript/v8/javascriptcomplex.swg b/Lib/javascript/v8/javascriptcomplex.swg
> > +index d3b4aaffa..b894d7389 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<v8::Value>
> > ++SWIGINTERNINLINE SWIGV8_VALUE
> > + 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<v8::Value> o, Type* val)
> > ++SWIG_AsVal_dec(Type) (SWIGV8_VALUE o, Type* val)
> > + {
> > +   SWIGV8_HANDLESCOPE();
> > +
> > +   if (o->IsArray()) {
> > +-    v8::Handle<v8::Array> array = v8::Handle<v8::Array>::Cast(o);
> > ++    SWIGV8_ARRAY array = SWIGV8_ARRAY::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<v8::Value> o, Type* val)
> > + %fragment(SWIG_AsVal_frag(Type),"header",
> > +           fragment=SWIG_AsVal_frag(float)) {
> > + SWIGINTERN int
> > +-SWIG_AsVal_dec(Type) (v8::Handle<v8::Value> o, Type* val)
> > ++SWIG_AsVal_dec(Type) (SWIGV8_VALUE o, Type* val)
> > + {
> > +   SWIGV8_HANDLESCOPE();
> > +
> > +   if (o->IsArray()) {
> > +-    v8::Handle<v8::Array> array = v8::Handle<v8::Array>::Cast(o);
> > ++    SWIGV8_ARRAY array = SWIGV8_ARRAY::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..465d3ee48 100644
> > +--- a/Lib/javascript/v8/javascripthelpers.swg
> > ++++ b/Lib/javascript/v8/javascripthelpers.swg
> > +@@ -21,19 +21,19 @@ typedef v8::PropertyCallbackInfo<void>  SwigV8PropertyCallbackInfoVoid;
> > + /**
> > +  * Creates a class template for a class with specified initialization function.
> > +  */
> > +-SWIGRUNTIME v8::Handle<v8::FunctionTemplate> SWIGV8_CreateClassTemplate(const char* symbol) {
> > ++SWIGRUNTIME SWIGV8_FUNCTION_TEMPLATE SWIGV8_CreateClassTemplate(const char* symbol) {
> > +     SWIGV8_HANDLESCOPE_ESC();
> > +
> > +     v8::Local<v8::FunctionTemplate> class_templ = SWIGV8_FUNCTEMPLATE_NEW_VOID();
> > +     class_templ->SetClassName(SWIGV8_SYMBOL_NEW(symbol));
> > +
> > +-    v8::Handle<v8::ObjectTemplate> inst_templ = class_templ->InstanceTemplate();
> > ++    SWIGV8_OBJECT_TEMPLATE inst_templ = class_templ->InstanceTemplate();
> > +     inst_templ->SetInternalFieldCount(1);
> > +
> > +-    v8::Handle<v8::ObjectTemplate> equals_templ = class_templ->PrototypeTemplate();
> > ++    SWIGV8_OBJECT_TEMPLATE equals_templ = class_templ->PrototypeTemplate();
> > +     equals_templ->Set(SWIGV8_SYMBOL_NEW("equals"), SWIGV8_FUNCTEMPLATE_NEW(_SWIGV8_wrap_equals));
> > +
> > +-    v8::Handle<v8::ObjectTemplate> cptr_templ = class_templ->PrototypeTemplate();
> > ++    SWIGV8_OBJECT_TEMPLATE cptr_templ = class_templ->PrototypeTemplate();
> > +     cptr_templ->Set(SWIGV8_SYMBOL_NEW("getCPtr"), SWIGV8_FUNCTEMPLATE_NEW(_wrap_getCPtr));
> > +
> > +     SWIGV8_ESCAPE(class_templ);
> > +@@ -42,33 +42,34 @@ SWIGRUNTIME v8::Handle<v8::FunctionTemplate> SWIGV8_CreateClassTemplate(const ch
> > + /**
> > +  * Registers a class method with given name for a given class template.
> > +  */
> > +-SWIGRUNTIME void SWIGV8_AddMemberFunction(v8::Handle<v8::FunctionTemplate> class_templ, const char* symbol,
> > ++SWIGRUNTIME void SWIGV8_AddMemberFunction(SWIGV8_FUNCTION_TEMPLATE class_templ, const char* symbol,
> > +   SwigV8FunctionCallback _func) {
> > +-    v8::Handle<v8::ObjectTemplate> proto_templ = class_templ->PrototypeTemplate();
> > ++    SWIGV8_OBJECT_TEMPLATE 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<v8::FunctionTemplate> class_templ, const char* symbol,
> > ++SWIGRUNTIME void SWIGV8_AddMemberVariable(SWIGV8_FUNCTION_TEMPLATE class_templ, const char* symbol,
> > +   SwigV8AccessorGetterCallback getter, SwigV8AccessorSetterCallback setter) {
> > +-  v8::Handle<v8::ObjectTemplate> proto_templ = class_templ->InstanceTemplate();
> > ++  SWIGV8_OBJECT_TEMPLATE 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<v8::Object> obj, const char* symbol,
> > ++SWIGRUNTIME void SWIGV8_AddStaticFunction(SWIGV8_OBJECT obj, const char* symbol,
> > +   const SwigV8FunctionCallback& _func) {
> > ++#if (V8_MAJOR_VERSION-0) < 4 && (SWIG_V8_VERSION < 0x031903) || (SWIG_V8_VERSION < 0x0705)
> > +   obj->Set(SWIGV8_SYMBOL_NEW(symbol), SWIGV8_FUNCTEMPLATE_NEW(_func)->GetFunction());
> > + }
> > +
> > + /**
> > +  * Registers a class method with given name for a given object.
> > +  */
> > +-SWIGRUNTIME void SWIGV8_AddStaticVariable(v8::Handle<v8::Object> obj, const char* symbol,
> > ++SWIGRUNTIME void SWIGV8_AddStaticVariable(SWIGV8_OBJECT 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..401f9ae1f 100644
> > +--- a/Lib/javascript/v8/javascriptinit.swg
> > ++++ b/Lib/javascript/v8/javascriptinit.swg
> > +@@ -68,16 +68,16 @@ SWIG_V8_GetModule(void *) {
> > + // TODO: is it ok to do that?
> > + extern "C"
> > + #if (NODE_MODULE_VERSION < 0x000C)
> > +-void SWIGV8_INIT (v8::Handle<v8::Object> exports)
> > ++void SWIGV8_INIT (SWIGV8_OBJECT exports)
> > + #else
> > +-void SWIGV8_INIT (v8::Handle<v8::Object> exports, v8::Handle<v8::Object> /*module*/)
> > ++void SWIGV8_INIT (SWIGV8_OBJECT exports, SWIGV8_OBJECT /*module*/)
> > + #endif
> > + {
> > +   SWIG_InitializeModule(static_cast<void *>(&exports));
> > +
> > +   SWIGV8_HANDLESCOPE();
> > +
> > +-  v8::Handle<v8::Object> exports_obj = exports;
> > ++  SWIGV8_OBJECT exports_obj = exports;
> > + %}
> > +
> > +
> > +diff --git a/Lib/javascript/v8/javascriptprimtypes.swg b/Lib/javascript/v8/javascriptprimtypes.swg
> > +index f76be983b..a6577ded2 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::Value>
> > ++SWIGV8_VALUE
> > + 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<v8::Value> obj, bool *val)
> > ++int SWIG_AsVal_dec(bool)(SWIGV8_VALUE obj, bool *val)
> > + {
> > +   if(!obj->IsBoolean()) {
> > +     return SWIG_ERROR;
> > +@@ -31,7 +31,7 @@ int SWIG_AsVal_dec(bool)(v8::Handle<v8::Value> obj, bool *val)
> > +
> > + %fragment(SWIG_From_frag(int),"header") {
> > + SWIGINTERNINLINE
> > +-v8::Handle<v8::Value> SWIG_From_dec(int)(int value)
> > ++SWIGV8_VALUE SWIG_From_dec(int)(int value)
> > + {
> > +   return SWIGV8_INT32_NEW(value);
> > + }
> > +@@ -39,7 +39,7 @@ v8::Handle<v8::Value> SWIG_From_dec(int)(int value)
> > +
> > + %fragment(SWIG_AsVal_frag(int),"header") {
> > + SWIGINTERN
> > +-int SWIG_AsVal_dec(int)(v8::Handle<v8::Value> valRef, int* val)
> > ++int SWIG_AsVal_dec(int)(SWIGV8_VALUE valRef, int* val)
> > + {
> > +   if (!valRef->IsNumber()) {
> > +     return SWIG_TypeError;
> > +@@ -54,7 +54,7 @@ int SWIG_AsVal_dec(int)(v8::Handle<v8::Value> valRef, int* val)
> > +
> > + %fragment(SWIG_From_frag(long),"header") {
> > + SWIGINTERNINLINE
> > +-v8::Handle<v8::Value> SWIG_From_dec(long)(long value)
> > ++SWIGV8_VALUE SWIG_From_dec(long)(long value)
> > + {
> > +   return SWIGV8_NUMBER_NEW(value);
> > + }
> > +@@ -63,7 +63,7 @@ v8::Handle<v8::Value> SWIG_From_dec(long)(long value)
> > + %fragment(SWIG_AsVal_frag(long),"header",
> > +           fragment="SWIG_CanCastAsInteger") {
> > + SWIGINTERN
> > +-int SWIG_AsVal_dec(long)(v8::Handle<v8::Value> obj, long* val)
> > ++int SWIG_AsVal_dec(long)(SWIGV8_VALUE obj, long* val)
> > + {
> > +   if (!obj->IsNumber()) {
> > +     return SWIG_TypeError;
> > +@@ -79,7 +79,7 @@ int SWIG_AsVal_dec(long)(v8::Handle<v8::Value> obj, long* val)
> > + %fragment(SWIG_From_frag(unsigned long),"header",
> > +           fragment=SWIG_From_frag(long)) {
> > + SWIGINTERNINLINE
> > +-v8::Handle<v8::Value> SWIG_From_dec(unsigned long)(unsigned long value)
> > ++SWIGV8_VALUE 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<v8::Value> 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<v8::Value> obj, unsigned long *val)
> > ++int SWIG_AsVal_dec(unsigned long)(SWIGV8_VALUE obj, unsigned long *val)
> > + {
> > +   if(!obj->IsNumber()) {
> > +     return SWIG_TypeError;
> > +@@ -115,7 +115,7 @@ int SWIG_AsVal_dec(unsigned long)(v8::Handle<v8::Value> obj, unsigned long *val)
> > +     fragment="SWIG_LongLongAvailable") {
> > + %#ifdef SWIG_LONG_LONG_AVAILABLE
> > + SWIGINTERNINLINE
> > +-v8::Handle<v8::Value> SWIG_From_dec(long long)(long long value)
> > ++SWIGV8_VALUE SWIG_From_dec(long long)(long long value)
> > + {
> > +   return SWIGV8_NUMBER_NEW(value);
> > + }
> > +@@ -128,7 +128,7 @@ v8::Handle<v8::Value> 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<v8::Value> obj, long long* val)
> > ++int SWIG_AsVal_dec(long long)(SWIGV8_VALUE obj, long long* val)
> > + {
> > +   if (!obj->IsNumber()) {
> > +     return SWIG_TypeError;
> > +@@ -148,7 +148,7 @@ int SWIG_AsVal_dec(long long)(v8::Handle<v8::Value> obj, long long* val)
> > +     fragment="SWIG_LongLongAvailable") {
> > + %#ifdef SWIG_LONG_LONG_AVAILABLE
> > + SWIGINTERNINLINE
> > +-v8::Handle<v8::Value> SWIG_From_dec(unsigned long long)(unsigned long long value)
> > ++SWIGV8_VALUE 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<v8::Value> 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<v8::Value> obj, unsigned long long *val)
> > ++int SWIG_AsVal_dec(unsigned long long)(SWIGV8_VALUE obj, unsigned long long *val)
> > + {
> > +   if(!obj->IsNumber()) {
> > +     return SWIG_TypeError;
> > +@@ -185,7 +185,7 @@ int SWIG_AsVal_dec(unsigned long long)(v8::Handle<v8::Value> obj, unsigned long
> > +
> > + %fragment(SWIG_From_frag(double),"header") {
> > + SWIGINTERN
> > +-v8::Handle<v8::Value> SWIG_From_dec(double) (double val)
> > ++SWIGV8_VALUE SWIG_From_dec(double) (double val)
> > + {
> > +   return SWIGV8_NUMBER_NEW(val);
> > + }
> > +@@ -193,7 +193,7 @@ v8::Handle<v8::Value> SWIG_From_dec(double) (double val)
> > +
> > + %fragment(SWIG_AsVal_frag(double),"header") {
> > + SWIGINTERN
> > +-int SWIG_AsVal_dec(double)(v8::Handle<v8::Value> obj, double *val)
> > ++int SWIG_AsVal_dec(double)(SWIGV8_VALUE obj, double *val)
> > + {
> > +   if(!obj->IsNumber()) {
> > +     return SWIG_TypeError;
> > +@@ -203,4 +203,3 @@ int SWIG_AsVal_dec(double)(v8::Handle<v8::Value> obj, double *val)
> > +   return SWIG_OK;
> > + }
> > + }
> > +-
> > +diff --git a/Lib/javascript/v8/javascriptrun.swg b/Lib/javascript/v8/javascriptrun.swg
> > +index cf3215334..1d74e3747 100644
> > +--- a/Lib/javascript/v8/javascriptrun.swg
> > ++++ b/Lib/javascript/v8/javascriptrun.swg
> > +@@ -173,7 +173,7 @@ public:
> > +         SWIGV8_THROW_EXCEPTION(err);
> > +     }
> > +   }
> > +-  v8::Handle<v8::Value> err;
> > ++  SWIGV8_VALUE err;
> > + };
> > +
> > + /* ---------------------------------------------------------------------------
> > +@@ -238,7 +238,7 @@ public:
> > +
> > + SWIGRUNTIME v8::Persistent<v8::FunctionTemplate> SWIGV8_SWIGTYPE_Proxy_class_templ;
> > +
> > +-SWIGRUNTIME int SWIG_V8_ConvertInstancePtr(v8::Handle<v8::Object> objRef, void **ptr, swig_type_info *info, int flags) {
> > ++SWIGRUNTIME int SWIG_V8_ConvertInstancePtr(SWIGV8_OBJECT objRef, void **ptr, swig_type_info *info, int flags) {
> > +   SWIGV8_HANDLESCOPE();
> > +
> > +   if(objRef->InternalFieldCount() < 1) return SWIG_ERROR;
> > +@@ -290,11 +290,11 @@ SWIGRUNTIME void SWIGV8_Proxy_DefaultDtor(const v8::WeakCallbackInfo<SWIGV8_Prox
> > +   delete proxy;
> > + }
> > +
> > +-SWIGRUNTIME int SWIG_V8_GetInstancePtr(v8::Handle<v8::Value> valRef, void **ptr) {
> > ++SWIGRUNTIME int SWIG_V8_GetInstancePtr(SWIGV8_VALUE valRef, void **ptr) {
> > +   if(!valRef->IsObject()) {
> > +     return SWIG_TypeError;
> > +   }
> > +-  v8::Handle<v8::Object> objRef = SWIGV8_TO_OBJECT(valRef);
> > ++  SWIGV8_OBJECT objRef = SWIGV8_TO_OBJECT(valRef);
> > +
> > +   if(objRef->InternalFieldCount() < 1) return SWIG_ERROR;
> > +
> > +@@ -314,7 +314,7 @@ SWIGRUNTIME int SWIG_V8_GetInstancePtr(v8::Handle<v8::Value> valRef, void **ptr)
> > +   return SWIG_OK;
> > + }
> > +
> > +-SWIGRUNTIME void SWIGV8_SetPrivateData(v8::Handle<v8::Object> obj, void *ptr, swig_type_info *info, int flags) {
> > ++SWIGRUNTIME void SWIGV8_SetPrivateData(SWIGV8_OBJECT 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;
> > +@@ -377,7 +377,7 @@ SWIGRUNTIME void SWIGV8_SetPrivateData(v8::Handle<v8::Object> obj, void *ptr, sw
> > +
> > + }
> > +
> > +-SWIGRUNTIME int SWIG_V8_ConvertPtr(v8::Handle<v8::Value> valRef, void **ptr, swig_type_info *info, int flags) {
> > ++SWIGRUNTIME int SWIG_V8_ConvertPtr(SWIGV8_VALUE valRef, void **ptr, swig_type_info *info, int flags) {
> > +   SWIGV8_HANDLESCOPE();
> > +
> > +   /* special case: JavaScript null => C NULL pointer */
> > +@@ -388,14 +388,14 @@ SWIGRUNTIME int SWIG_V8_ConvertPtr(v8::Handle<v8::Value> valRef, void **ptr, swi
> > +   if(!valRef->IsObject()) {
> > +     return SWIG_TypeError;
> > +   }
> > +-  v8::Handle<v8::Object> objRef = SWIGV8_TO_OBJECT(valRef);
> > ++  SWIGV8_OBJECT objRef = SWIGV8_TO_OBJECT(valRef);
> > +   return SWIG_V8_ConvertInstancePtr(objRef, ptr, info, flags);
> > + }
> > +
> > +-SWIGRUNTIME v8::Handle<v8::Value> SWIG_V8_NewPointerObj(void *ptr, swig_type_info *info, int flags) {
> > ++SWIGRUNTIME SWIGV8_VALUE SWIG_V8_NewPointerObj(void *ptr, swig_type_info *info, int flags) {
> > +   SWIGV8_HANDLESCOPE_ESC();
> > +
> > +-  v8::Handle<v8::FunctionTemplate> class_templ;
> > ++  SWIGV8_FUNCTION_TEMPLATE class_templ;
> > +
> > +   if (ptr == NULL) {
> > + #if (V8_MAJOR_VERSION-0) < 4 && (SWIG_V8_VERSION < 0x031903)
> > +@@ -443,7 +443,7 @@ SWIGRUNTIME v8::Handle<v8::Value> SWIG_V8_NewPointerObj(void *ptr, swig_type_inf
> > + SWIGRUNTIME SwigV8ReturnValue _SWIGV8_wrap_equals(const SwigV8Arguments &args) {
> > +   SWIGV8_HANDLESCOPE();
> > +
> > +-  v8::Handle<v8::Value> jsresult;
> > ++  SWIGV8_VALUE jsresult;
> > +   void *arg1 = (void *) 0 ;
> > +   void *arg2 = (void *) 0 ;
> > +   bool result;
> > +@@ -473,7 +473,7 @@ fail:
> > + SWIGRUNTIME SwigV8ReturnValue _wrap_getCPtr(const SwigV8Arguments &args) {
> > +   SWIGV8_HANDLESCOPE();
> > +
> > +-  v8::Handle<v8::Value> jsresult;
> > ++  SWIGV8_VALUE jsresult;
> > +   void *arg1 = (void *) 0 ;
> > +   long result;
> > +   int res1;
> > +@@ -512,10 +512,10 @@ public:
> > + };
> > +
> > + SWIGRUNTIMEINLINE
> > +-int SwigV8Packed_Check(v8::Handle<v8::Value> valRef) {
> > ++int SwigV8Packed_Check(SWIGV8_VALUE valRef) {
> > +   SWIGV8_HANDLESCOPE();
> > +
> > +-  v8::Handle<v8::Object> objRef = SWIGV8_TO_OBJECT(valRef);
> > ++  SWIGV8_OBJECT objRef = SWIGV8_TO_OBJECT(valRef);
> > +   if(objRef->InternalFieldCount() < 1) return false;
> > + #if (V8_MAJOR_VERSION-0) < 5
> > +   v8::Handle<v8::Value> flag = objRef->GetHiddenValue(SWIGV8_STRING_NEW("__swig__packed_data__"));
> > +@@ -529,13 +529,13 @@ int SwigV8Packed_Check(v8::Handle<v8::Value> valRef) {
> > + }
> > +
> > + SWIGRUNTIME
> > +-swig_type_info *SwigV8Packed_UnpackData(v8::Handle<v8::Value> valRef, void *ptr, size_t size) {
> > ++swig_type_info *SwigV8Packed_UnpackData(SWIGV8_VALUE valRef, void *ptr, size_t size) {
> > +   if (SwigV8Packed_Check(valRef)) {
> > +     SWIGV8_HANDLESCOPE();
> > +
> > +     SwigV8PackedData *sobj;
> > +
> > +-    v8::Handle<v8::Object> objRef = SWIGV8_TO_OBJECT(valRef);
> > ++    SWIGV8_OBJECT objRef = SWIGV8_TO_OBJECT(valRef);
> > +
> > + #if (V8_MAJOR_VERSION-0) < 4 && (SWIG_V8_VERSION < 0x031511)
> > +     v8::Handle<v8::Value> cdataRef = objRef->GetInternalField(0);
> > +@@ -552,7 +552,7 @@ swig_type_info *SwigV8Packed_UnpackData(v8::Handle<v8::Value> valRef, void *ptr,
> > + }
> > +
> > + SWIGRUNTIME
> > +-int SWIGV8_ConvertPacked(v8::Handle<v8::Value> valRef, void *ptr, size_t sz, swig_type_info *ty) {
> > ++int SWIGV8_ConvertPacked(SWIGV8_VALUE 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) {
> > +@@ -600,7 +600,7 @@ SWIGRUNTIME void _wrap_SwigV8PackedData_delete(const v8::WeakCallbackInfo<SwigV8
> > + }
> > +
> > + SWIGRUNTIME
> > +-v8::Handle<v8::Value> SWIGV8_NewPackedObj(void *data, size_t size, swig_type_info *type) {
> > ++SWIGV8_VALUE SWIGV8_NewPackedObj(void *data, size_t size, swig_type_info *type) {
> > +   SWIGV8_HANDLESCOPE_ESC();
> > +
> > +   SwigV8PackedData *cdata = new SwigV8PackedData(data, size, type);
> > +@@ -664,21 +664,15 @@ v8::Handle<v8::Value> SWIGV8_NewPackedObj(void *data, size_t size, swig_type_inf
> > +
> > + SWIGRUNTIME
> > +
> > +-#if (V8_MAJOR_VERSION-0) < 4 && (SWIG_V8_VERSION < 0x031903)
> > +-v8::Handle<v8::Value> SWIGV8_AppendOutput(v8::Handle<v8::Value> result, v8::Handle<v8::Value> obj) {
> > +-#else
> > +-v8::Handle<v8::Value> SWIGV8_AppendOutput(v8::Local<v8::Value> result, v8::Handle<v8::Value> obj) {
> > +-#endif
> > ++SWIGV8_VALUE SWIGV8_AppendOutput(SWIGV8_VALUE result, SWIGV8_VALUE obj) {
> > +   SWIGV8_HANDLESCOPE_ESC();
> > +
> > +   if (result->IsUndefined()) {
> > +     result = SWIGV8_ARRAY_NEW();
> > +   }
> > +-#if (V8_MAJOR_VERSION-0) < 4 && (SWIG_V8_VERSION < 0x031903)
> > +-  v8::Handle<v8::Array> arr = v8::Handle<v8::Array>::Cast(result);
> > +-#else
> > +-  v8::Local<v8::Array> arr = v8::Local<v8::Array>::Cast(result);
> > +-#endif
> > ++  SWIGV8_ARRAY arr = SWIGV8_ARRAY::Cast(result);
> > ++
> > ++#if (V8_MAJOR_VERSION-0) < 4 && (SWIG_V8_VERSION < 0x031903) || (SWIG_V8_VERSION < 0x0706)
> > +   arr->Set(arr->Length(), obj);
> > +
> > +   SWIGV8_ESCAPE(arr);
> > +diff --git a/Lib/javascript/v8/javascriptstrings.swg b/Lib/javascript/v8/javascriptstrings.swg
> > +index e767a6d66..9c0919172 100644
> > +--- a/Lib/javascript/v8/javascriptstrings.swg
> > ++++ b/Lib/javascript/v8/javascriptstrings.swg
> > +@@ -4,10 +4,14 @@
> > +  * ------------------------------------------------------------ */
> > + %fragment("SWIG_AsCharPtrAndSize", "header", fragment="SWIG_pchar_descriptor") {
> > + SWIGINTERN int
> > +-SWIG_AsCharPtrAndSize(v8::Handle<v8::Value> valRef, char** cptr, size_t* psize, int *alloc)
> > ++SWIG_AsCharPtrAndSize(SWIGV8_VALUE valRef, char** cptr, size_t* psize, int *alloc)
> > + {
> > +   if(valRef->IsString()) {
> > ++%#if (V8_MAJOR_VERSION-0) < 4 && (SWIG_V8_VERSION < 0x031903)
> > +     v8::Handle<v8::String> js_str = SWIGV8_TO_STRING(valRef);
> > ++%#else
> > ++    v8::Local<v8::String> js_str = SWIGV8_TO_STRING(valRef);
> > ++%#endif
> > +
> > +     size_t len = SWIGV8_UTF8_LENGTH(js_str) + 1;
> > +     char* cstr = new char[len];
> > +@@ -20,7 +24,7 @@ SWIG_AsCharPtrAndSize(v8::Handle<v8::Value> valRef, char** cptr, size_t* psize,
> > +     return SWIG_OK;
> > +   } else {
> > +     if(valRef->IsObject()) {
> > +-      v8::Handle<v8::Object> obj = SWIGV8_TO_OBJECT(valRef);
> > ++      SWIGV8_OBJECT 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 +45,7 @@ SWIG_AsCharPtrAndSize(v8::Handle<v8::Value> valRef, char** cptr, size_t* psize,
> > + }
> > +
> > + %fragment("SWIG_FromCharPtrAndSize","header",fragment="SWIG_pchar_descriptor") {
> > +-SWIGINTERNINLINE v8::Handle<v8::Value>
> > ++SWIGINTERNINLINE SWIGV8_VALUE
> > + SWIG_FromCharPtrAndSize(const char* carray, size_t size)
> > + {
> > +   if (carray) {
> > +@@ -49,7 +53,11 @@ SWIG_FromCharPtrAndSize(const char* carray, size_t size)
> > +       // TODO: handle extra long strings
> > +       return SWIGV8_UNDEFINED();
> > +     } else {
> > ++%#if (V8_MAJOR_VERSION-0) < 4 && (SWIG_V8_VERSION < 0x031903)
> > +       v8::Handle<v8::String> js_str = SWIGV8_STRING_NEW2(carray, size);
> > ++%#else
> > ++      v8::Local<v8::String> js_str = SWIGV8_STRING_NEW2(carray, size);
> > ++%#endif
> > +       return js_str;
> > +     }
> > +   } else {
> > +diff --git a/Lib/javascript/v8/javascripttypemaps.swg b/Lib/javascript/v8/javascripttypemaps.swg
> > +index 4601698e0..cb31100c5 100644
> > +--- a/Lib/javascript/v8/javascripttypemaps.swg
> > ++++ b/Lib/javascript/v8/javascripttypemaps.swg
> > +@@ -25,7 +25,7 @@
> > +
> > + /* Javascript types */
> > +
> > +-#define SWIG_Object                     v8::Handle<v8::Value>
> > ++#define SWIG_Object                     SWIGV8_VALUE
> > + #define VOID_Object                     SWIGV8_UNDEFINED()
> > +
> > + /* Overload of the output/constant/exception/dirout handling */
> > +--
> > +2.17.0
> > diff --git a/package/swig/0003-Add-support-for-Node.js-v12.patch b/package/swig/0003-Add-support-for-Node.js-v12.patch
> > new file mode 100644
> > index 0000000000..9dd9f949f4
> > --- /dev/null
> > +++ b/package/swig/0003-Add-support-for-Node.js-v12.patch
> > @@ -0,0 +1,207 @@
> > +From 789da9ead59a8fbbc727d2be38cee3ad4e118603 Mon Sep 17 00:00:00 2001
> > +From: Yegor Yefremov <yegorslists@googlemail.com>
> > +Date: Mon, 2 Mar 2020 14:44:04 +0100
> > +Subject: [PATCH] Add support for Node.js v12
> > +
> > +Signed-off-by: Yegor Yefremov <yegorslists@googlemail.com>
> > +---
> > + Lib/javascript/v8/javascriptcode.swg    | 16 +++++++--
> > + Lib/javascript/v8/javascripthelpers.swg |  5 +++
> > + Lib/javascript/v8/javascriptrun.swg     | 43 ++++++++++++++++++++-----
> > + Lib/javascript/v8/javascriptruntime.swg |  5 +++
> > + 4 files changed, 59 insertions(+), 10 deletions(-)
> > +
> > +diff --git a/Lib/javascript/v8/javascriptcode.swg b/Lib/javascript/v8/javascriptcode.swg
> > +index 65e0d39d1..edcc1fd90 100644
> > +--- a/Lib/javascript/v8/javascriptcode.swg
> > ++++ b/Lib/javascript/v8/javascriptcode.swg
> > +@@ -423,11 +423,14 @@ fail:
> > +   SWIGV8_FUNCTION_TEMPLATE $jsmangledname_class_0 = SWIGV8_CreateClassTemplate("$jsname");
> > +   $jsmangledname_class_0->SetCallHandler($jsctor);
> > +   $jsmangledname_class_0->Inherit($jsmangledname_class);
> > +-  $jsmangledname_class_0->SetHiddenPrototype(true);
> > + #if (V8_MAJOR_VERSION-0) < 4 && (SWIG_V8_VERSION < 0x031903)
> > ++  $jsmangledname_class_0->SetHiddenPrototype(true);
> > +   v8::Handle<v8::Object> $jsmangledname_obj = $jsmangledname_class_0->GetFunction();
> > +-#else
> > ++#elif (SWIG_V8_VERSION < 0x0705)
> > ++  $jsmangledname_class_0->SetHiddenPrototype(true);
> > +   v8::Local<v8::Object> $jsmangledname_obj = $jsmangledname_class_0->GetFunction();
> > ++#else
> > ++  v8::Local<v8::Object> $jsmangledname_obj = $jsmangledname_class_0->GetFunction(SWIGV8_CURRENT_CONTEXT()).ToLocalChecked();
> > + #endif
> > + %}
> > +
> > +@@ -439,7 +442,12 @@ fail:
> > +  * ----------------------------------------------------------------------------- */
> > + %fragment("jsv8_register_class", "templates")
> > + %{
> > ++#if (V8_MAJOR_VERSION-0) < 4 && (SWIG_V8_VERSION < 0x031903)
> > +   $jsparent_obj->Set(SWIGV8_SYMBOL_NEW("$jsname"), $jsmangledname_obj);
> > ++#else
> > ++  $jsparent_obj->Set(SWIGV8_CURRENT_CONTEXT(), SWIGV8_SYMBOL_NEW("$jsname"), $jsmangledname_obj);
> > ++#endif
> > ++
> > + %}
> > +
> > + /* -----------------------------------------------------------------------------
> > +@@ -459,7 +467,11 @@ fail:
> > +  * ----------------------------------------------------------------------------- */
> > + %fragment("jsv8_register_namespace", "templates")
> > + %{
> > ++#if (V8_MAJOR_VERSION-0) < 4 && (SWIG_V8_VERSION < 0x031903)
> > +   $jsparent_obj->Set(SWIGV8_SYMBOL_NEW("$jsname"), $jsmangledname_obj);
> > ++#else
> > ++  $jsparent_obj->Set(SWIGV8_CURRENT_CONTEXT(), SWIGV8_SYMBOL_NEW("$jsname"), $jsmangledname_obj);
> > ++#endif
> > + %}
> > +
> > + /* -----------------------------------------------------------------------------
> > +diff --git a/Lib/javascript/v8/javascripthelpers.swg b/Lib/javascript/v8/javascripthelpers.swg
> > +index 465d3ee48..cbb43b56d 100644
> > +--- a/Lib/javascript/v8/javascripthelpers.swg
> > ++++ b/Lib/javascript/v8/javascripthelpers.swg
> > +@@ -64,6 +64,11 @@ SWIGRUNTIME void SWIGV8_AddStaticFunction(SWIGV8_OBJECT obj, const char* symbol,
> > +   const SwigV8FunctionCallback& _func) {
> > + #if (V8_MAJOR_VERSION-0) < 4 && (SWIG_V8_VERSION < 0x031903) || (SWIG_V8_VERSION < 0x0705)
> > +   obj->Set(SWIGV8_SYMBOL_NEW(symbol), SWIGV8_FUNCTEMPLATE_NEW(_func)->GetFunction());
> > ++#elif (SWIG_V8_VERSION < 0x0706)
> > ++  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
> > + }
> > +
> > + /**
> > +diff --git a/Lib/javascript/v8/javascriptrun.swg b/Lib/javascript/v8/javascriptrun.swg
> > +index 1d74e3747..8ce8ff567 100644
> > +--- a/Lib/javascript/v8/javascriptrun.swg
> > ++++ b/Lib/javascript/v8/javascriptrun.swg
> > +@@ -9,8 +9,10 @@
> > +
> > + #if (V8_MAJOR_VERSION-0) < 4 && (SWIG_V8_VERSION < 0x031803)
> > + #define SWIGV8_STRING_NEW2(cstr, len) v8::String::New(cstr, len)
> > +-#else
> > ++#elif (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
> > +
> > + #if (V8_MAJOR_VERSION-0) < 4 && (SWIG_V8_VERSION < 0x031903)
> > +@@ -47,12 +49,18 @@ typedef v8::PropertyCallbackInfo<v8::Value> 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)
> > ++#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, v8::String::kNormalString)
> > ++#define SWIGV8_SYMBOL_NEW(sym) v8::String::NewFromUtf8(v8::Isolate::GetCurrent(), sym, v8::String::kNormalString)
> > + #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)
> > +-#define SWIGV8_SYMBOL_NEW(sym) v8::String::NewFromUtf8(v8::Isolate::GetCurrent(), sym)
> > ++#define SWIGV8_STRING_NEW(str) (v8::String::NewFromUtf8(v8::Isolate::GetCurrent(), str, v8::NewStringType::kNormal)).ToLocalChecked()
> > ++#define SWIGV8_SYMBOL_NEW(sym) (v8::String::NewFromUtf8(v8::Isolate::GetCurrent(), sym, v8::NewStringType::kNormal)).ToLocalChecked()
> > + #endif
> > +
> > + #if (V8_MAJOR_VERSION-0) < 4 && (SWIG_V8_VERSION < 0x032318)
> > +@@ -117,7 +125,7 @@ typedef v8::PropertyCallbackInfo<v8::Value> 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()
> > +@@ -125,8 +133,17 @@ typedef v8::PropertyCallbackInfo<v8::Value> 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
> > +
> > ++
> > + /* ---------------------------------------------------------------------------
> > +  * Error handling
> > +  *
> > +@@ -371,10 +388,11 @@ SWIGRUNTIME void SWIGV8_SetPrivateData(SWIGV8_OBJECT obj, void *ptr, swig_type_i
> > +   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(SWIGV8_VALUE valRef, void **ptr, swig_type_info *info, int flags) {
> > +@@ -422,8 +440,12 @@ SWIGRUNTIME SWIGV8_VALUE SWIG_V8_NewPointerObj(void *ptr, swig_type_info *info,
> > +   }
> > + #endif
> > +
> > +-//  v8::Handle<v8::Object> result = class_templ->InstanceTemplate()->NewInstance();
> > ++#if (V8_MAJOR_VERSION-0) < 4 && (SWIG_V8_VERSION < 0x031903) || (SWIG_V8_VERSION < 0x0705)
> > +   v8::Local<v8::Object> result = class_templ->InstanceTemplate()->NewInstance();
> > ++#else
> > ++  v8::Local<v8::Object> result = class_templ->InstanceTemplate()->NewInstance(SWIGV8_CURRENT_CONTEXT()).ToLocalChecked();
> > ++#endif
> > ++
> > +   SWIGV8_SetPrivateData(result, ptr, info, flags);
> > +
> > +   SWIGV8_ESCAPE(result);
> > +@@ -646,8 +668,10 @@ SWIGV8_VALUE SWIGV8_NewPackedObj(void *data, size_t size, swig_type_info *type)
> > +   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);
> > +@@ -674,6 +698,9 @@ SWIGV8_VALUE SWIGV8_AppendOutput(SWIGV8_VALUE result, SWIGV8_VALUE obj) {
> > +
> > + #if (V8_MAJOR_VERSION-0) < 4 && (SWIG_V8_VERSION < 0x031903) || (SWIG_V8_VERSION < 0x0706)
> > +   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..773014f2a 100644
> > +--- a/Lib/javascript/v8/javascriptruntime.swg
> > ++++ b/Lib/javascript/v8/javascriptruntime.swg
> > +@@ -56,6 +56,11 @@
> > + %insert(runtime) %{
> > + #include <v8.h>
> > +
> > ++#if defined(V8_MAJOR_VERSION) && defined(V8_MINOR_VERSION)
> > ++#undef SWIG_V8_VERSION
> > ++#define SWIG_V8_VERSION (V8_MAJOR_VERSION * 256 + V8_MINOR_VERSION)
> > ++#endif
> > ++
> > + #include <errno.h>
> > + #include <limits.h>
> > + #include <stdlib.h>
> > +--
> > +2.17.0
> > --
> > 2.17.0
> >
>
> Ignore this. Will send v2.

The patches semlselves when copied to package/swig can be applied as
expected. But when I make them a part of a BR patch and apply it to
the BR tree, the second patch fails to be applied. When the BR patch
gets applied I can see warinigs about trailing whitespaces:

Applying: package/swig: enable support for Node.js >= 12.x
.git/rebase-apply/patch:66: trailing whitespace.

.git/rebase-apply/patch:67: trailing whitespace.
--
.git/rebase-apply/patch:116: trailing whitespace.

.git/rebase-apply/patch:131: trailing whitespace.

.git/rebase-apply/patch:139: trailing whitespace.

warning: squelched 88 whitespace errors
warning: 93 lines add whitespace errors.

If I disable in my .gitconfig file, there is no problem.

[apply]
        whitespace = fix

How to include the patches properly in this case?

Regards,
Yegor

^ permalink raw reply	[flat|nested] 6+ messages in thread

* [Buildroot] [PATCH] package/swig: enable support for Node.js >= 12.x
  2020-07-07  5:10 [Buildroot] [PATCH] package/swig: enable support for Node.js >= 12.x yegorslists at googlemail.com
  2020-07-07  6:32 ` Yegor Yefremov
@ 2020-07-07 20:26 ` Yann E. MORIN
  2020-07-08 14:34   ` Yegor Yefremov
  1 sibling, 1 reply; 6+ messages in thread
From: Yann E. MORIN @ 2020-07-07 20:26 UTC (permalink / raw)
  To: buildroot

Yegor, All,

On 2020-07-07 07:10 +0200, yegorslists at googlemail.com spake thusly:
> From: Yegor Yefremov <yegorslists@googlemail.com>
> 
> Recent Node.js versions have removed some depreciated API calls,
> that swig still relies on. Patches taken from this PR [1] fix
> this issue.
> 
> [1] https://github.com/swig/swig/pull/1746
> 
> Signed-off-by: Yegor Yefremov <yegorslists@googlemail.com>
> ---
>  ...-to-support-both-Handle-and-Local-ty.patch |  53 ++
>  ...ith-Local-depending-on-Node.js-versi.patch | 649 ++++++++++++++++++
>  .../0003-Add-support-for-Node.js-v12.patch    | 207 ++++++
>  3 files changed, 909 insertions(+)
>  create mode 100644 package/swig/0001-Introduce-macros-to-support-both-Handle-and-Local-ty.patch
>  create mode 100644 package/swig/0002-Replace-Handle-with-Local-depending-on-Node.js-versi.patch
>  create mode 100644 package/swig/0003-Add-support-for-Node.js-v12.patch

So, few things:

 1. I don't see how swig can use or detect nodejs, as you are not adding
    a build dependency to host-nodejs;

 2. this is a feature patch IMHO, and upstream has not even applied it
    yet;

 3. swig is a host-only package; why would we want it to have proper
    nodejs support in Buildroot?

As such, this is a not for me so far. If upstream were to apply it, we
may consider a backport, as long as there is a use-case for it.

Consequently, I haven't even looked at that spacing problem you
noticed...

Regards,
Yann E. MORIN.

-- 
.-----------------.--------------------.------------------.--------------------.
|  Yann E. MORIN  | Real-Time Embedded | /"\ ASCII RIBBON | Erics' conspiracy: |
| +33 662 376 056 | Software  Designer | \ / CAMPAIGN     |  ___               |
| +33 561 099 427 `------------.-------:  X  AGAINST      |  \e/  There is no  |
| http://ymorin.is-a-geek.org/ | _/*\_ | / \ HTML MAIL    |   v   conspiracy.  |
'------------------------------^-------^------------------^--------------------'

^ permalink raw reply	[flat|nested] 6+ messages in thread

* [Buildroot] [PATCH] package/swig: enable support for Node.js >= 12.x
  2020-07-07 20:26 ` Yann E. MORIN
@ 2020-07-08 14:34   ` Yegor Yefremov
  2020-07-08 16:42     ` Yann E. MORIN
  0 siblings, 1 reply; 6+ messages in thread
From: Yegor Yefremov @ 2020-07-08 14:34 UTC (permalink / raw)
  To: buildroot

Hi Yann,

On Tue, Jul 7, 2020 at 10:26 PM Yann E. MORIN <yann.morin.1998@free.fr> wrote:
>
> Yegor, All,
>
> On 2020-07-07 07:10 +0200, yegorslists at googlemail.com spake thusly:
> > From: Yegor Yefremov <yegorslists@googlemail.com>
> >
> > Recent Node.js versions have removed some depreciated API calls,
> > that swig still relies on. Patches taken from this PR [1] fix
> > this issue.
> >
> > [1] https://github.com/swig/swig/pull/1746
> >
> > Signed-off-by: Yegor Yefremov <yegorslists@googlemail.com>
> > ---
> >  ...-to-support-both-Handle-and-Local-ty.patch |  53 ++
> >  ...ith-Local-depending-on-Node.js-versi.patch | 649 ++++++++++++++++++
> >  .../0003-Add-support-for-Node.js-v12.patch    | 207 ++++++
> >  3 files changed, 909 insertions(+)
> >  create mode 100644 package/swig/0001-Introduce-macros-to-support-both-Handle-and-Local-ty.patch
> >  create mode 100644 package/swig/0002-Replace-Handle-with-Local-depending-on-Node.js-versi.patch
> >  create mode 100644 package/swig/0003-Add-support-for-Node.js-v12.patch
>
> So, few things:
>
>  1. I don't see how swig can use or detect nodejs, as you are not adding
>     a build dependency to host-nodejs;

SWIG will be invoked in the build process of an application that uses
it. So the application's build script is responsible for finding
Nodejs, python etc. There are some packages in BR that use it. For
example libftdi1 (there is even a run-time test for this use case)

>  2. this is a feature patch IMHO, and upstream has not even applied it
>     yet;

This is a long and a sad story. If you look at package/swig history,
you'll see that similar patch was already applied for version 7.x. Now
it is time to support Node.js 12. I have made even two PRs but none of
them made it into the 4.0.2. But I have a hope that it will make it
into 4.1.0.

We also have such a package as mraa. Though its *.mk doesn't use it
yet, it uses SWIG to create Python and Node.js bindings. If this would
be the case and BR updates Node.js to 12 then we would have real build
errors. In this case it is no longer a feature patch :-)

>
>  3. swig is a host-only package; why would we want it to have proper
>     nodejs support in Buildroot?

See above.

> As such, this is a not for me so far. If upstream were to apply it, we
> may consider a backport, as long as there is a use-case for it.
>
> Consequently, I haven't even looked at that spacing problem you
> noticed...

Regards,
Yegor

^ permalink raw reply	[flat|nested] 6+ messages in thread

* [Buildroot] [PATCH] package/swig: enable support for Node.js >= 12.x
  2020-07-08 14:34   ` Yegor Yefremov
@ 2020-07-08 16:42     ` Yann E. MORIN
  0 siblings, 0 replies; 6+ messages in thread
From: Yann E. MORIN @ 2020-07-08 16:42 UTC (permalink / raw)
  To: buildroot

Yegor, All,

On 2020-07-08 16:34 +0200, Yegor Yefremov spake thusly:
> On Tue, Jul 7, 2020 at 10:26 PM Yann E. MORIN <yann.morin.1998@free.fr> wrote:
> >
> > Yegor, All,
> >
> > On 2020-07-07 07:10 +0200, yegorslists at googlemail.com spake thusly:
> > > From: Yegor Yefremov <yegorslists@googlemail.com>
> > >
> > > Recent Node.js versions have removed some depreciated API calls,
> > > that swig still relies on. Patches taken from this PR [1] fix
> > > this issue.
> > >
> > > [1] https://github.com/swig/swig/pull/1746
> > >
> > > Signed-off-by: Yegor Yefremov <yegorslists@googlemail.com>
> > > ---
> > >  ...-to-support-both-Handle-and-Local-ty.patch |  53 ++
> > >  ...ith-Local-depending-on-Node.js-versi.patch | 649 ++++++++++++++++++
> > >  .../0003-Add-support-for-Node.js-v12.patch    | 207 ++++++
> > >  3 files changed, 909 insertions(+)
> > >  create mode 100644 package/swig/0001-Introduce-macros-to-support-both-Handle-and-Local-ty.patch
> > >  create mode 100644 package/swig/0002-Replace-Handle-with-Local-depending-on-Node.js-versi.patch
> > >  create mode 100644 package/swig/0003-Add-support-for-Node.js-v12.patch
> >
> > So, few things:
> >
> >  1. I don't see how swig can use or detect nodejs, as you are not adding
> >     a build dependency to host-nodejs;
> 
> SWIG will be invoked in the build process of an application that uses
> it. So the application's build script is responsible for finding
> Nodejs, python etc. There are some packages in BR that use it.

Ah, I see. Thanks for the explanations.

> For
> example libftdi1 (there is even a run-time test for this use case)

Not really, becasue libtfdi1 does never depend on nodejs (or host-nodejs
for that matters), and the runtime test is only teting the python
bindings.

> >  2. this is a feature patch IMHO, and upstream has not even applied it
> >     yet;
> 
> This is a long and a sad story.

Yes, I've seen the sad state of those PRs of yours, that's not too
good... :-(

> We also have such a package as mraa. Though its *.mk doesn't use it
> yet, it uses SWIG to create Python and Node.js bindings. If this would
> be the case and BR updates Node.js to 12 then we would have real build
> errors. In this case it is no longer a feature patch :-)

Buildroot already uses nodejs 12, specifically 12.18.0.

> >  3. swig is a host-only package; why would we want it to have proper
> >     nodejs support in Buildroot?
> See above.

But so far, no package makes use of it, so that' still not necessary.

If you were to also provide a patcvh to change (say) libftdi1 to also
build its mode bindings as a second patch in the series, then the
purpose would be more obvious.

Still, given the size of the patch, and the fact that upstream is still
meh-meh about it, I'd prefer we do a reall backport, that is once
upstream has merged it in their master.

Thanks! :-)

Regards,
Yann E. MORIN.

-- 
.-----------------.--------------------.------------------.--------------------.
|  Yann E. MORIN  | Real-Time Embedded | /"\ ASCII RIBBON | Erics' conspiracy: |
| +33 662 376 056 | Software  Designer | \ / CAMPAIGN     |  ___               |
| +33 561 099 427 `------------.-------:  X  AGAINST      |  \e/  There is no  |
| http://ymorin.is-a-geek.org/ | _/*\_ | / \ HTML MAIL    |   v   conspiracy.  |
'------------------------------^-------^------------------^--------------------'

^ permalink raw reply	[flat|nested] 6+ messages in thread

end of thread, other threads:[~2020-07-08 16:42 UTC | newest]

Thread overview: 6+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2020-07-07  5:10 [Buildroot] [PATCH] package/swig: enable support for Node.js >= 12.x yegorslists at googlemail.com
2020-07-07  6:32 ` Yegor Yefremov
2020-07-07 16:43   ` Yegor Yefremov
2020-07-07 20:26 ` Yann E. MORIN
2020-07-08 14:34   ` Yegor Yefremov
2020-07-08 16:42     ` Yann E. MORIN

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.