commit ee8cf3d7b31554e24673432132f3ebd155032cc3
Author: James Antill
Date: Mon Feb 20 02:15:08 2023 -0500
Import rpm: 819d244577ac47d2c67b1c7f4a5da0773ba95669
diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..f32cd37
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1 @@
+SOURCES/swig-3.0.12.tar.gz
diff --git a/ccache-swig.csh b/ccache-swig.csh
new file mode 100644
index 0000000..44db5a6
--- /dev/null
+++ b/ccache-swig.csh
@@ -0,0 +1,4 @@
+# Use ccache-swig by default. Users who don't want that can setenv the
+# CCACHE_DISABLE environment variable in their personal profile.
+
+alias swig 'ccache-swig swig'
diff --git a/ccache-swig.sh b/ccache-swig.sh
new file mode 100644
index 0000000..f8867e9
--- /dev/null
+++ b/ccache-swig.sh
@@ -0,0 +1,4 @@
+# Use ccache-swig by default. Users who don't want that can set the
+# CCACHE_DISABLE environment variable in their personal profile.
+
+alias swig='ccache-swig swig'
diff --git a/description-ccache.h2m b/description-ccache.h2m
new file mode 100644
index 0000000..ae84168
--- /dev/null
+++ b/description-ccache.h2m
@@ -0,0 +1,12 @@
+
+[name]
+ccache-swig - a fast compiler cache
+
+[description]
+ccache-swig is a compiler cache. It speeds up re-compilation of C/C++/SWIG
+code by caching previous compiles and detecting when the same compile is
+being done again. ccache-swig is ccache plus support for SWIG.
+
+[notes]
+For more information, see @DOCDIR@/swig-doc/Doc/Manual/CCache.html from the
+swig-doc package.
diff --git a/description.h2m b/description.h2m
new file mode 100644
index 0000000..e894cdd
--- /dev/null
+++ b/description.h2m
@@ -0,0 +1,24 @@
+[name]
+swig - Simplified Wrapper and Interface Generator
+
+[synopsis]
+swig [ options ] " file"
+
+[description]
+The swig command is used to create wrapper code to connect C and C++ code to
+scripting languages like Perl, Python, Tcl etc. from the definition of the
+interface. For detailed information on writing those interface definitions
+please refer to /usr/share/doc/swig-doc/Doc/Manual/index.html from the swig-doc
+package.
+
+This manpage concentrates on explaining the invocation of the swig command.
+
+[author]
+SWIG was originally created by David Beazley. For up-to-date information
+about authors and contributors please check http://www.swig.org/guilty.html.
+This manual page was written by Torsten Landschoff and
+updated by Jitka Plesnikova (but may be used by
+others).
+
+
+
diff --git a/sources b/sources
new file mode 100644
index 0000000..59eacb0
--- /dev/null
+++ b/sources
@@ -0,0 +1 @@
+SHA1 (swig-3.0.12.tar.gz) = 5cc1af41d041e4cc609580b99bb3dcf720effa25
diff --git a/swig-3.0.12-Add-missing-checks-for-failures-in-calls-to-PyUnicod.patch b/swig-3.0.12-Add-missing-checks-for-failures-in-calls-to-PyUnicod.patch
new file mode 100644
index 0000000..7050452
--- /dev/null
+++ b/swig-3.0.12-Add-missing-checks-for-failures-in-calls-to-PyUnicod.patch
@@ -0,0 +1,346 @@
+From b0e29fbdf31bb94b11cb8a7cc830b4a76467afa3 Mon Sep 17 00:00:00 2001
+From: William S Fulton
+Date: Mon, 4 Dec 2017 18:41:55 +0000
+Subject: [PATCH] Add missing checks for failures in calls to
+ PyUnicode_AsUTF8String.
+
+Previously a seg fault could occur when passing invalid UTF8 strings (low
+surrogates), eg passing u"\udcff" to the C layer (Python 3).
+---
+ CHANGES.current | 8 ++++++-
+ Doc/Manual/Python.html | 22 ++++++++++++++++---
+ Doc/Manual/Varargs.html | 5 ++++-
+ Examples/python/multimap/example.i | 12 +++++++++-
+ .../python/unicode_strings_runme.py | 10 +++++++++
+ Examples/test-suite/python_varargs_typemap.i | 5 ++++-
+ Examples/test-suite/unicode_strings.i | 2 ++
+ Lib/python/pyerrors.swg | 11 ++++++----
+ Lib/python/pyhead.swg | 16 ++++++++------
+ Lib/python/pyinit.swg | 4 ++--
+ Lib/python/pyrun.swg | 10 ++++++---
+ Lib/python/pystrings.swg | 12 ++++++++--
+ 12 files changed, 92 insertions(+), 25 deletions(-)
+
+#diff --git a/CHANGES.current b/CHANGES.current
+#index 5cab80172..06b958f18 100644
+#--- a/CHANGES.current
+#+++ b/CHANGES.current
+#@@ -6,8 +6,14 @@ the issue number to the end of the URL: https://github.com/swig/swig/issues/
+#
+# Version 4.0.0 (in progress)
+# ===========================
+#+
+#+2017-12-04: wsfulton
+#+ [Python] Add missing checks for failures in calls to PyUnicode_AsUTF8String. Previously a
+#+ seg fault could occur when passing invalid UTF8 strings (low surrogates), eg passing
+#+ u"\udcff" to the C layer (Python 3).
+#+
+# 2017-11-24: joequant
+#- Fix github #1124 and return R_NilValue for null pointers
+#+ Fix #1124 and return R_NilValue for null pointers
+#
+# 2017-11-29: wsfulton
+# [Java] director exception handling improvements.
+#diff --git a/Doc/Manual/Python.html b/Doc/Manual/Python.html
+#index 0c0023dea..27ce084bd 100644
+#--- a/Doc/Manual/Python.html
+#+++ b/Doc/Manual/Python.html
+#@@ -6521,14 +6521,16 @@ string that cannot be completely decoded as UTF-8:
+#
+# %module example
+#
+#-%include <std_string.i>
+#-
+# %inline %{
+#
+#-const char* non_utf8_c_str(void) {
+#+const char * non_utf8_c_str(void) {
+# return "h\xe9llo w\xc3\xb6rld";
+# }
+#
+#+void instring(const char *s) {
+#+ ...
+#+}
+#+
+# %}
+#
+#
+#@@ -6590,6 +6592,20 @@ For more details about the surrogateescape error handler, please see
+# PEP 383.
+#
+#
+#+
+#+When Python 3 strings are passed to the C/C++ layer, they are expected to be valid UTF8 Unicode strings too.
+#+For example, when the instring method above is wrapped and called, any invalid UTF8 Unicode code strings
+#+will result in a TypeError because the attempted conversion fails:
+#+
+#+
+#+
+#+>>> example.instring('h\xe9llo')
+#+>>> example.instring('h\udce9llo')
+#+Traceback (most recent call last):
+#+ File "<stdin>", line 1, in <module>
+#+TypeError: in method 'instring', argument 1 of type 'char const *'
+#+
+#+
+#
+# In some cases, users may wish to instead handle all byte strings as bytes
+# objects in Python 3. This can be accomplished by adding
+#diff --git a/Doc/Manual/Varargs.html b/Doc/Manual/Varargs.html
+#index eba816382..014a38cae 100644
+#--- a/Doc/Manual/Varargs.html
+#+++ b/Doc/Manual/Varargs.html
+#@@ -529,8 +529,11 @@ like this:
+# SWIG_fail;
+# }
+# pystr = PyUnicode_AsUTF8String(pyobj);
+#+ if (!pystr) {
+#+ SWIG_fail;
+#+ }
+# str = strdup(PyBytes_AsString(pystr));
+#- Py_XDECREF(pystr);
+#+ Py_DECREF(pystr);
+# %#else
+# if (!PyString_Check(pyobj)) {
+# PyErr_SetString(PyExc_ValueError, "Expected a string");
+diff --git a/Examples/python/multimap/example.i b/Examples/python/multimap/example.i
+index 66c0f74c6..3ff5d52c0 100644
+--- a/Examples/python/multimap/example.i
++++ b/Examples/python/multimap/example.i
+@@ -39,7 +39,11 @@ extern int gcd(int x, int y);
+ %#if PY_VERSION_HEX >= 0x03000000
+ {
+ PyObject *utf8str = PyUnicode_AsUTF8String(s);
+- const char *cstr = PyBytes_AsString(utf8str);
++ const char *cstr;
++ if (!utf8str) {
++ SWIG_fail;
++ }
++ cstr = PyBytes_AsString(utf8str);
+ $2[i] = strdup(cstr);
+ Py_DECREF(utf8str);
+ }
+@@ -72,6 +76,9 @@ extern int gcdmain(int argc, char *argv[]);
+ SWIG_fail;
+ }
+ utf8str = PyUnicode_AsUTF8String($input);
++ if (!utf8str) {
++ SWIG_fail;
++ }
+ PyBytes_AsStringAndSize(utf8str, &cstr, &len);
+ $1 = strncpy((char *)malloc(len+1), cstr, (size_t)len);
+ $2 = (int)len;
+@@ -105,6 +112,9 @@ extern int count(char *bytes, int len, char c);
+ char *cstr;
+ Py_ssize_t len;
+ PyObject *utf8str = PyUnicode_AsUTF8String($input);
++ if (!utf8str) {
++ SWIG_fail;
++ }
+ PyBytes_AsStringAndSize(utf8str, &cstr, &len);
+ $1 = strncpy((char *)malloc(len+1), cstr, (size_t)len);
+ $2 = (int)len;
+diff --git a/Examples/test-suite/python/unicode_strings_runme.py b/Examples/test-suite/python/unicode_strings_runme.py
+index fa9c51437..39e93b0fc 100644
+--- a/Examples/test-suite/python/unicode_strings_runme.py
++++ b/Examples/test-suite/python/unicode_strings_runme.py
+@@ -25,3 +25,13 @@ if sys.version_info[0:2] < (3, 0):
+ check(unicode_strings.charstring(unicode("hello4")), "hello4")
+ unicode_strings.charstring(u"hell\xb05")
+ unicode_strings.charstring(u"hell\u00f66")
++
++low_surrogate_string = u"\udcff"
++try:
++ unicode_strings.instring(low_surrogate_string)
++ # Will succeed with Python 2
++except TypeError, e:
++ # Python 3 will fail the PyUnicode_AsUTF8String conversion resulting in a TypeError.
++ # The real error is actually:
++ # UnicodeEncodeError: 'utf-8' codec can't encode character '\udcff' in position 0: surrogates not allowed
++ pass
+diff --git a/Examples/test-suite/python_varargs_typemap.i b/Examples/test-suite/python_varargs_typemap.i
+index f05fb98eb..d809bf1fa 100644
+--- a/Examples/test-suite/python_varargs_typemap.i
++++ b/Examples/test-suite/python_varargs_typemap.i
+@@ -23,8 +23,11 @@
+ SWIG_fail;
+ }
+ pystr = PyUnicode_AsUTF8String(pyobj);
++ if (!pystr) {
++ SWIG_fail;
++ }
+ str = strdup(PyBytes_AsString(pystr));
+- Py_XDECREF(pystr);
++ Py_DECREF(pystr);
+ %#else
+ if (!PyString_Check(pyobj)) {
+ PyErr_SetString(PyExc_ValueError, "Expected a string");
+diff --git a/Examples/test-suite/unicode_strings.i b/Examples/test-suite/unicode_strings.i
+index 9be3748e6..e7266266e 100644
+--- a/Examples/test-suite/unicode_strings.i
++++ b/Examples/test-suite/unicode_strings.i
+@@ -20,4 +20,6 @@ char *charstring(char *s) {
+ return s;
+ }
+
++void instring(const char *s) {
++}
+ %}
+diff --git a/Lib/python/pyerrors.swg b/Lib/python/pyerrors.swg
+index fe7313554..463afae15 100644
+--- a/Lib/python/pyerrors.swg
++++ b/Lib/python/pyerrors.swg
+@@ -53,14 +53,17 @@ SWIG_Python_AddErrorMsg(const char* mesg)
+ PyObject *value = 0;
+ PyObject *traceback = 0;
+
+- if (PyErr_Occurred()) PyErr_Fetch(&type, &value, &traceback);
++ if (PyErr_Occurred())
++ PyErr_Fetch(&type, &value, &traceback);
+ if (value) {
+- char *tmp;
+ PyObject *old_str = PyObject_Str(value);
++ const char *tmp = SWIG_Python_str_AsChar(old_str);
+ PyErr_Clear();
+ Py_XINCREF(type);
+-
+- PyErr_Format(type, "%s %s", tmp = SWIG_Python_str_AsChar(old_str), mesg);
++ if (tmp)
++ PyErr_Format(type, "%s %s", tmp, mesg);
++ else
++ PyErr_Format(type, "%s", mesg);
+ SWIG_Python_str_DelForPy3(tmp);
+ Py_DECREF(old_str);
+ Py_DECREF(value);
+diff --git a/Lib/python/pyhead.swg b/Lib/python/pyhead.swg
+index 55eb95a6d..2fa8b5b4c 100644
+--- a/Lib/python/pyhead.swg
++++ b/Lib/python/pyhead.swg
+@@ -38,14 +38,16 @@ SWIGINTERN char*
+ SWIG_Python_str_AsChar(PyObject *str)
+ {
+ #if PY_VERSION_HEX >= 0x03000000
+- char *cstr;
+- char *newstr;
+- Py_ssize_t len;
++ char *newstr = 0;
+ str = PyUnicode_AsUTF8String(str);
+- PyBytes_AsStringAndSize(str, &cstr, &len);
+- newstr = (char *) malloc(len+1);
+- memcpy(newstr, cstr, len+1);
+- Py_XDECREF(str);
++ if (str) {
++ char *cstr;
++ Py_ssize_t len;
++ PyBytes_AsStringAndSize(str, &cstr, &len);
++ newstr = (char *) malloc(len+1);
++ memcpy(newstr, cstr, len+1);
++ Py_XDECREF(str);
++ }
+ return newstr;
+ #else
+ return PyString_AsString(str);
+diff --git a/Lib/python/pyinit.swg b/Lib/python/pyinit.swg
+index fe45ac941..826f8411b 100644
+--- a/Lib/python/pyinit.swg
++++ b/Lib/python/pyinit.swg
+@@ -84,10 +84,10 @@ swig_varlink_str(swig_varlinkobject *v) {
+
+ SWIGINTERN int
+ swig_varlink_print(swig_varlinkobject *v, FILE *fp, int SWIGUNUSEDPARM(flags)) {
+- char *tmp;
+ PyObject *str = swig_varlink_str(v);
++ const char *tmp = SWIG_Python_str_AsChar(str);
+ fprintf(fp,"Swig global variables ");
+- fprintf(fp,"%s\n", tmp = SWIG_Python_str_AsChar(str));
++ fprintf(fp,"%s\n", tmp ? tmp : "Invalid global variable");
+ SWIG_Python_str_DelForPy3(tmp);
+ Py_DECREF(str);
+ return 0;
+diff --git a/Lib/python/pyrun.swg b/Lib/python/pyrun.swg
+index efc476613..430d3af18 100644
+--- a/Lib/python/pyrun.swg
++++ b/Lib/python/pyrun.swg
+@@ -1672,14 +1672,16 @@ SWIG_Python_AddErrMesg(const char* mesg, int infront)
+ PyObject *traceback = 0;
+ PyErr_Fetch(&type, &value, &traceback);
+ if (value) {
+- char *tmp;
+ PyObject *old_str = PyObject_Str(value);
++ const char *tmp = SWIG_Python_str_AsChar(old_str);
++ if (!tmp)
++ tmp = "Invalid error message";
+ Py_XINCREF(type);
+ PyErr_Clear();
+ if (infront) {
+- PyErr_Format(type, "%s %s", mesg, tmp = SWIG_Python_str_AsChar(old_str));
++ PyErr_Format(type, "%s %s", mesg, tmp);
+ } else {
+- PyErr_Format(type, "%s %s", tmp = SWIG_Python_str_AsChar(old_str), mesg);
++ PyErr_Format(type, "%s %s", tmp, mesg);
+ }
+ SWIG_Python_str_DelForPy3(tmp);
+ Py_DECREF(old_str);
+@@ -1805,6 +1807,8 @@ SWIG_Python_NonDynamicSetAttr(PyObject *obj, PyObject *name, PyObject *value) {
+ Py_INCREF(name);
+ } else {
+ encoded_name = PyUnicode_AsUTF8String(name);
++ if (!encoded_name)
++ return -1;
+ }
+ PyErr_Format(PyExc_AttributeError, "'%.100s' object has no attribute '%.200s'", tp->tp_name, PyString_AsString(encoded_name));
+ Py_DECREF(encoded_name);
+diff --git a/Lib/python/pystrings.swg b/Lib/python/pystrings.swg
+index fd37855eb..301e0f3e1 100644
+--- a/Lib/python/pystrings.swg
++++ b/Lib/python/pystrings.swg
+@@ -16,6 +16,7 @@ SWIG_AsCharPtrAndSize(PyObject *obj, char** cptr, size_t* psize, int *alloc)
+ %#endif
+ {
+ char *cstr; Py_ssize_t len;
++ int ret = SWIG_OK;
+ %#if PY_VERSION_HEX>=0x03000000
+ %#if !defined(SWIG_PYTHON_STRICT_BYTE_CHAR)
+ if (!alloc && cptr) {
+@@ -26,7 +27,10 @@ SWIG_AsCharPtrAndSize(PyObject *obj, char** cptr, size_t* psize, int *alloc)
+ return SWIG_RuntimeError;
+ }
+ obj = PyUnicode_AsUTF8String(obj);
+- if(alloc) *alloc = SWIG_NEWOBJ;
++ if (!obj)
++ return SWIG_TypeError;
++ if (alloc)
++ *alloc = SWIG_NEWOBJ;
+ %#endif
+ PyBytes_AsStringAndSize(obj, &cstr, &len);
+ %#else
+@@ -64,6 +68,8 @@ SWIG_AsCharPtrAndSize(PyObject *obj, char** cptr, size_t* psize, int *alloc)
+ %#endif
+ %#else
+ *cptr = SWIG_Python_str_AsChar(obj);
++ if (!*cptr)
++ ret = SWIG_TypeError;
+ %#endif
+ }
+ }
+@@ -71,7 +77,7 @@ SWIG_AsCharPtrAndSize(PyObject *obj, char** cptr, size_t* psize, int *alloc)
+ %#if PY_VERSION_HEX>=0x03000000 && !defined(SWIG_PYTHON_STRICT_BYTE_CHAR)
+ Py_XDECREF(obj);
+ %#endif
+- return SWIG_OK;
++ return ret;
+ } else {
+ %#if defined(SWIG_PYTHON_2_UNICODE)
+ %#if defined(SWIG_PYTHON_STRICT_BYTE_CHAR)
+@@ -84,6 +90,8 @@ SWIG_AsCharPtrAndSize(PyObject *obj, char** cptr, size_t* psize, int *alloc)
+ return SWIG_RuntimeError;
+ }
+ obj = PyUnicode_AsUTF8String(obj);
++ if (!obj)
++ return SWIG_TypeError;
+ if (PyString_AsStringAndSize(obj, &cstr, &len) != -1) {
+ if (cptr) {
+ if (alloc) *alloc = SWIG_NEWOBJ;
+--
+2.21.1
+
diff --git a/swig-3.0.12-Correct-php-testcase.patch b/swig-3.0.12-Correct-php-testcase.patch
new file mode 100644
index 0000000..b90f5f9
--- /dev/null
+++ b/swig-3.0.12-Correct-php-testcase.patch
@@ -0,0 +1,26 @@
+From 0a9113dcba2930b658cb67f9ba1c63ad8eebd88f Mon Sep 17 00:00:00 2001
+From: William S Fulton
+Date: Tue, 19 Sep 2017 07:37:29 +0100
+Subject: [PATCH] Correct php testcase
+
+---
+ Examples/test-suite/php/preproc_constants_runme.php | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/Examples/test-suite/php/preproc_constants_runme.php b/Examples/test-suite/php/preproc_constants_runme.php
+index ef32867..bd216c2 100644
+--- a/Examples/test-suite/php/preproc_constants_runme.php
++++ b/Examples/test-suite/php/preproc_constants_runme.php
+@@ -61,8 +61,8 @@ check::equal(gettype(preproc_constants::EXPR_OR), "integer", "preproc_constants.
+ check::equal(gettype(preproc_constants::EXPR_LAND), "boolean", "preproc_constants.EXPR_LAND has unexpected type");
+ check::equal(gettype(preproc_constants::EXPR_LOR), "boolean", "preproc_constants.EXPR_LOR has unexpected type");
+ check::equal(gettype(preproc_constants::EXPR_CONDITIONAL), "double", "preproc_constants.EXPR_CONDITIONAL has unexpected type");
++check::equal(gettype(preproc_constants::EXPR_MIXED1), "double", "preproc_constants.EXPR_MIXED1 has unexpected type");
+ check::equal(gettype(preproc_constants::EXPR_WCHAR_MAX), "integer", "preproc_constants.EXPR_WCHAR_MAX has unexpected type");
+ check::equal(gettype(preproc_constants::EXPR_WCHAR_MIN), "integer", "preproc_constants.EXPR_WCHAR_MIN has unexpected type");
+-check::equal(gettype(preproc_constants::EXPR_MIXED1), "integer", "preproc_constants.EXPR_MIXED1 has unexpected type");
+
+ ?>
+--
+2.9.5
+
diff --git a/swig-3.0.12-Coverity-fix-issue-reported-for-SWIG_Python_ConvertF.patch b/swig-3.0.12-Coverity-fix-issue-reported-for-SWIG_Python_ConvertF.patch
new file mode 100644
index 0000000..9fff13b
--- /dev/null
+++ b/swig-3.0.12-Coverity-fix-issue-reported-for-SWIG_Python_ConvertF.patch
@@ -0,0 +1,58 @@
+From 21f532975f59f0c156c76cc739f5a93f57d8f6cb Mon Sep 17 00:00:00 2001
+From: Mark Dufour
+Date: Tue, 14 Feb 2017 10:48:30 +0100
+Subject: [PATCH] [Coverity] fix issue reported for
+ SWIG_Python_ConvertFunctionPtr
+
+Fix Coverity issue reported for SWIG_Python_ConvertFunctionPtr:
+
+"Execution cannot reach this statement: *ptr = vptr;"
+
+Because if 'ty' is null, then desc becomes null and we return with
+SWIG_ERROR. So 'ty' cannot be null at 'if (ty)'.
+---
+ Lib/python/pyrun.swg | 21 +++++++++------------
+ 1 file changed, 9 insertions(+), 12 deletions(-)
+
+diff --git a/Lib/python/pyrun.swg b/Lib/python/pyrun.swg
+index ab1237f62..939a69204 100644
+--- a/Lib/python/pyrun.swg
++++ b/Lib/python/pyrun.swg
+@@ -1287,25 +1287,22 @@ SWIG_Python_ConvertFunctionPtr(PyObject *obj, void **ptr, swig_type_info *ty) {
+ return SWIG_ConvertPtr(obj, ptr, ty, 0);
+ } else {
+ void *vptr = 0;
+-
++ swig_cast_info *tc;
++
+ /* here we get the method pointer for callbacks */
+ const char *doc = (((PyCFunctionObject *)obj) -> m_ml -> ml_doc);
+ const char *desc = doc ? strstr(doc, "swig_ptr: ") : 0;
+ if (desc)
+ desc = ty ? SWIG_UnpackVoidPtr(desc + 10, &vptr, ty->name) : 0;
+- if (!desc)
++ if (!desc)
+ return SWIG_ERROR;
+- if (ty) {
+- swig_cast_info *tc = SWIG_TypeCheck(desc,ty);
+- if (tc) {
+- int newmemory = 0;
+- *ptr = SWIG_TypeCast(tc,vptr,&newmemory);
+- assert(!newmemory); /* newmemory handling not yet implemented */
+- } else {
+- return SWIG_ERROR;
+- }
++ tc = SWIG_TypeCheck(desc,ty);
++ if (tc) {
++ int newmemory = 0;
++ *ptr = SWIG_TypeCast(tc,vptr,&newmemory);
++ assert(!newmemory); /* newmemory handling not yet implemented */
+ } else {
+- *ptr = vptr;
++ return SWIG_ERROR;
+ }
+ return SWIG_OK;
+ }
+--
+2.14.3
+
diff --git a/swig-3.0.12-Coverity-fix-issue-reported-for-SWIG_Python_FixMetho.patch b/swig-3.0.12-Coverity-fix-issue-reported-for-SWIG_Python_FixMetho.patch
new file mode 100644
index 0000000..990bd40
--- /dev/null
+++ b/swig-3.0.12-Coverity-fix-issue-reported-for-SWIG_Python_FixMetho.patch
@@ -0,0 +1,36 @@
+From 9825fcbab5c4ddd867432f9922bebfbec7b78af0 Mon Sep 17 00:00:00 2001
+From: Mark Dufour
+Date: Tue, 14 Feb 2017 10:34:37 +0100
+Subject: [PATCH] [Coverity] fix issue reported for SWIG_Python_FixMethods
+
+Fix Coverity issue reported for SWIG_Python_FixMethods:
+
+"buffer_size: Calling strncpy with a source string whose length
+(10 chars) is greater than or equal to the size argument (10)
+will fail to null-terminate buff."
+
+The issue is only reported for the "swig_ptr: " line, but for
+consistency we replace both occurrences of strncpy with memcpy.
+---
+ Lib/python/pyinit.swg | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+diff --git a/Lib/python/pyinit.swg b/Lib/python/pyinit.swg
+index 2cc582841..fe45ac941 100644
+--- a/Lib/python/pyinit.swg
++++ b/Lib/python/pyinit.swg
+@@ -306,9 +306,9 @@ SWIG_Python_FixMethods(PyMethodDef *methods,
+ char *ndoc = (char*)malloc(ldoc + lptr + 10);
+ if (ndoc) {
+ char *buff = ndoc;
+- strncpy(buff, methods[i].ml_doc, ldoc);
++ memcpy(buff, methods[i].ml_doc, ldoc);
+ buff += ldoc;
+- strncpy(buff, "swig_ptr: ", 10);
++ memcpy(buff, "swig_ptr: ", 10);
+ buff += 10;
+ SWIG_PackVoidPtr(buff, ptr, ty->name, lptr);
+ methods[i].ml_doc = ndoc;
+--
+2.14.3
+
diff --git a/swig-3.0.12-Coverity-fix-issue-reported-for-wrapper-argument-che.patch b/swig-3.0.12-Coverity-fix-issue-reported-for-wrapper-argument-che.patch
new file mode 100644
index 0000000..d0fe997
--- /dev/null
+++ b/swig-3.0.12-Coverity-fix-issue-reported-for-wrapper-argument-che.patch
@@ -0,0 +1,41 @@
+From 13eeebd2fb3005abc876957c68bde6a92510aa44 Mon Sep 17 00:00:00 2001
+From: Mark Dufour
+Date: Tue, 14 Feb 2017 10:53:14 +0100
+Subject: [PATCH] [Coverity] fix issue reported for wrapper argument checking
+
+Fix Coverity issue reported for wrapper argument checking:
+
+"Null-checking args suggests that it may be null, but it has already
+been dereferenced on all paths leading to the check."
+
+So 'args' is null checked, but after dereferencing it with
+PyTuple_Check(args).
+---
+ Source/Modules/python.cxx | 11 ++++++++---
+ 1 file changed, 8 insertions(+), 3 deletions(-)
+
+diff --git a/Source/Modules/python.cxx b/Source/Modules/python.cxx
+index a6801fc4e..5e058e773 100644
+--- a/Source/Modules/python.cxx
++++ b/Source/Modules/python.cxx
+@@ -2541,9 +2541,14 @@ public:
+
+ if (!fastunpack) {
+ Wrapper_add_local(f, "ii", "Py_ssize_t ii");
+- if (maxargs - (add_self ? 1 : 0) > 0)
+- Append(f->code, "if (!PyTuple_Check(args)) SWIG_fail;\n");
+- Append(f->code, "argc = args ? PyObject_Length(args) : 0;\n");
++
++ if (maxargs - (add_self ? 1 : 0) > 0) {
++ Append(f->code, "if (!PyTuple_Check(args)) SWIG_fail;\n");
++ Append(f->code, "argc = PyObject_Length(args);\n");
++ } else {
++ Append(f->code, "argc = args ? PyObject_Length(args) : 0;\n");
++ }
++
+ if (add_self)
+ Append(f->code, "argv[0] = self;\n");
+ Printf(f->code, "for (ii = 0; (ii < %d) && (ii < argc); ii++) {\n", add_self ? maxargs - 1 : maxargs);
+--
+2.14.3
+
diff --git a/swig-3.0.12-Fix-Coverity-issue-reported-for-setslice-pycontainer.patch b/swig-3.0.12-Fix-Coverity-issue-reported-for-setslice-pycontainer.patch
new file mode 100644
index 0000000..041619e
--- /dev/null
+++ b/swig-3.0.12-Fix-Coverity-issue-reported-for-setslice-pycontainer.patch
@@ -0,0 +1,40 @@
+From 5803e81d488e97623fe29b8629b977be01a8229e Mon Sep 17 00:00:00 2001
+From: Mark Dufour
+Date: Mon, 6 Mar 2017 21:16:41 +0100
+Subject: [PATCH] Fix Coverity issue reported for setslice (pycontainer.swg):
+
+"CID 11151 (#3-1 of 3): Using invalid iterator (INVALIDATE_ITERATOR)18.
+increment_iterator: Incrementing iterator it though it is already past
+the end of its container."
+
+Coverity does not understand 'replace_count', so warns that we may go
+past self->end() (or self->rend() I guess).
+---
+ Lib/python/pycontainer.swg | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+diff --git a/Lib/python/pycontainer.swg b/Lib/python/pycontainer.swg
+index d40b0baa8..9aefb4fc7 100644
+--- a/Lib/python/pycontainer.swg
++++ b/Lib/python/pycontainer.swg
+@@ -351,7 +351,7 @@ namespace swig {
+ typename Sequence::const_iterator isit = is.begin();
+ typename Sequence::iterator it = self->begin();
+ std::advance(it,ii);
+- for (size_t rc=0; rcend(); ++rc) {
+ *it++ = *isit++;
+ for (Py_ssize_t c=0; c<(step-1) && it != self->end(); ++c)
+ it++;
+@@ -367,7 +367,7 @@ namespace swig {
+ typename Sequence::const_iterator isit = is.begin();
+ typename Sequence::reverse_iterator it = self->rbegin();
+ std::advance(it,size-ii-1);
+- for (size_t rc=0; rcrend(); ++rc) {
+ *it++ = *isit++;
+ for (Py_ssize_t c=0; c<(-step-1) && it != self->rend(); ++c)
+ it++;
+--
+2.14.3
+
diff --git a/swig-3.0.12-Fix-generated-code-for-constant-expressions-containi.patch b/swig-3.0.12-Fix-generated-code-for-constant-expressions-containi.patch
new file mode 100644
index 0000000..7198c21
--- /dev/null
+++ b/swig-3.0.12-Fix-generated-code-for-constant-expressions-containi.patch
@@ -0,0 +1,191 @@
+From 90ba174fcea1618af57aa594199541d47a89b7f6 Mon Sep 17 00:00:00 2001
+From: William S Fulton
+Date: Sun, 17 Sep 2017 19:02:55 +0100
+Subject: [PATCH 1/2] Fix generated code for constant expressions containing
+ wchar_t L literals.
+
+Such as:
+ # define __WCHAR_MAX (0x7fffffff + L'\0')
+
+Reported on swig-user mailing list.
+---
+ CHANGES.current | 5 +++++
+ Examples/test-suite/csharp/preproc_constants_c_runme.cs | 3 ++-
+ Examples/test-suite/csharp/preproc_constants_runme.cs | 2 ++
+ Examples/test-suite/d/preproc_constants_c_runme.1.d | 2 ++
+ Examples/test-suite/d/preproc_constants_c_runme.2.d | 2 ++
+ Examples/test-suite/d/preproc_constants_runme.1.d | 2 ++
+ Examples/test-suite/d/preproc_constants_runme.2.d | 2 ++
+ Examples/test-suite/php/preproc_constants_c_runme.php | 2 ++
+ Examples/test-suite/php/preproc_constants_runme.php | 2 ++
+ Examples/test-suite/php5/preproc_constants_c_runme.php | 2 ++
+ Examples/test-suite/php5/preproc_constants_runme.php | 2 ++
+ Examples/test-suite/preproc_constants.i | 3 +++
+ Source/CParse/parser.y | 2 +-
+ 13 files changed, 29 insertions(+), 2 deletions(-)
+
+#diff --git a/CHANGES.current b/CHANGES.current
+#index 1e4a244..b455a9f 100644
+#--- a/CHANGES.current
+#+++ b/CHANGES.current
+#@@ -7,6 +7,11 @@ the issue number to the end of the URL: https://github.com/swig/swig/issues/
+# Version 4.0.0 (in progress)
+# ===========================
+#
+#+2017-09-17: wsfulton
+#+ Fix generated code for constant expressions containing wchar_t L literals such as:
+#+ # define __WCHAR_MAX (0x7fffffff + L'\0')
+#+ # define __WCHAR_MIN (-__WCHAR_MAX - 1)
+#+
+# 2017-09-10: mlamarre
+# [Python] Patch #1083. Define_DEBUG to 1 to do exactly like Visual Studio
+# /LDd, /MDd or /MTd compiler options.
+diff --git a/Examples/test-suite/csharp/preproc_constants_c_runme.cs b/Examples/test-suite/csharp/preproc_constants_c_runme.cs
+index 76c684d..1c28e49 100644
+--- a/Examples/test-suite/csharp/preproc_constants_c_runme.cs
++++ b/Examples/test-suite/csharp/preproc_constants_c_runme.cs
+@@ -61,7 +61,8 @@ public class runme {
+ assert( typeof(int) == preproc_constants_c.EXPR_LAND.GetType() );
+ assert( typeof(int) == preproc_constants_c.EXPR_LOR.GetType() );
+ assert( typeof(double) == preproc_constants_c.EXPR_CONDITIONAL.GetType() );
+-
++ assert( typeof(int) == preproc_constants_c.EXPR_WCHAR_MAX.GetType() );
++ assert( typeof(int) == preproc_constants_c.EXPR_WCHAR_MIN.GetType() );
+ }
+ static void assert(bool assertion) {
+ if (!assertion)
+diff --git a/Examples/test-suite/csharp/preproc_constants_runme.cs b/Examples/test-suite/csharp/preproc_constants_runme.cs
+index 9fae591..6b02e30 100644
+--- a/Examples/test-suite/csharp/preproc_constants_runme.cs
++++ b/Examples/test-suite/csharp/preproc_constants_runme.cs
+@@ -60,6 +60,8 @@ public class runme {
+ assert( typeof(bool) == preproc_constants.EXPR_LAND.GetType() );
+ assert( typeof(bool) == preproc_constants.EXPR_LOR.GetType() );
+ assert( typeof(double) == preproc_constants.EXPR_CONDITIONAL.GetType() );
++ assert( typeof(int) == preproc_constants.EXPR_WCHAR_MAX.GetType() );
++ assert( typeof(int) == preproc_constants.EXPR_WCHAR_MIN.GetType() );
+
+ }
+ static void assert(bool assertion) {
+diff --git a/Examples/test-suite/d/preproc_constants_c_runme.1.d b/Examples/test-suite/d/preproc_constants_c_runme.1.d
+index d846c71..2b349af 100644
+--- a/Examples/test-suite/d/preproc_constants_c_runme.1.d
++++ b/Examples/test-suite/d/preproc_constants_c_runme.1.d
+@@ -61,4 +61,6 @@ void main() {
+ static assert(is(int == typeof(EXPR_LAND())));
+ static assert(is(int == typeof(EXPR_LOR())));
+ static assert(is(double == typeof(EXPR_CONDITIONAL())));
++ static assert(is(int == typeof(EXPR_WCHAR_MAX())));
++ static assert(is(int == typeof(EXPR_WCHAR_MIN())));
+ }
+diff --git a/Examples/test-suite/d/preproc_constants_c_runme.2.d b/Examples/test-suite/d/preproc_constants_c_runme.2.d
+index 9bdbb93..1bac525 100644
+--- a/Examples/test-suite/d/preproc_constants_c_runme.2.d
++++ b/Examples/test-suite/d/preproc_constants_c_runme.2.d
+@@ -61,4 +61,6 @@ void main() {
+ static assert(is(int == typeof(EXPR_LAND())));
+ static assert(is(int == typeof(EXPR_LOR())));
+ static assert(is(double == typeof(EXPR_CONDITIONAL())));
++ static assert(is(int == typeof(EXPR_WCHAR_MAX())));
++ static assert(is(int == typeof(EXPR_WCHAR_MIN())));
+ }
+diff --git a/Examples/test-suite/d/preproc_constants_runme.1.d b/Examples/test-suite/d/preproc_constants_runme.1.d
+index 009405f..f743f48 100644
+--- a/Examples/test-suite/d/preproc_constants_runme.1.d
++++ b/Examples/test-suite/d/preproc_constants_runme.1.d
+@@ -60,4 +60,6 @@ void main() {
+ static assert(is(bool == typeof(EXPR_LAND())));
+ static assert(is(bool == typeof(EXPR_LOR())));
+ static assert(is(double == typeof(EXPR_CONDITIONAL())));
++ static assert(is(int == typeof(EXPR_WCHAR_MAX())));
++ static assert(is(int == typeof(EXPR_WCHAR_MIN())));
+ }
+diff --git a/Examples/test-suite/d/preproc_constants_runme.2.d b/Examples/test-suite/d/preproc_constants_runme.2.d
+index 2d92ef0..0d96c37 100644
+--- a/Examples/test-suite/d/preproc_constants_runme.2.d
++++ b/Examples/test-suite/d/preproc_constants_runme.2.d
+@@ -60,4 +60,6 @@ void main() {
+ static assert(is(bool == typeof(EXPR_LAND())));
+ static assert(is(bool == typeof(EXPR_LOR())));
+ static assert(is(double == typeof(EXPR_CONDITIONAL())));
++ static assert(is(int == typeof(EXPR_WCHAR_MAX())));
++ static assert(is(int == typeof(EXPR_WCHAR_MIN())));
+ }
+diff --git a/Examples/test-suite/php/preproc_constants_c_runme.php b/Examples/test-suite/php/preproc_constants_c_runme.php
+index af9b76e..e59fe18 100644
+--- a/Examples/test-suite/php/preproc_constants_c_runme.php
++++ b/Examples/test-suite/php/preproc_constants_c_runme.php
+@@ -62,5 +62,7 @@ check::equal(gettype(preproc_constants_c::EXPR_OR), "integer", "preproc_constant
+ check::equal(gettype(preproc_constants_c::EXPR_LAND), "integer", "preproc_constants.EXPR_LAND has unexpected type");
+ check::equal(gettype(preproc_constants_c::EXPR_LOR), "integer", "preproc_constants.EXPR_LOR has unexpected type");
+ check::equal(gettype(preproc_constants_c::EXPR_CONDITIONAL), "double", "preproc_constants.EXPR_CONDITIONAL has unexpected type");
++check::equal(gettype(preproc_constants_c::EXPR_WCHAR_MAX), "integer", "preproc_constants.EXPR_WCHAR_MAX has unexpected type");
++check::equal(gettype(preproc_constants_c::EXPR_WCHAR_MIN), "integer", "preproc_constants.EXPR_WCHAR_MIN has unexpected type");
+
+ ?>
+diff --git a/Examples/test-suite/php/preproc_constants_runme.php b/Examples/test-suite/php/preproc_constants_runme.php
+index 5c9119b..8e117ea 100644
+--- a/Examples/test-suite/php/preproc_constants_runme.php
++++ b/Examples/test-suite/php/preproc_constants_runme.php
+@@ -61,5 +61,7 @@ check::equal(gettype(preproc_constants::EXPR_OR), "integer", "preproc_constants.
+ check::equal(gettype(preproc_constants::EXPR_LAND), "boolean", "preproc_constants.EXPR_LAND has unexpected type");
+ check::equal(gettype(preproc_constants::EXPR_LOR), "boolean", "preproc_constants.EXPR_LOR has unexpected type");
+ check::equal(gettype(preproc_constants::EXPR_CONDITIONAL), "double", "preproc_constants.EXPR_CONDITIONAL has unexpected type");
++check::equal(gettype(preproc_constants::EXPR_WCHAR_MAX), "integer", "preproc_constants.EXPR_WCHAR_MAX has unexpected type");
++check::equal(gettype(preproc_constants::EXPR_WCHAR_MIN), "integer", "preproc_constants.EXPR_WCHAR_MIN has unexpected type");
+
+ ?>
+diff --git a/Examples/test-suite/php5/preproc_constants_c_runme.php b/Examples/test-suite/php5/preproc_constants_c_runme.php
+index 1ea0195..d978fab 100644
+--- a/Examples/test-suite/php5/preproc_constants_c_runme.php
++++ b/Examples/test-suite/php5/preproc_constants_c_runme.php
+@@ -62,5 +62,7 @@ check::equal(gettype(preproc_constants_c::EXPR_OR), "integer", "preproc_constant
+ check::equal(gettype(preproc_constants_c::EXPR_LAND), "integer", "preproc_constants.EXPR_LAND has unexpected type");
+ check::equal(gettype(preproc_constants_c::EXPR_LOR), "integer", "preproc_constants.EXPR_LOR has unexpected type");
+ check::equal(gettype(preproc_constants_c::EXPR_CONDITIONAL), "double", "preproc_constants.EXPR_CONDITIONAL has unexpected type");
++check::equal(gettype(preproc_constants_c::EXPR_WCHAR_MAX), "integer", "preproc_constants.EXPR_WCHAR_MAX has unexpected type");
++check::equal(gettype(preproc_constants_c::EXPR_WCHAR_MIN), "integer", "preproc_constants.EXPR_WCHAR_MIN has unexpected type");
+
+ ?>
+diff --git a/Examples/test-suite/php5/preproc_constants_runme.php b/Examples/test-suite/php5/preproc_constants_runme.php
+index fb9ee4f..7527026 100644
+--- a/Examples/test-suite/php5/preproc_constants_runme.php
++++ b/Examples/test-suite/php5/preproc_constants_runme.php
+@@ -70,5 +70,7 @@ check::equal(gettype(preproc_constants::EXPR_LAND), "integer", "preproc_constant
+ check::equal(gettype(preproc_constants::EXPR_LOR), "integer", "preproc_constants.EXPR_LOR has unexpected type");
+
+ check::equal(gettype(preproc_constants::EXPR_CONDITIONAL), "double", "preproc_constants.EXPR_CONDITIONAL has unexpected type");
++check::equal(gettype(preproc_constants::EXPR_WCHAR_MAX), "integer", "preproc_constants.EXPR_WCHAR_MAX has unexpected type");
++check::equal(gettype(preproc_constants::EXPR_WCHAR_MIN), "integer", "preproc_constants.EXPR_WCHAR_MIN has unexpected type");
+
+ ?>
+diff --git a/Examples/test-suite/preproc_constants.i b/Examples/test-suite/preproc_constants.i
+index 3a999ad..16b44c9 100644
+--- a/Examples/test-suite/preproc_constants.i
++++ b/Examples/test-suite/preproc_constants.i
+@@ -87,6 +87,9 @@
+ #define EXPR_LOR 0xFF || 1
+ #define EXPR_CONDITIONAL true ? 2 : 2.2
+
++#define EXPR_WCHAR_MAX (0x7fffffff + L'\0')
++#define EXPR_WCHAR_MIN (-EXPR_WCHAR_MAX - 1)
++
+ #define EXPR_CHAR_COMPOUND_ADD 'A' + 12
+ #define EXPR_CHAR_COMPOUND_LSHIFT 'B' << 6
+ #define H_SUPPRESS_SCALING_MAGIC (('s'<<24) | ('u'<<16) | ('p'<<8) | 'p')
+diff --git a/Source/CParse/parser.y b/Source/CParse/parser.y
+index 2e92cd0..273dadb 100644
+--- a/Source/CParse/parser.y
++++ b/Source/CParse/parser.y
+@@ -194,7 +194,7 @@ int SWIG_cparse_template_reduce(int treduce) {
+ * ----------------------------------------------------------------------------- */
+
+ static int promote_type(int t) {
+- if (t <= T_UCHAR || t == T_CHAR) return T_INT;
++ if (t <= T_UCHAR || t == T_CHAR || t == T_WCHAR) return T_INT;
+ return t;
+ }
+
+--
+2.9.5
+
diff --git a/swig-3.0.12-Fix-go-version-matching-in-configure-for-go1.10.patch b/swig-3.0.12-Fix-go-version-matching-in-configure-for-go1.10.patch
new file mode 100644
index 0000000..69e22dd
--- /dev/null
+++ b/swig-3.0.12-Fix-go-version-matching-in-configure-for-go1.10.patch
@@ -0,0 +1,51 @@
+From 5f6012039abb6ec9e9dfea801effa6b02fd102bc Mon Sep 17 00:00:00 2001
+From: Vsevolod Kvachev
+Date: Thu, 19 Apr 2018 23:04:37 +0300
+Subject: [PATCH] Fix go version matching in configure for go1.10
+
+---
+ configure.ac | 10 +++++-----
+ 1 file changed, 5 insertions(+), 5 deletions(-)
+
+diff --git a/configure.ac b/configure.ac
+index 833cb37bf..ba1631743 100644
+--- a/configure.ac
++++ b/configure.ac
+@@ -2597,7 +2597,7 @@ else
+ GOVERSIONOPTION=version
+ go_version=$($GO $GOVERSIONOPTION | sed -e 's/go version //')
+ case "$go_version" in
+- go1 | go1.[[01234]]*)
++ go1 | go1.[[01234]] | go1.[[01234]].*)
+ GOC=$(sh -c "$(go env) && echo \$GOCHAR")c
+ ;;
+ *)
+@@ -2606,7 +2606,7 @@ else
+ esac
+ AC_MSG_CHECKING([whether go version is too old])
+ case $go_version in
+- go1.1* | go1.0* | go1 )
++ go1.1.* | go1.1 | go1.0 | go1.0.* | go1 )
+ AC_MSG_RESULT([yes - minimum version is 1.2])
+ GO=
+ GOOPT="-intgosize 32"
+@@ -2624,13 +2624,13 @@ else
+ ;;
+ esac
+ case $go_version in
+- go1.0* | go1 | go1.1*)
++ go1.0 | go1.0.* | go1 | go1.1 | go1.1.*)
+ GOOPT="$GOOPT -use-shlib"
+ ;;
+- go1.2*)
++ go1.2 | go1.2.*)
+ GO12=true
+ ;;
+- go1.3* | go1.4*)
++ go1.3 | go1.3.* | go1.4 | go1.4.*)
+ GO13=true
+ ;;
+ *)
+--
+2.14.3
+
diff --git a/swig-3.0.12-Fix-testsuite-to-work-without-.-in-INC.patch b/swig-3.0.12-Fix-testsuite-to-work-without-.-in-INC.patch
new file mode 100644
index 0000000..bcc8a79
--- /dev/null
+++ b/swig-3.0.12-Fix-testsuite-to-work-without-.-in-INC.patch
@@ -0,0 +1,61 @@
+From 8855ef2b482c09da9255079b0fac92d08c8308fb Mon Sep 17 00:00:00 2001
+From: Olly Betts
+Date: Tue, 13 Jun 2017 17:32:37 +1200
+Subject: [PATCH] [Perl] Fix testsuite to work without . in @INC
+
+"." was removed from @INC in Perl 5.26 for security reasons, and has
+also been removed from older versions in some distros.
+
+Fixes https://github.com/swig/swig/issues/997 reported by lfam.
+---
+ CHANGES.current | 6 ++++++
+ Examples/Makefile.in | 2 +-
+ Examples/test-suite/perl5/run-perl-test.pl | 2 +-
+ 3 files changed, 8 insertions(+), 2 deletions(-)
+
+#diff --git a/CHANGES.current b/CHANGES.current
+#index ac620c9..6b379a9 100644
+#--- a/CHANGES.current
+#+++ b/CHANGES.current
+#@@ -7,6 +7,12 @@ the issue number to the end of the URL: https://github.com/swig/swig/issues/
+# Version 4.0.0 (in progress)
+# ===========================
+#
+#+2017-06-13: olly
+#+ [Perl] Fix testsuite to work without . in @INC - it was removed in
+#+ Perl 5.26 for security reasons, and has also been removed from
+#+ older versions in some distros. Fixes
+#+ https://github.com/swig/swig/issues/997 reported by lfam.
+#+
+# 2017-06-03: wsfulton
+# Fix %import on a file containing a file scope %fragment forced inclusion to not
+# generate the fragment contents as %import should not result in code being generated.
+diff --git a/Examples/Makefile.in b/Examples/Makefile.in
+index 7682b56..8a88fb5 100644
+--- a/Examples/Makefile.in
++++ b/Examples/Makefile.in
+@@ -282,7 +282,7 @@ perl5_static_cpp: $(SRCDIR_SRCS)
+ # -----------------------------------------------------------------
+
+ perl5_run:
+- $(RUNTOOL) $(PERL) $(PERL5_SCRIPT) $(RUNPIPE)
++ $(RUNTOOL) $(PERL) -I. $(PERL5_SCRIPT) $(RUNPIPE)
+
+ # -----------------------------------------------------------------
+ # Version display
+diff --git a/Examples/test-suite/perl5/run-perl-test.pl b/Examples/test-suite/perl5/run-perl-test.pl
+index 106bf00..5ea4e511 100644
+--- a/Examples/test-suite/perl5/run-perl-test.pl
++++ b/Examples/test-suite/perl5/run-perl-test.pl
+@@ -7,7 +7,7 @@ use strict;
+
+ my $command = shift @ARGV;
+
+-my $output = `$^X $command 2>&1`;
++my $output = `$^X -I. $command 2>&1`;
+
+ die "SWIG Perl test failed: \n\n$output\n"
+ if $?;
+--
+2.9.4
+
diff --git a/swig-3.0.12-Fix-type-promotion-wrapping-some-non-trivial-constan.patch b/swig-3.0.12-Fix-type-promotion-wrapping-some-non-trivial-constan.patch
new file mode 100644
index 0000000..4be4f2f
--- /dev/null
+++ b/swig-3.0.12-Fix-type-promotion-wrapping-some-non-trivial-constan.patch
@@ -0,0 +1,185 @@
+From 9e2a12416cf6ce7b926829aff353fe2d9019f135 Mon Sep 17 00:00:00 2001
+From: William S Fulton
+Date: Mon, 18 Sep 2017 07:06:27 +0100
+Subject: [PATCH 2/2] Fix type promotion wrapping some non-trivial constant
+ expressions
+
+This was previously an integral type instead of a floating point type:
+---
+ CHANGES.current | 5 +++++
+ Examples/test-suite/csharp/preproc_constants_c_runme.cs | 1 +
+ Examples/test-suite/csharp/preproc_constants_runme.cs | 1 +
+ Examples/test-suite/d/preproc_constants_c_runme.1.d | 1 +
+ Examples/test-suite/d/preproc_constants_c_runme.2.d | 1 +
+ Examples/test-suite/d/preproc_constants_runme.1.d | 1 +
+ Examples/test-suite/d/preproc_constants_runme.2.d | 1 +
+ Examples/test-suite/php/preproc_constants_c_runme.php | 1 +
+ Examples/test-suite/php/preproc_constants_runme.php | 1 +
+ Examples/test-suite/php5/preproc_constants_c_runme.php | 1 +
+ Examples/test-suite/php5/preproc_constants_runme.php | 1 +
+ Examples/test-suite/preproc_constants.i | 1 +
+ Source/CParse/parser.y | 1 +
+ 13 files changed, 17 insertions(+)
+
+#diff --git a/CHANGES.current b/CHANGES.current
+#index b455a9f..f76e5a5 100644
+#--- a/CHANGES.current
+#+++ b/CHANGES.current
+#@@ -7,6 +7,11 @@ the issue number to the end of the URL: https://github.com/swig/swig/issues/
+# Version 4.0.0 (in progress)
+# ===========================
+#
+#+2017-09-18: wsfulton
+#+ Fix type promotion wrapping constant expressions of the form:
+#+ # define EXPR_MIXED1 (0x80 + 11.1) - 1
+#+ This was previously an integral type instead of a floating point type.
+#+
+# 2017-09-17: wsfulton
+# Fix generated code for constant expressions containing wchar_t L literals such as:
+# # define __WCHAR_MAX (0x7fffffff + L'\0')
+diff --git a/Examples/test-suite/csharp/preproc_constants_c_runme.cs b/Examples/test-suite/csharp/preproc_constants_c_runme.cs
+index 1c28e49..7f40ce4 100644
+--- a/Examples/test-suite/csharp/preproc_constants_c_runme.cs
++++ b/Examples/test-suite/csharp/preproc_constants_c_runme.cs
+@@ -61,6 +61,7 @@ public class runme {
+ assert( typeof(int) == preproc_constants_c.EXPR_LAND.GetType() );
+ assert( typeof(int) == preproc_constants_c.EXPR_LOR.GetType() );
+ assert( typeof(double) == preproc_constants_c.EXPR_CONDITIONAL.GetType() );
++ assert( typeof(double) == preproc_constants_c.EXPR_MIXED1.GetType() );
+ assert( typeof(int) == preproc_constants_c.EXPR_WCHAR_MAX.GetType() );
+ assert( typeof(int) == preproc_constants_c.EXPR_WCHAR_MIN.GetType() );
+ }
+diff --git a/Examples/test-suite/csharp/preproc_constants_runme.cs b/Examples/test-suite/csharp/preproc_constants_runme.cs
+index 6b02e30..0d8981f 100644
+--- a/Examples/test-suite/csharp/preproc_constants_runme.cs
++++ b/Examples/test-suite/csharp/preproc_constants_runme.cs
+@@ -60,6 +60,7 @@ public class runme {
+ assert( typeof(bool) == preproc_constants.EXPR_LAND.GetType() );
+ assert( typeof(bool) == preproc_constants.EXPR_LOR.GetType() );
+ assert( typeof(double) == preproc_constants.EXPR_CONDITIONAL.GetType() );
++ assert( typeof(double) == preproc_constants.EXPR_MIXED1.GetType() );
+ assert( typeof(int) == preproc_constants.EXPR_WCHAR_MAX.GetType() );
+ assert( typeof(int) == preproc_constants.EXPR_WCHAR_MIN.GetType() );
+
+diff --git a/Examples/test-suite/d/preproc_constants_c_runme.1.d b/Examples/test-suite/d/preproc_constants_c_runme.1.d
+index 2b349af..b79ee3b 100644
+--- a/Examples/test-suite/d/preproc_constants_c_runme.1.d
++++ b/Examples/test-suite/d/preproc_constants_c_runme.1.d
+@@ -61,6 +61,7 @@ void main() {
+ static assert(is(int == typeof(EXPR_LAND())));
+ static assert(is(int == typeof(EXPR_LOR())));
+ static assert(is(double == typeof(EXPR_CONDITIONAL())));
++ static assert(is(double == typeof(EXPR_MIXED1())));
+ static assert(is(int == typeof(EXPR_WCHAR_MAX())));
+ static assert(is(int == typeof(EXPR_WCHAR_MIN())));
+ }
+diff --git a/Examples/test-suite/d/preproc_constants_c_runme.2.d b/Examples/test-suite/d/preproc_constants_c_runme.2.d
+index 1bac525..260bf8d 100644
+--- a/Examples/test-suite/d/preproc_constants_c_runme.2.d
++++ b/Examples/test-suite/d/preproc_constants_c_runme.2.d
+@@ -61,6 +61,7 @@ void main() {
+ static assert(is(int == typeof(EXPR_LAND())));
+ static assert(is(int == typeof(EXPR_LOR())));
+ static assert(is(double == typeof(EXPR_CONDITIONAL())));
++ static assert(is(double == typeof(EXPR_MIXED1())));
+ static assert(is(int == typeof(EXPR_WCHAR_MAX())));
+ static assert(is(int == typeof(EXPR_WCHAR_MIN())));
+ }
+diff --git a/Examples/test-suite/d/preproc_constants_runme.1.d b/Examples/test-suite/d/preproc_constants_runme.1.d
+index f743f48..84a99c8 100644
+--- a/Examples/test-suite/d/preproc_constants_runme.1.d
++++ b/Examples/test-suite/d/preproc_constants_runme.1.d
+@@ -60,6 +60,7 @@ void main() {
+ static assert(is(bool == typeof(EXPR_LAND())));
+ static assert(is(bool == typeof(EXPR_LOR())));
+ static assert(is(double == typeof(EXPR_CONDITIONAL())));
++ static assert(is(double == typeof(EXPR_MIXED1())));
+ static assert(is(int == typeof(EXPR_WCHAR_MAX())));
+ static assert(is(int == typeof(EXPR_WCHAR_MIN())));
+ }
+diff --git a/Examples/test-suite/d/preproc_constants_runme.2.d b/Examples/test-suite/d/preproc_constants_runme.2.d
+index 0d96c37..f6638f4 100644
+--- a/Examples/test-suite/d/preproc_constants_runme.2.d
++++ b/Examples/test-suite/d/preproc_constants_runme.2.d
+@@ -60,6 +60,7 @@ void main() {
+ static assert(is(bool == typeof(EXPR_LAND())));
+ static assert(is(bool == typeof(EXPR_LOR())));
+ static assert(is(double == typeof(EXPR_CONDITIONAL())));
++ static assert(is(double == typeof(EXPR_MIXED1())));
+ static assert(is(int == typeof(EXPR_WCHAR_MAX())));
+ static assert(is(int == typeof(EXPR_WCHAR_MIN())));
+ }
+diff --git a/Examples/test-suite/php/preproc_constants_c_runme.php b/Examples/test-suite/php/preproc_constants_c_runme.php
+index e59fe18..20868dc 100644
+--- a/Examples/test-suite/php/preproc_constants_c_runme.php
++++ b/Examples/test-suite/php/preproc_constants_c_runme.php
+@@ -62,6 +62,7 @@ check::equal(gettype(preproc_constants_c::EXPR_OR), "integer", "preproc_constant
+ check::equal(gettype(preproc_constants_c::EXPR_LAND), "integer", "preproc_constants.EXPR_LAND has unexpected type");
+ check::equal(gettype(preproc_constants_c::EXPR_LOR), "integer", "preproc_constants.EXPR_LOR has unexpected type");
+ check::equal(gettype(preproc_constants_c::EXPR_CONDITIONAL), "double", "preproc_constants.EXPR_CONDITIONAL has unexpected type");
++check::equal(gettype(preproc_constants_c::EXPR_MIXED1), "double", "preproc_constants.EXPR_MIXED1 has unexpected type");
+ check::equal(gettype(preproc_constants_c::EXPR_WCHAR_MAX), "integer", "preproc_constants.EXPR_WCHAR_MAX has unexpected type");
+ check::equal(gettype(preproc_constants_c::EXPR_WCHAR_MIN), "integer", "preproc_constants.EXPR_WCHAR_MIN has unexpected type");
+
+diff --git a/Examples/test-suite/php/preproc_constants_runme.php b/Examples/test-suite/php/preproc_constants_runme.php
+index 8e117ea..ef32867 100644
+--- a/Examples/test-suite/php/preproc_constants_runme.php
++++ b/Examples/test-suite/php/preproc_constants_runme.php
+@@ -63,5 +63,6 @@ check::equal(gettype(preproc_constants::EXPR_LOR), "boolean", "preproc_constants
+ check::equal(gettype(preproc_constants::EXPR_CONDITIONAL), "double", "preproc_constants.EXPR_CONDITIONAL has unexpected type");
+ check::equal(gettype(preproc_constants::EXPR_WCHAR_MAX), "integer", "preproc_constants.EXPR_WCHAR_MAX has unexpected type");
+ check::equal(gettype(preproc_constants::EXPR_WCHAR_MIN), "integer", "preproc_constants.EXPR_WCHAR_MIN has unexpected type");
++check::equal(gettype(preproc_constants::EXPR_MIXED1), "integer", "preproc_constants.EXPR_MIXED1 has unexpected type");
+
+ ?>
+diff --git a/Examples/test-suite/php5/preproc_constants_c_runme.php b/Examples/test-suite/php5/preproc_constants_c_runme.php
+index d978fab..d55d423 100644
+--- a/Examples/test-suite/php5/preproc_constants_c_runme.php
++++ b/Examples/test-suite/php5/preproc_constants_c_runme.php
+@@ -62,6 +62,7 @@ check::equal(gettype(preproc_constants_c::EXPR_OR), "integer", "preproc_constant
+ check::equal(gettype(preproc_constants_c::EXPR_LAND), "integer", "preproc_constants.EXPR_LAND has unexpected type");
+ check::equal(gettype(preproc_constants_c::EXPR_LOR), "integer", "preproc_constants.EXPR_LOR has unexpected type");
+ check::equal(gettype(preproc_constants_c::EXPR_CONDITIONAL), "double", "preproc_constants.EXPR_CONDITIONAL has unexpected type");
++check::equal(gettype(preproc_constants_c::EXPR_MIXED1), "double", "preproc_constants.EXPR_MIXED1 has unexpected type");
+ check::equal(gettype(preproc_constants_c::EXPR_WCHAR_MAX), "integer", "preproc_constants.EXPR_WCHAR_MAX has unexpected type");
+ check::equal(gettype(preproc_constants_c::EXPR_WCHAR_MIN), "integer", "preproc_constants.EXPR_WCHAR_MIN has unexpected type");
+
+diff --git a/Examples/test-suite/php5/preproc_constants_runme.php b/Examples/test-suite/php5/preproc_constants_runme.php
+index 7527026..01137b0 100644
+--- a/Examples/test-suite/php5/preproc_constants_runme.php
++++ b/Examples/test-suite/php5/preproc_constants_runme.php
+@@ -70,6 +70,7 @@ check::equal(gettype(preproc_constants::EXPR_LAND), "integer", "preproc_constant
+ check::equal(gettype(preproc_constants::EXPR_LOR), "integer", "preproc_constants.EXPR_LOR has unexpected type");
+
+ check::equal(gettype(preproc_constants::EXPR_CONDITIONAL), "double", "preproc_constants.EXPR_CONDITIONAL has unexpected type");
++check::equal(gettype(preproc_constants::EXPR_MIXED1), "double", "preproc_constants.EXPR_MIXED1 has unexpected type");
+ check::equal(gettype(preproc_constants::EXPR_WCHAR_MAX), "integer", "preproc_constants.EXPR_WCHAR_MAX has unexpected type");
+ check::equal(gettype(preproc_constants::EXPR_WCHAR_MIN), "integer", "preproc_constants.EXPR_WCHAR_MIN has unexpected type");
+
+diff --git a/Examples/test-suite/preproc_constants.i b/Examples/test-suite/preproc_constants.i
+index 16b44c9..628cae1 100644
+--- a/Examples/test-suite/preproc_constants.i
++++ b/Examples/test-suite/preproc_constants.i
+@@ -86,6 +86,7 @@
+ #define EXPR_LAND 0xFF && 1
+ #define EXPR_LOR 0xFF || 1
+ #define EXPR_CONDITIONAL true ? 2 : 2.2
++#define EXPR_MIXED1 (0x80 + 11.1) - 1
+
+ #define EXPR_WCHAR_MAX (0x7fffffff + L'\0')
+ #define EXPR_WCHAR_MIN (-EXPR_WCHAR_MAX - 1)
+diff --git a/Source/CParse/parser.y b/Source/CParse/parser.y
+index 273dadb..3df9896 100644
+--- a/Source/CParse/parser.y
++++ b/Source/CParse/parser.y
+@@ -6338,6 +6338,7 @@ valexpr : exprnum { $$ = $1; }
+ break;
+ }
+ }
++ $$.type = promote($2.type, $4.type);
+ }
+ | LPAREN expr pointer RPAREN expr %prec CAST {
+ $$ = $5;
+--
+2.9.5
+
diff --git a/swig-4.0.2-Fix-char-typecheck-typemap-to-accept-Null.patch b/swig-4.0.2-Fix-char-typecheck-typemap-to-accept-Null.patch
new file mode 100644
index 0000000..b293d2f
--- /dev/null
+++ b/swig-4.0.2-Fix-char-typecheck-typemap-to-accept-Null.patch
@@ -0,0 +1,82 @@
+From b7dedecfdd708c5323addc1b28e16cc727e01980 Mon Sep 17 00:00:00 2001
+From: Olly Betts
+Date: Thu, 18 Mar 2021 10:53:58 +1300
+Subject: [PATCH] php: Fix char* typecheck typemap to accept Null
+
+The corresponding in typemap already does.
+
+Fixes #1655, reported by CJSlominski.
+---
+ CHANGES.current | 4 ++++
+ Examples/test-suite/overload_polymorphic.i | 3 +++
+ .../test-suite/php/overload_polymorphic_runme.php | 14 ++++++++++++++
+ Lib/php/php.swg | 5 ++++-
+ 4 files changed, 25 insertions(+), 1 deletion(-)
+ create mode 100644 Examples/test-suite/php/overload_polymorphic_runme.php
+
+#diff --git a/CHANGES.current b/CHANGES.current
+#index 58fd05a56..f287e3d60 100644
+#--- a/CHANGES.current
+#+++ b/CHANGES.current
+#@@ -7,6 +7,10 @@ the issue number to the end of the URL: https://github.com/swig/swig/issues/
+# Version 4.1.0 (in progress)
+# ===========================
+#
+#+2021-03-18: olly
+#+ #1655 [PHP] Fix char* typecheck typemap to accept PHP Null like the
+#+ corresponding in typemap does.
+#+
+# 2021-03-18: olly
+# #1900, #1905 [PHP] Fix wrapping of overloaded directed methods with
+# non-void return.
+diff --git a/Examples/test-suite/overload_polymorphic.i b/Examples/test-suite/overload_polymorphic.i
+index ac004f948..72aabd840 100644
+--- a/Examples/test-suite/overload_polymorphic.i
++++ b/Examples/test-suite/overload_polymorphic.i
+@@ -23,4 +23,7 @@ class Unknown;
+ int test2(Unknown* unknown) { return 0; }
+ int test2(Base* base) { return 1; }
+
++int test3(const char*, const Base* = 0, bool = false) { return 0; }
++int test3(Base&, const char* = 0, const Base* = 0, bool = false) { return 1; }
++
+ %}
+diff --git a/Examples/test-suite/php/overload_polymorphic_runme.php b/Examples/test-suite/php/overload_polymorphic_runme.php
+new file mode 100644
+index 000000000..0afe16808
+--- /dev/null
++++ b/Examples/test-suite/php/overload_polymorphic_runme.php
+@@ -0,0 +1,14 @@
++
+diff --git a/Lib/php/php.swg b/Lib/php/php.swg
+index 4eba6be2a..ccfd371ab 100644
+--- a/Lib/php/php.swg
++++ b/Lib/php/php.swg
+@@ -465,7 +465,10 @@
+ %php_typecheck(double,SWIG_TYPECHECK_DOUBLE,IS_DOUBLE)
+ %php_typecheck(char,SWIG_TYPECHECK_CHAR,IS_STRING)
+
+-%typemap(typecheck,precedence=SWIG_TYPECHECK_STRING) char *, char *&, char []
++%typemap(typecheck,precedence=SWIG_TYPECHECK_STRING) char *, char *&
++ " $1 = (Z_TYPE($input) == IS_STRING || Z_TYPE($input) == IS_NULL); "
++
++%typemap(typecheck,precedence=SWIG_TYPECHECK_STRING) char []
+ " $1 = (Z_TYPE($input) == IS_STRING); "
+
+ %typecheck(SWIG_TYPECHECK_POINTER) SWIGTYPE
+--
+2.26.3
+
diff --git a/swig-4.0.2-Fix-overloaded-directed-methods-with-non-void-re.patch b/swig-4.0.2-Fix-overloaded-directed-methods-with-non-void-re.patch
new file mode 100644
index 0000000..1cc5e91
--- /dev/null
+++ b/swig-4.0.2-Fix-overloaded-directed-methods-with-non-void-re.patch
@@ -0,0 +1,101 @@
+From 2e7da86b2ced479e48741cc8713479dee426be61 Mon Sep 17 00:00:00 2001
+From: Olly Betts
+Date: Wed, 9 Dec 2020 09:48:55 +1300
+Subject: [PATCH] php: Fix overloaded directed methods with non-void return
+
+We were treating such methods like constructors and assigning to the
+internal _cPtr, which just seems bizarrely wrong.
+
+Fixes #1900
+---
+ CHANGES.current | 4 ++++
+ Examples/test-suite/director_overload.i | 11 ++++++++++-
+ .../test-suite/php/director_overload_runme.php | 18 ++++++++++++++++++
+ Source/Modules/php.cxx | 4 ++--
+ 4 files changed, 34 insertions(+), 3 deletions(-)
+ create mode 100644 Examples/test-suite/php/director_overload_runme.php
+
+#diff --git a/CHANGES.current b/CHANGES.current
+#index acaea3aea..58fd05a56 100644
+#--- a/CHANGES.current
+#+++ b/CHANGES.current
+#@@ -7,6 +7,10 @@ the issue number to the end of the URL: https://github.com/swig/swig/issues/
+# Version 4.1.0 (in progress)
+# ===========================
+#
+#+2021-03-18: olly
+#+ #1900, #1905 [PHP] Fix wrapping of overloaded directed methods with
+#+ non-void return.
+#+
+# 2021-03-11: murillo128
+# #1498 [Javascript] Support type conversion.
+#
+diff --git a/Examples/test-suite/director_overload.i b/Examples/test-suite/director_overload.i
+index 604ffe5ca..d6feb122b 100644
+--- a/Examples/test-suite/director_overload.i
++++ b/Examples/test-suite/director_overload.i
+@@ -47,5 +47,14 @@ public:
+ virtual void notover(int *p) const {}
+ };
+
+-%}
++class OverloadedGetSet
++{
++ int v;
++public:
++ OverloadedGetSet() : v(42) { }
++ virtual ~OverloadedGetSet() { }
++ virtual int rw() const { return v; }
++ virtual void rw(int new_v) { v = new_v; }
++};
+
++%}
+diff --git a/Examples/test-suite/php/director_overload_runme.php b/Examples/test-suite/php/director_overload_runme.php
+new file mode 100644
+index 000000000..f5fc56b65
+--- /dev/null
++++ b/Examples/test-suite/php/director_overload_runme.php
+@@ -0,0 +1,18 @@
++
++rw(), 42, "get_set() initial value not 42");
++check::equal($o->rw(7), null, "get_set() failed to set");
++check::equal($o->rw(), 7, "get_set() didn't return back set value");
++
++check::done();
++?>
+diff --git a/Source/Modules/php.cxx b/Source/Modules/php.cxx
+index 1edbd874c..eaae32d63 100644
+--- a/Source/Modules/php.cxx
++++ b/Source/Modules/php.cxx
+@@ -1566,7 +1566,7 @@ public:
+ Printf(prepare, "case %d: ", ++last_handled_i);
+ }
+ if (non_void_return) {
+- if ((!directorsEnabled() || !Swig_directorclass(n)) && !constructor) {
++ if (!constructor) {
+ Append(prepare, "$r=");
+ } else if (wrapperType == staticmemberfn || wrapperType == staticmembervar) {
+ Append(prepare, "$r=");
+@@ -1590,7 +1590,7 @@ public:
+ if (had_a_case)
+ Printf(prepare, "default: ");
+ if (non_void_return) {
+- if ((!directorsEnabled() || !Swig_directorclass(n)) && !constructor) {
++ if (!constructor) {
+ Append(prepare, "$r=");
+ } else if (wrapperType == staticmemberfn || wrapperType == staticmembervar) {
+ Append(prepare, "$r=");
+--
+2.26.3
+
diff --git a/swig-4.0.2-Improve-PHP-object-creation.patch b/swig-4.0.2-Improve-PHP-object-creation.patch
new file mode 100644
index 0000000..2239053
--- /dev/null
+++ b/swig-4.0.2-Improve-PHP-object-creation.patch
@@ -0,0 +1,82 @@
+From 71475b0af9677deeaf6fe55c0c5f53fec9f730d2 Mon Sep 17 00:00:00 2001
+From: Olly Betts
+Date: Thu, 18 Mar 2021 15:50:52 +1300
+Subject: [PATCH] Improve PHP object creation
+
+Reportedly the code we were using in the directorin case gave segfaults
+in PHP 7.2 and later - we've been unable to reproduce these, but the new
+approach is also simpler and should be bit faster too.
+
+Fixes #1527, #1975
+---
+ CHANGES.current | 6 ++++++
+ Lib/php/phprun.swg | 14 +++++---------
+ 2 files changed, 11 insertions(+), 9 deletions(-)
+
+#diff --git a/CHANGES.current b/CHANGES.current
+#index f287e3d60..79d41001f 100644
+#--- a/CHANGES.current
+#+++ b/CHANGES.current
+#@@ -7,6 +7,12 @@ the issue number to the end of the URL: https://github.com/swig/swig/issues/
+# Version 4.1.0 (in progress)
+# ===========================
+#
+#+2021-03-19: olly
+#+ #1527 [PHP] Improve PHP object creation in directorin case.
+#+ Reportedly the code we were using in this case gave segfaults in
+#+ PHP 7.2 and later - we've been unable to reproduce these, but the
+#+ new approach is also simpler and should be bit faster too.
+#+
+# 2021-03-18: olly
+# #1655 [PHP] Fix char* typecheck typemap to accept PHP Null like the
+# corresponding in typemap does.
+diff --git a/Lib/php/phprun.swg b/Lib/php/phprun.swg
+index a07a1b9f8..f3a4e6ad1 100644
+--- a/Lib/php/phprun.swg
++++ b/Lib/php/phprun.swg
+@@ -90,15 +90,13 @@ SWIG_SetPointerZval(zval *z, void *ptr, swig_type_info *type, int newobject) {
+ } else {
+ /*
+ * Wrap the resource in an object, the resource will be accessible
+- * via the "_cPtr" member. This is currently only used by
++ * via the "_cPtr" property. This code path is currently only used by
+ * directorin typemaps.
+ */
+- zval resource;
+ zend_class_entry *ce = NULL;
+ const char *type_name = type->name+3; /* +3 so: _p_Foo -> Foo */
+ size_t type_name_len;
+ const char * p;
+- HashTable * ht;
+
+ /* Namespace__Foo -> Foo */
+ /* FIXME: ugly and goes wrong for classes with __ in their names. */
+@@ -107,7 +105,6 @@ SWIG_SetPointerZval(zval *z, void *ptr, swig_type_info *type, int newobject) {
+ }
+ type_name_len = strlen(type_name);
+
+- ZVAL_RES(&resource, zend_register_resource(value, *(int *)(type->clientdata)));
+ if (SWIG_PREFIX_LEN > 0) {
+ zend_string * classname = zend_string_alloc(SWIG_PREFIX_LEN + type_name_len, 0);
+ memcpy(classname->val, SWIG_PREFIX, SWIG_PREFIX_LEN);
+@@ -121,13 +118,12 @@ SWIG_SetPointerZval(zval *z, void *ptr, swig_type_info *type, int newobject) {
+ }
+ if (ce == NULL) {
+ /* class does not exist */
+- ce = zend_standard_class_def;
++ object_init(z);
++ } else {
++ object_init_ex(z, ce);
+ }
+
+- ALLOC_HASHTABLE(ht);
+- zend_hash_init(ht, 1, NULL, NULL, 0);
+- zend_hash_str_update(ht, "_cPtr", sizeof("_cPtr") - 1, &resource);
+- object_and_properties_init(z, ce, ht);
++ add_property_resource_ex(z, "_cPtr", sizeof("_cPtr") - 1, zend_register_resource(value, *(int *)(type->clientdata)));
+ }
+ return;
+ }
+--
+2.26.3
+
diff --git a/swig-4.0.2-Support-PHP8.patch b/swig-4.0.2-Support-PHP8.patch
new file mode 100644
index 0000000..56e9831
--- /dev/null
+++ b/swig-4.0.2-Support-PHP8.patch
@@ -0,0 +1,409 @@
+From 3584c7d49cb598ce79d5e285d6c17b2dedfe3ecb Mon Sep 17 00:00:00 2001
+From: Olly Betts
+Date: Wed, 17 Mar 2021 12:45:17 +1300
+Subject: [PATCH 1/4] Add initial support for PHP8
+
+Testcase director_overload2 is failing, but the rest of the testsuite
+passes.
+---
+ .travis.yml | 4 ++
+ Doc/Manual/Php.html | 6 +-
+ Doc/Manual/Preprocessor.html | 2 +-
+ Doc/Manual/SWIG.html | 2 +-
+ Examples/Makefile.in | 6 +-
+ .../php/evil_diamond_prop_runme.php | 2 +-
+ Lib/cdata.i | 2 +-
+ Lib/exception.i | 2 +-
+ Lib/php/phprun.swg | 8 ++-
+ Source/Modules/php.cxx | 55 +++++++++++++++----
+ configure.ac | 10 ++--
+ 11 files changed, 72 insertions(+), 27 deletions(-)
+
+#diff --git a/.travis.yml b/.travis.yml
+#index 8c293c2f9fb..9477bed946f 100644
+#--- a/.travis.yml
+#+++ b/.travis.yml
+#@@ -154,6 +154,10 @@ matrix:
+# os: linux
+# env: SWIGLANG=php VER=7.4
+# dist: xenial
+#+ - compiler: gcc
+#+ os: linux
+#+ env: SWIGLANG=php VER=8.0
+#+ dist: xenial
+# - compiler: gcc
+# os: linux
+# env: SWIGLANG=python # 2.7
+diff --git a/Doc/Manual/Php.html b/Doc/Manual/Php.html
+index 09c514e944a..4b91958894a 100644
+--- a/Doc/Manual/Php.html
++++ b/Doc/Manual/Php.html
+@@ -51,12 +51,12 @@
+
+
+ In this chapter, we discuss SWIG's support of PHP. SWIG currently supports
+-generating wrappers for PHP7. Support for PHP5 was removed in SWIG 4.0.0
+-and support for PHP4 was removed in SWIG 1.3.37.
++generating wrappers for PHP7 and PHP8. Support for PHP5 was removed in SWIG
++4.0.0 and support for PHP4 was removed in SWIG 1.3.37.
+
+
+
+-Currently any PHP7 release should work.
++Currently any PHP7 or PHP8 release should work.
+
+
+
+diff --git a/Doc/Manual/Preprocessor.html b/Doc/Manual/Preprocessor.html
+index 51cc0637836..0c704bde959 100644
+--- a/Doc/Manual/Preprocessor.html
++++ b/Doc/Manual/Preprocessor.html
+@@ -123,7 +123,7 @@
+ -lua - Generate Lua wrappers
+ -octave - Generate Octave wrappers
+ -perl5 - Generate Perl 5 wrappers
+- -php7 - Generate PHP 7 wrappers
++ -php7 - Generate PHP 7 or later wrappers
+ -python - Generate Python wrappers
+ -r - Generate R (aka GNU S) wrappers
+ -ruby - Generate Ruby wrappers
+diff --git a/Examples/Makefile.in b/Examples/Makefile.in
+index 3f6140b5e79..3978a959836 100644
+--- a/Examples/Makefile.in
++++ b/Examples/Makefile.in
+@@ -1045,7 +1045,7 @@ ruby_clean:
+ rm -f *.@OBJEXT@ *$(RUBY_SO)
+
+ ##################################################################
+-##### PHP7 ######
++##### PHP ######
+ ##################################################################
+
+ PHP = @PHP@
+@@ -1058,7 +1058,7 @@ PHP_SCRIPT = $(SRCDIR)$(RUNME).php
+ # -------------------------------------------------------------------
+
+ php: $(SRCDIR_SRCS)
+- $(SWIG) -php7 $(SWIGOPT) -o $(ISRCS) $(INTERFACEPATH)
++ $(SWIG) -php $(SWIGOPT) -o $(ISRCS) $(INTERFACEPATH)
+ $(CC) -c $(CCSHARED) $(CPPFLAGS) $(CFLAGS) $(SRCDIR_SRCS) $(ISRCS) $(INCLUDES) $(PHP_INCLUDE)
+ $(LDSHARED) $(CFLAGS) $(LDFLAGS) $(OBJS) $(IOBJS) $(LIBS) -o $(LIBPREFIX)$(TARGET)$(PHP_SO)
+
+@@ -1067,7 +1067,7 @@ php: $(SRCDIR_SRCS)
+ # --------------------------------------------------------------------
+
+ php_cpp: $(SRCDIR_SRCS)
+- $(SWIG) -php7 -c++ $(SWIGOPT) -o $(ICXXSRCS) $(INTERFACEPATH)
++ $(SWIG) -php -c++ $(SWIGOPT) -o $(ICXXSRCS) $(INTERFACEPATH)
+ $(CXX) -c $(CCSHARED) $(CPPFLAGS) $(CXXFLAGS) $(SRCDIR_SRCS) $(SRCDIR_CXXSRCS) $(ICXXSRCS) $(INCLUDES) $(PHP_INCLUDE)
+ $(CXXSHARED) $(CXXFLAGS) $(LDFLAGS) $(OBJS) $(IOBJS) $(LIBS) $(CPP_DLLIBS) -o $(LIBPREFIX)$(TARGET)$(PHP_SO)
+
+diff --git a/Examples/test-suite/php/evil_diamond_prop_runme.php b/Examples/test-suite/php/evil_diamond_prop_runme.php
+index 9bdb7435f1c..645328affda 100644
+--- a/Examples/test-suite/php/evil_diamond_prop_runme.php
++++ b/Examples/test-suite/php/evil_diamond_prop_runme.php
+@@ -31,7 +31,7 @@
+ check::equal(1,$spam->_foo,"1==spam->_foo");
+ check::equal(2,$spam->_bar,"2==spam->_bar");
+ // multiple inheritance not supported in PHP
+-set_error_handler(NULL, 0); // Don't complain that _baz is unknown.
++set_error_handler(function () {return true;}, E_NOTICE|E_WARNING); // Don't complain that _baz is unknown.
+ check::equal(null,$spam->_baz,"null==spam->_baz");
+ restore_error_handler();
+ check::equal(4,$spam->_spam,"4==spam->_spam");
+diff --git a/Lib/cdata.i b/Lib/cdata.i
+index f18ed4af53c..cd15266431e 100644
+--- a/Lib/cdata.i
++++ b/Lib/cdata.i
+@@ -21,7 +21,7 @@ typedef struct SWIGCDATA {
+ }
+ %typemap(in) (const void *indata, int inlen) = (char *STRING, int LENGTH);
+
+-#elif SWIGPHP7
++#elif SWIGPHP
+
+ %typemap(out) SWIGCDATA {
+ ZVAL_STRINGL($result, $1.data, $1.len);
+diff --git a/Lib/exception.i b/Lib/exception.i
+index ee9ce9bc632..3d6eeccdf2e 100644
+--- a/Lib/exception.i
++++ b/Lib/exception.i
+@@ -12,7 +12,7 @@
+ %insert("runtime") "swigerrors.swg"
+
+
+-#ifdef SWIGPHP7
++#ifdef SWIGPHP
+ %{
+ #include "zend_exceptions.h"
+ #define SWIG_exception(code, msg) do { zend_throw_exception(NULL, (char*)msg, code); goto thrown; } while (0)
+diff --git a/Lib/php/phprun.swg b/Lib/php/phprun.swg
+index f3a4e6ad1a9..04919878743 100644
+--- a/Lib/php/phprun.swg
++++ b/Lib/php/phprun.swg
+@@ -12,8 +12,8 @@ extern "C" {
+ #include "zend_exceptions.h"
+ #include "php.h"
+
+-#if PHP_MAJOR_VERSION != 7
+-# error These bindings need PHP7 - to generate PHP5 bindings use: SWIG < 4.0.0 and swig -php5
++#if PHP_MAJOR_VERSION < 7
++# error These bindings need PHP 7 or later - to generate PHP5 bindings use: SWIG < 4.0.0 and swig -php5
+ #endif
+
+ #include "ext/standard/php_string.h"
+@@ -200,7 +200,11 @@ SWIG_ConvertPtr(zval *z, void **ptr, swig_type_info *ty, int flags) {
+
+ switch (Z_TYPE_P(z)) {
+ case IS_OBJECT: {
++#if PHP_MAJOR_VERSION < 8
+ HashTable * ht = Z_OBJ_HT_P(z)->get_properties(z);
++#else
++ HashTable * ht = Z_OBJ_HT_P(z)->get_properties(Z_OBJ_P(z));
++#endif
+ if (ht) {
+ zval * _cPtr = zend_hash_str_find(ht, "_cPtr", sizeof("_cPtr") - 1);
+ if (_cPtr) {
+diff --git a/Source/Modules/php.cxx b/Source/Modules/php.cxx
+index eaae32d633b..d8ee75b45fb 100644
+--- a/Source/Modules/php.cxx
++++ b/Source/Modules/php.cxx
+@@ -473,6 +473,20 @@ class PHP : public Language {
+ s_arginfo = NewString("/* arginfo subsection */\n");
+ arginfo_used = NewHash();
+
++ // Add arginfo we'll definitely need for *_alter_newobject and *_get_newobject.
++ SetFlag(arginfo_used, "1");
++ Append(s_arginfo,
++ "ZEND_BEGIN_ARG_INFO_EX(swig_arginfo_1, 0, 0, 0)\n"
++ " ZEND_ARG_INFO(0,arg1)\n"
++ "ZEND_END_ARG_INFO()\n");
++
++ SetFlag(arginfo_used, "2");
++ Append(s_arginfo,
++ "ZEND_BEGIN_ARG_INFO_EX(swig_arginfo_2, 0, 0, 0)\n"
++ " ZEND_ARG_INFO(0,arg1)\n"
++ " ZEND_ARG_INFO(0,arg2)\n"
++ "ZEND_END_ARG_INFO()\n");
++
+ /* start the function entry section */
+ s_entry = NewString("/* entry subsection */\n");
+
+@@ -653,8 +667,8 @@ class PHP : public Language {
+ }
+ Printv(f_begin, s_vdecl, s_wrappers, NIL);
+ Printv(f_begin, all_cs_entry, "\n\n", s_arginfo, "\n\n", s_entry,
+- " SWIG_ZEND_NAMED_FE(swig_", module, "_alter_newobject,_wrap_swig_", module, "_alter_newobject,NULL)\n"
+- " SWIG_ZEND_NAMED_FE(swig_", module, "_get_newobject,_wrap_swig_", module, "_get_newobject,NULL)\n"
++ " SWIG_ZEND_NAMED_FE(swig_", module, "_alter_newobject,_wrap_swig_", module, "_alter_newobject,swig_arginfo_2)\n"
++ " SWIG_ZEND_NAMED_FE(swig_", module, "_get_newobject,_wrap_swig_", module, "_get_newobject,swig_arginfo_1)\n"
+ " ZEND_FE_END\n};\n\n", NIL);
+ Printv(f_begin, s_init, NIL);
+ Delete(s_header);
+@@ -689,25 +703,46 @@ class PHP : public Language {
+
+ // We want to only emit each different arginfo once, as that reduces the
+ // size of both the generated source code and the compiled extension
+- // module. To do this, we name the arginfo to encode the number of
+- // parameters and which (if any) are passed by reference by using a
+- // sequence of 0s (for non-reference) and 1s (for by references).
++ // module. The parameters at this level are just named arg1, arg2, etc
++ // so we generate an arginfo name with the number of parameters and a
++ // bitmap value saying which (if any) are passed by reference.
+ ParmList *l = Getattr(n, "parms");
+- String * arginfo_code = NewStringEmpty();
++ unsigned long bitmap = 0, bit = 1;
++ int n_params = 0;
++ bool overflowed = false;
+ for (Parm *p = l; p; p = Getattr(p, "tmap:in:next")) {
+ /* Ignored parameters */
+ if (checkAttribute(p, "tmap:in:numinputs", "0")) {
+ continue;
+ }
+- Append(arginfo_code, GetFlag(p, "tmap:in:byref") ? "1" : "0");
++ ++n_params;
++ if (GetFlag(p, "tmap:in:byref")) {
++ bitmap |= bit;
++ if (bit == 0) overflowed = true;
++ }
++ bit <<= 1;
++ }
++ String * arginfo_code;
++ if (overflowed) {
++ // We overflowed the bitmap so just generate a unique name - this only
++ // happens for a function with more parameters than bits in a long
++ // where a high numbered parameter is passed by reference, so should be
++ // rare in practice.
++ static int overflowed_counter = 0;
++ arginfo_code = NewStringf("z%d", ++overflowed_counter);
++ } else if (bitmap == 0) {
++ // No parameters passed by reference.
++ arginfo_code = NewStringf("%d", n_params);
++ } else {
++ arginfo_code = NewStringf("%d_%lx", n_params, bitmap);
+ }
+
+ if (!GetFlag(arginfo_used, arginfo_code)) {
+- // Not had this one before, so emit it.
++ // Not had this one before so emit it.
+ SetFlag(arginfo_used, arginfo_code);
+ Printf(s_arginfo, "ZEND_BEGIN_ARG_INFO_EX(swig_arginfo_%s, 0, 0, 0)\n", arginfo_code);
+- for (const char * p = Char(arginfo_code); *p; ++p) {
+- Printf(s_arginfo, " ZEND_ARG_PASS_INFO(%c)\n", *p);
++ for (Parm *p = l; p; p = Getattr(p, "tmap:in:next")) {
++ Printf(s_arginfo, " ZEND_ARG_INFO(%d,%s)\n", GetFlag(p, "tmap:in:byref"), Getattr(p, "lname"));
+ }
+ Printf(s_arginfo, "ZEND_END_ARG_INFO()\n");
+ }
+diff --git a/configure.ac b/configure.ac
+index 7d5824a06b5..1894001c521 100644
+--- a/configure.ac
++++ b/configure.ac
+@@ -2021,7 +2021,7 @@ AC_SUBST(RUBYSO)
+ AC_SUBST(RUBYDYNAMICLINKING)
+
+ #-------------------------------------------------------------------------
+-# Look for PHP7
++# Look for PHP
+ #-------------------------------------------------------------------------
+
+ PHPBIN=
+@@ -2035,7 +2035,7 @@ if test x"${PHPBIN}" = xno; then
+ PHP=
+ else
+ if test "x$PHPBIN" = xyes; then
+- AC_CHECK_PROGS(PHP, [php7.3 php7.2 php7.1 php7.0 php])
++ AC_CHECK_PROGS(PHP, [php8.0 php7.4 php7.3 php7.2 php7.1 php7.0 php])
+ else
+ PHP=$PHPBIN
+ fi
+@@ -2046,12 +2046,14 @@ else
+ case $PHP in
+ *7.*)
+ PHPCONFIG=`echo "$PHP"|sed 's/7\...*$/-config&/'` ;;
++ *8.*)
++ PHPCONFIG=`echo "$PHP"|sed 's/8\...*$/-config&/'` ;;
+ *)
+ PHPCONFIG=$PHP-config ;;
+ esac
+ php_version=`$PHPCONFIG --version 2>/dev/null`
+ case $php_version in
+- 7.*)
++ 7.*|8.*)
+ PHPINC=`$PHPCONFIG --includes 2>/dev/null`
+ if test -n "$PHPINC"; then
+ AC_MSG_RESULT($PHPINC)
+@@ -2062,7 +2064,7 @@ else
+ "")
+ AC_MSG_RESULT([could not find $PHPCONFIG or obtain PHP version from it]) ;;
+ *)
+- AC_MSG_RESULT([found PHP $php_version - not PHP 7]) ;;
++ AC_MSG_RESULT([found PHP $php_version - not PHP 7 or 8]) ;;
+ esac
+ fi
+ fi
+
+From fd96627b2fc65353c03b160efd60fdce864d386c Mon Sep 17 00:00:00 2001
+From: Olly Betts
+Date: Wed, 17 Mar 2021 13:00:02 +1300
+Subject: [PATCH 2/4] Temporary hack so testsuite passes for PHP8
+
+---
+ Examples/test-suite/director_overload2.i | 4 ++++
+ 1 file changed, 4 insertions(+)
+
+diff --git a/Examples/test-suite/director_overload2.i b/Examples/test-suite/director_overload2.i
+index e467c18cea6..ddfa65bb4d3 100644
+--- a/Examples/test-suite/director_overload2.i
++++ b/Examples/test-suite/director_overload2.i
+@@ -14,11 +14,15 @@ struct OverloadDerived1 : OverloadBase {
+ virtual void nnn(int vvv) {}
+ #if defined(__SUNPRO_CC)
+ virtual void nnn() {}
++#elif defined(SWIGPHP) // FIXME: Hack to stop director_overload2 failing for PHP8
++ virtual void nnn() {}
+ #endif
+ };
+ struct OverloadDerived2 : OverloadBase {
+ #if defined(__SUNPRO_CC)
+ virtual void nnn(int vvv) {}
++#elif defined(SWIGPHP) // FIXME: Hack to stop director_overload2 failing for PHP8
++ virtual void nnn(int vvv) {}
+ #endif
+ virtual void nnn() {}
+ };
+
+From 4c3e85fbd47f804b5956bf37f0073795296ddde2 Mon Sep 17 00:00:00 2001
+From: Olly Betts
+Date: Sun, 21 Mar 2021 10:43:06 +1300
+Subject: [PATCH 3/4] Clarify what SWIGPHP7 means
+
+---
+ Doc/Manual/Preprocessor.html | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/Doc/Manual/Preprocessor.html b/Doc/Manual/Preprocessor.html
+index 0c704bde959..7611ea40c2b 100644
+--- a/Doc/Manual/Preprocessor.html
++++ b/Doc/Manual/Preprocessor.html
+@@ -123,7 +123,7 @@ 11.3 Conditional Compilation
+Date: Sun, 21 Mar 2021 10:54:17 +1300
+Subject: [PATCH 4/4] Update CHANGES.current and RELEASENOTES re PHP8
+
+---
+ CHANGES.current | 3 +++
+ RELEASENOTES | 3 +++
+ 2 files changed, 6 insertions(+)
+
+#diff --git a/CHANGES.current b/CHANGES.current
+#index 79d41001f0a..6ae5689ee37 100644
+#--- a/CHANGES.current
+#+++ b/CHANGES.current
+#@@ -7,6 +7,9 @@ the issue number to the end of the URL: https://github.com/swig/swig/issues/
+# Version 4.1.0 (in progress)
+# ===========================
+#
+#+2021-03-21: olly
+#+ #1929, #1978 [PHP] Add support for PHP 8.
+#+
+# 2021-03-19: olly
+# #1527 [PHP] Improve PHP object creation in directorin case.
+# Reportedly the code we were using in this case gave segfaults in
+diff --git a/RELEASENOTES b/RELEASENOTES
+index cc3ba07121d..55590108759 100644
+--- a/RELEASENOTES
++++ b/RELEASENOTES
+@@ -7,6 +7,9 @@ Release Notes
+ Detailed release notes are available with the release and are also
+ published on the SWIG web site at http://swig.org/release.html.
+
++SWIG-4.2.0 summary:
++- Add PHP 8 support.
++
+ SWIG-4.0.2 summary:
+ - A few fixes around doxygen comment handling.
+ - Ruby 2.7 support added.
diff --git a/swig-Upgrade-to-support-newer-NodeJS.patch b/swig-Upgrade-to-support-newer-NodeJS.patch
new file mode 100644
index 0000000..e3338ef
--- /dev/null
+++ b/swig-Upgrade-to-support-newer-NodeJS.patch
@@ -0,0 +1,1863 @@
+From 5e1bdcfd6e5bd8353993433bd0efb4a3cb3ca639 Mon Sep 17 00:00:00 2001
+From: Alexandre Lissy
+Date: Thu, 25 Apr 2019 12:29:19 +0200
+Subject: [PATCH] Upgrade SWIG to support NodeJS v12, v13 / V8 v7.6, v7.8
+ runtime
+
+---
+ .travis.yml | 35 ++++++++
+ Examples/test-suite/javascript/Makefile.in | 15 +++-
+ .../javascript/abstract_access_runme.js | 4 +-
+ .../javascript/abstract_inherit_runme.js | 4 +-
+ .../javascript/abstract_typedef2_runme.js | 4 +-
+ .../javascript/abstract_typedef_runme.js | 4 +-
+ .../javascript/abstract_virtual_runme.js | 4 +-
+ .../javascript/array_member_runme.js | 4 +-
+ .../javascript/arrays_global_runme.js | 4 +-
+ .../test-suite/javascript/callback_runme.js | 4 +-
+ .../javascript/char_binary_runme.js | 4 +-
+ .../javascript/char_strings_runme.js | 4 +-
+ .../javascript/class_ignore_runme.js | 4 +-
+ .../javascript/class_scope_weird_runme.js | 4 +-
+ .../javascript/complextest_runme.js | 4 +-
+ .../test-suite/javascript/constover_runme.js | 4 +-
+ .../javascript/constructor_copy_runme.js | 4 +-
+ ...cpp11_strongly_typed_enumerations_runme.js | 4 +-
+ .../test-suite/javascript/cpp_enum_runme.js | 4 +-
+ .../javascript/cpp_namespace_runme.js | 4 +-
+ .../test-suite/javascript/cpp_static_runme.js | 4 +-
+ .../javascript/director_alternating_runme.js | 4 +-
+ .../test-suite/javascript/disown_runme.js | 4 +-
+ .../javascript/dynamic_cast_runme.js | 4 +-
+ .../test-suite/javascript/empty_c_runme.js | 4 +-
+ Examples/test-suite/javascript/empty_runme.js | 3 +-
+ .../javascript/enum_template_runme.js | 4 +-
+ .../test-suite/javascript/infinity_runme.js | 4 +-
+ .../namespace_virtual_method_runme.js | 4 +-
+ .../javascript/native_directive_runme.js | 4 +-
+ .../javascript/nspace_extend_runme.js | 4 +-
+ .../test-suite/javascript/nspace_runme.js | 4 +-
+ .../javascript/null_pointer_runme.js | 4 +-
+ .../javascript/overload_copy_runme.js | 4 +-
+ .../javascript/overload_null_runme.js | 4 +-
+ .../javascript/preproc_include_runme.js | 4 +-
+ .../test-suite/javascript/preproc_runme.js | 4 +-
+ .../test-suite/javascript/rename1_runme.js | 4 +-
+ .../test-suite/javascript/rename2_runme.js | 4 +-
+ .../test-suite/javascript/rename3_runme.js | 4 +-
+ .../test-suite/javascript/rename4_runme.js | 4 +-
+ .../javascript/rename_scope_runme.js | 4 +-
+ .../javascript/rename_simple_runme.js | 4 +-
+ .../javascript/ret_by_value_runme.js | 4 +-
+ .../javascript/string_simple_runme.js | 4 +-
+ .../javascript/struct_value_runme.js | 4 +-
+ .../javascript/swig_exception_runme.js | 4 +-
+ .../javascript/template_static_runme.js | 4 +-
+ .../javascript/typedef_class_runme.js | 4 +-
+ .../javascript/typedef_inherit_runme.js | 4 +-
+ .../javascript/typedef_scope_runme.js | 4 +-
+ .../javascript/typemap_arrays_runme.js | 4 +-
+ .../javascript/typemap_delete_runme.js | 4 +-
+ .../javascript/typemap_namespace_runme.js | 4 +-
+ .../javascript/typemap_ns_using_runme.js | 4 +-
+ .../test-suite/javascript/using1_runme.js | 4 +-
+ .../test-suite/javascript/using2_runme.js | 4 +-
+ .../test-suite/javascript/varargs_runme.js | 4 +-
+ Lib/javascript/v8/javascriptcode.swg | 30 ++++---
+ Lib/javascript/v8/javascriptcomplex.swg | 10 +--
+ Lib/javascript/v8/javascripthelpers.swg | 26 +++---
+ Lib/javascript/v8/javascriptinit.swg | 4 +-
+ Lib/javascript/v8/javascriptprimtypes.swg | 28 +++----
+ Lib/javascript/v8/javascriptrun.swg | 80 +++++++++++++------
+ Lib/javascript/v8/javascriptruntime.swg | 5 ++
+ Lib/javascript/v8/javascriptstrings.swg | 10 +--
+ Lib/javascript/v8/javascripttypemaps.swg | 2 +-
+ Source/Modules/javascript.cxx | 4 +-
+ Tools/javascript/v8_shell.cxx | 18 ++---
+ Tools/testflags.py | 5 +-
+ Tools/travis-linux-install.sh | 7 +-
+ 71 files changed, 358 insertions(+), 144 deletions(-)
+
+diff --git a/.travis.yml b/.travis.yml
+index 32c6656dd2..a53da19f68 100644
+--- a/.travis.yml
++++ b/.travis.yml
+@@ -112,6 +112,41 @@ matrix:
+ env: SWIGLANG=javascript ENGINE=node VER=10 CPP11=1
+ sudo: required
+ dist: xenial
++ - compiler: gcc
++ os: linux
++ env: SWIGLANG=javascript ENGINE=node VER=12.8.1 CPP11=1
++ sudo: required
++ dist: xenial
++ - compiler: gcc
++ os: linux
++ env: SWIGLANG=javascript ENGINE=node VER=12.10.0 CPP11=1
++ sudo: required
++ dist: xenial
++ - compiler: gcc
++ os: linux
++ env: SWIGLANG=javascript ENGINE=node VER=12.14.1 CPP11=1
++ sudo: required
++ dist: xenial
++ - compiler: gcc
++ os: linux
++ env: SWIGLANG=javascript ENGINE=node VER=13.1.0 CPP11=1
++ sudo: required
++ dist: xenial
++ - compiler: gcc
++ os: linux
++ env: SWIGLANG=javascript ENGINE=node VER=13.6.0 CPP11=1
++ sudo: required
++ dist: xenial
++ - compiler: gcc
++ os: linux
++ env: SWIGLANG=javascript ENGINE=electron VER=12.14.1 ELECTRON_VER=7.0.1 CPP11=1
++ sudo: required
++ dist: xenial
++ - compiler: gcc
++ os: linux
++ env: SWIGLANG=javascript ENGINE=electron VER=12.14.1 ELECTRON_VER=7.1.8 CPP11=1
++ sudo: required
++ dist: xenial
+ - compiler: gcc
+ os: linux
+ env: SWIGLANG=javascript ENGINE=jsc
+diff --git a/Examples/test-suite/javascript/Makefile.in b/Examples/test-suite/javascript/Makefile.in
+index 8127415f12..b780a9e9cf 100644
+--- a/Examples/test-suite/javascript/Makefile.in
++++ b/Examples/test-suite/javascript/Makefile.in
+@@ -16,6 +16,17 @@ top_builddir = @top_builddir@
+ SWIGEXE = $(top_builddir)/swig
+ SWIG_LIB_DIR = $(top_srcdir)/Lib
+
++ifeq (electron, $(ENGINE))
++NODE_DISTURL = --disturl=https://electronjs.org/headers
++NODE_RUNTIME = --runtime=electron
++NODE_ABI_TARGET = --target=${ELECTRON_VER}
++ENGINE =
++NODEJS = electron
++else
++NODE_DISTURL =
++NODE_RUNTIME =
++endif
++
+ ifneq (, $(ENGINE))
+ JSENGINE=$(ENGINE)
+ else
+@@ -66,14 +77,14 @@ ifeq (node,$(JSENGINE))
+ $(MAKE) -f $(top_builddir)/$(EXAMPLES)/Makefile SRCDIR='$(SRCDIR)' \
+ SWIG_LIB_DIR='$(SWIG_LIB_DIR)' SWIGEXE='$(SWIGEXE)' \
+ SWIGOPT='-javascript $(SWIGOPT) -o $*_wrap.cxx $(srcdir)/../$*.i' swiginvoke && \
+- MAKEFLAGS= $(COMPILETOOL) $(NODEGYP) --loglevel=silent --directory $* configure build 1>>/dev/null
++ MAKEFLAGS= $(COMPILETOOL) $(NODEGYP) $(NODE_ABI_TARGET) $(NODE_DISTURL) $(NODE_RUNTIME) --loglevel=silent --directory $* configure build 1>>/dev/null
+
+ swig_and_compile_cpp = \
+ $(setup_node) && \
+ $(MAKE) -f $(top_builddir)/$(EXAMPLES)/Makefile SRCDIR='$(SRCDIR)' \
+ SWIG_LIB_DIR='$(SWIG_LIB_DIR)' SWIGEXE='$(SWIGEXE)' \
+ SWIGOPT='-c++ -javascript $(SWIGOPT) $(srcdir)/../$*.i' swiginvoke && \
+- MAKEFLAGS= $(COMPILETOOL) $(NODEGYP) --loglevel=silent --directory $* configure build 1>>/dev/null
++ MAKEFLAGS= $(COMPILETOOL) $(NODEGYP) $(NODE_ABI_TARGET) $(NODE_DISTURL) $(NODE_RUNTIME) --loglevel=silent --directory $* configure build 1>>/dev/null
+
+ run_testcase = \
+ if [ -f $(srcdir)/$*$(SCRIPTSUFFIX) ]; then \
+diff --git a/Examples/test-suite/javascript/abstract_access_runme.js b/Examples/test-suite/javascript/abstract_access_runme.js
+index f61bb4358b..b2b5e95fb4 100644
+--- a/Examples/test-suite/javascript/abstract_access_runme.js
++++ b/Examples/test-suite/javascript/abstract_access_runme.js
+@@ -1,6 +1,8 @@
+-var abstract_access = require("abstract_access");
++var abstract_access = require("./abstract_access");
+
+ var d = new abstract_access.D()
+ if (d.do_x() != 1) {
+ throw "Error";
+ }
++
++process.exit(0);
+diff --git a/Examples/test-suite/javascript/abstract_inherit_runme.js b/Examples/test-suite/javascript/abstract_inherit_runme.js
+index f732e87673..6f58400373 100644
+--- a/Examples/test-suite/javascript/abstract_inherit_runme.js
++++ b/Examples/test-suite/javascript/abstract_inherit_runme.js
+@@ -1,4 +1,4 @@
+-var abstract_inherit = require("abstract_inherit");
++var abstract_inherit = require("./abstract_inherit");
+
+ // Shouldn't be able to instantiate any of these classes
+ // since none of them implements the pure virtual function
+@@ -38,3 +38,5 @@ try {
+ if (!caughtException) {
+ throw new Error("Spam should be instantiated as it is abstract");
+ }
++
++process.exit(0);
+diff --git a/Examples/test-suite/javascript/abstract_typedef2_runme.js b/Examples/test-suite/javascript/abstract_typedef2_runme.js
+index d8a533ab1d..f1c293818d 100644
+--- a/Examples/test-suite/javascript/abstract_typedef2_runme.js
++++ b/Examples/test-suite/javascript/abstract_typedef2_runme.js
+@@ -1,6 +1,8 @@
+-var abstract_typedef2 = require("abstract_typedef2");
++var abstract_typedef2 = require("./abstract_typedef2");
+
+ var a = new abstract_typedef2.A_UF();
+
+ if (a == undefined)
+ throw "Error";
++
++process.exit(0);
+diff --git a/Examples/test-suite/javascript/abstract_typedef_runme.js b/Examples/test-suite/javascript/abstract_typedef_runme.js
+index 286328fa8c..09b271218c 100644
+--- a/Examples/test-suite/javascript/abstract_typedef_runme.js
++++ b/Examples/test-suite/javascript/abstract_typedef_runme.js
+@@ -1,4 +1,4 @@
+-var abstract_typedef = require("abstract_typedef");
++var abstract_typedef = require("./abstract_typedef");
+
+ var e = new abstract_typedef.Engine();
+ var a = new abstract_typedef.A()
+@@ -6,3 +6,5 @@ var a = new abstract_typedef.A()
+ if (a.write(e) != 1) {
+ throw "Error";
+ }
++
++process.exit(0);
+diff --git a/Examples/test-suite/javascript/abstract_virtual_runme.js b/Examples/test-suite/javascript/abstract_virtual_runme.js
+index 9a9ce99885..f0d505d922 100644
+--- a/Examples/test-suite/javascript/abstract_virtual_runme.js
++++ b/Examples/test-suite/javascript/abstract_virtual_runme.js
+@@ -1,4 +1,4 @@
+-var abstract_virtual = require("abstract_virtual");
++var abstract_virtual = require("./abstract_virtual");
+
+ d = new abstract_virtual.D()
+
+@@ -9,3 +9,5 @@ e = new abstract_virtual.E()
+
+ if (e == undefined)
+ throw "Error";
++
++process.exit(0);
+diff --git a/Examples/test-suite/javascript/array_member_runme.js b/Examples/test-suite/javascript/array_member_runme.js
+index 3d9bb0e5b3..64d158df59 100644
+--- a/Examples/test-suite/javascript/array_member_runme.js
++++ b/Examples/test-suite/javascript/array_member_runme.js
+@@ -1,4 +1,4 @@
+-var array_member = require("array_member");
++var array_member = require("./array_member");
+
+ var f = new array_member.Foo();
+ f.data = array_member.global_data;
+@@ -20,3 +20,5 @@ for (var i=0; i<8; i++){
+ throw "Bad array assignment (2)";
+ }
+ }
++
++process.exit(0);
+diff --git a/Examples/test-suite/javascript/arrays_global_runme.js b/Examples/test-suite/javascript/arrays_global_runme.js
+index 0cbb28efba..db4ac20526 100644
+--- a/Examples/test-suite/javascript/arrays_global_runme.js
++++ b/Examples/test-suite/javascript/arrays_global_runme.js
+@@ -1,4 +1,4 @@
+-var arrays_global = require("arrays_global");
++var arrays_global = require("./arrays_global");
+
+ arrays_global.array_i = arrays_global.array_const_i;
+
+@@ -16,3 +16,5 @@ arrays_global.BeginString_FIX44f;
+ arrays_global.test_a("hello","hi","chello","chi");
+
+ arrays_global.test_b("1234567","hi");
++
++process.exit(0);
+diff --git a/Examples/test-suite/javascript/callback_runme.js b/Examples/test-suite/javascript/callback_runme.js
+index 0218886419..aa22cd21fd 100644
+--- a/Examples/test-suite/javascript/callback_runme.js
++++ b/Examples/test-suite/javascript/callback_runme.js
+@@ -1,4 +1,4 @@
+-var callback = require("callback");
++var callback = require("./callback");
+
+ if (callback.foo(2) !== 2) {
+ throw new Error("Failed.");
+@@ -28,3 +28,5 @@ var a = new callback.A();
+ if (callback.foobarm(3, a, callback.A.foom_cb_ptr) != a.foom(3)) {
+ throw new Error("Failed.");
+ }
++
++process.exit(0);
+diff --git a/Examples/test-suite/javascript/char_binary_runme.js b/Examples/test-suite/javascript/char_binary_runme.js
+index 01b72ebe14..8b7e400349 100644
+--- a/Examples/test-suite/javascript/char_binary_runme.js
++++ b/Examples/test-suite/javascript/char_binary_runme.js
+@@ -1,4 +1,4 @@
+-var char_binary = require("char_binary");
++var char_binary = require("./char_binary");
+
+ var t = new char_binary.Test();
+ if (t.strlen('hile') != 4) {
+@@ -46,3 +46,5 @@ if (char_binary.var_namet != "hola") {
+ throw("bad pointer case (2)");
+ }
+ char_binary.delete_pchar(pc);
++
++process.exit(0);
+diff --git a/Examples/test-suite/javascript/char_strings_runme.js b/Examples/test-suite/javascript/char_strings_runme.js
+index fe17cb9827..0cbe81e542 100644
+--- a/Examples/test-suite/javascript/char_strings_runme.js
++++ b/Examples/test-suite/javascript/char_strings_runme.js
+@@ -1,4 +1,4 @@
+-var char_strings = require("char_strings");
++var char_strings = require("./char_strings");
+
+ var assertIsEqual = function(expected, actual) {
+ if (expected !== actual) {
+@@ -9,3 +9,5 @@ var assertIsEqual = function(expected, actual) {
+ assertIsEqual("hi there", char_strings.CharPingPong("hi there"));
+ assertIsEqual("hi there", char_strings.CharArrayPingPong("hi there"));
+ assertIsEqual("hi there", char_strings.CharArrayDimsPingPong("hi there"));
++
++process.exit(0);
+diff --git a/Examples/test-suite/javascript/class_ignore_runme.js b/Examples/test-suite/javascript/class_ignore_runme.js
+index ffbe021c71..938a19fc8d 100644
+--- a/Examples/test-suite/javascript/class_ignore_runme.js
++++ b/Examples/test-suite/javascript/class_ignore_runme.js
+@@ -1,6 +1,8 @@
+-var class_ignore = require("class_ignore");
++var class_ignore = require("./class_ignore");
+
+ a = new class_ignore.Bar();
+
+ if (class_ignore.do_blah(a) != "Bar::blah")
+ throw "Error";
++
++process.exit(0);
+diff --git a/Examples/test-suite/javascript/class_scope_weird_runme.js b/Examples/test-suite/javascript/class_scope_weird_runme.js
+index 73c118d617..325fefbac5 100644
+--- a/Examples/test-suite/javascript/class_scope_weird_runme.js
++++ b/Examples/test-suite/javascript/class_scope_weird_runme.js
+@@ -1,6 +1,8 @@
+-var class_scope_weird = require("class_scope_weird");
++var class_scope_weird = require("./class_scope_weird");
+
+ f = new class_scope_weird.Foo();
+ g = new class_scope_weird.Foo(3);
+ if (f.bar(3) != 3)
+ throw RuntimeError;
++
++process.exit(0);
+diff --git a/Examples/test-suite/javascript/complextest_runme.js b/Examples/test-suite/javascript/complextest_runme.js
+index 1d9825f3b2..7e3e3e984b 100644
+--- a/Examples/test-suite/javascript/complextest_runme.js
++++ b/Examples/test-suite/javascript/complextest_runme.js
+@@ -1,4 +1,4 @@
+-var complextest = require("complextest");
++var complextest = require("./complextest");
+
+ a = [-1,2];
+
+@@ -29,3 +29,5 @@ v.add(1);
+ // TODO: how to check validity?
+ complextest.CopyHalf(v);
+ complextest.CopyHalfRef(v);
++
++process.exit(0);
+diff --git a/Examples/test-suite/javascript/constover_runme.js b/Examples/test-suite/javascript/constover_runme.js
+index 9b192b5ff7..bae3344072 100644
+--- a/Examples/test-suite/javascript/constover_runme.js
++++ b/Examples/test-suite/javascript/constover_runme.js
+@@ -1,4 +1,4 @@
+-var constover = require("constover");
++var constover = require("./constover");
+
+ p = constover.test("test");
+ if (p != "test") {
+@@ -31,3 +31,5 @@ p = f.test_pconstm("test");
+ if (p != "test_pconstmethod") {
+ throw "member-test_pconstm failed!";
+ }
++
++process.exit(0);
+diff --git a/Examples/test-suite/javascript/constructor_copy_runme.js b/Examples/test-suite/javascript/constructor_copy_runme.js
+index 179b9fb406..0d811470f1 100644
+--- a/Examples/test-suite/javascript/constructor_copy_runme.js
++++ b/Examples/test-suite/javascript/constructor_copy_runme.js
+@@ -1,4 +1,4 @@
+-var constructor_copy = require("constructor_copy");
++var constructor_copy = require("./constructor_copy");
+
+ f1 = new constructor_copy.Foo1(3);
+ f11 = new constructor_copy.Foo1(f1);
+@@ -40,3 +40,5 @@ try {
+ if (good == 0) {
+ throw "Error: should not allow calling copy ctor for Bard";
+ }
++
++process.exit(0);
+diff --git a/Examples/test-suite/javascript/cpp11_strongly_typed_enumerations_runme.js b/Examples/test-suite/javascript/cpp11_strongly_typed_enumerations_runme.js
+index ad9d4e8833..241e38b768 100644
+--- a/Examples/test-suite/javascript/cpp11_strongly_typed_enumerations_runme.js
++++ b/Examples/test-suite/javascript/cpp11_strongly_typed_enumerations_runme.js
+@@ -1,4 +1,4 @@
+-var cpp11_strongly_typed_enumerations = require("cpp11_strongly_typed_enumerations");
++var cpp11_strongly_typed_enumerations = require("./cpp11_strongly_typed_enumerations");
+
+ function enumCheck(actual, expected) {
+ if (actual != expected) {
+@@ -163,3 +163,5 @@ enumCheck(class1.class1Test2(cpp11_strongly_typed_enumerations.Class1.Enum12_Val
+ enumCheck(cpp11_strongly_typed_enumerations.globalTest1(cpp11_strongly_typed_enumerations.Enum1_Val5a), 13);
+ enumCheck(cpp11_strongly_typed_enumerations.globalTest2(cpp11_strongly_typed_enumerations.Class1.Enum12_Val5c), 1121);
+ //enumCheck(globalTest3(cpp11_strongly_typed_enumerations.Class1.Struct1_Enum12_Val5f), 3121);
++
++process.exit(0);
+diff --git a/Examples/test-suite/javascript/cpp_enum_runme.js b/Examples/test-suite/javascript/cpp_enum_runme.js
+index 8a248c372a..990f703c39 100644
+--- a/Examples/test-suite/javascript/cpp_enum_runme.js
++++ b/Examples/test-suite/javascript/cpp_enum_runme.js
+@@ -1,4 +1,4 @@
+-var cpp_enum = require("cpp_enum");
++var cpp_enum = require("./cpp_enum");
+
+ var f = new cpp_enum.Foo()
+
+@@ -26,3 +26,5 @@ if(cpp_enum.Foo.hi != cpp_enum.Hello){
+ throw "Error";
+ }
+
++
++process.exit(0);
+diff --git a/Examples/test-suite/javascript/cpp_namespace_runme.js b/Examples/test-suite/javascript/cpp_namespace_runme.js
+index a6ab799646..69e74ae4ed 100644
+--- a/Examples/test-suite/javascript/cpp_namespace_runme.js
++++ b/Examples/test-suite/javascript/cpp_namespace_runme.js
+@@ -1,4 +1,4 @@
+-var cpp_namespace = require("cpp_namespace");
++var cpp_namespace = require("./cpp_namespace");
+
+ var n = cpp_namespace.fact(4);
+ if (n != 24){
+@@ -45,3 +45,5 @@ if (cpp_namespace.do_method3(t4,40) != "Test4::method"){
+ if (cpp_namespace.do_method3(t5,40) != "Test5::method"){
+ throw ("Bad return value error!");
+ }
++
++process.exit(0);
+diff --git a/Examples/test-suite/javascript/cpp_static_runme.js b/Examples/test-suite/javascript/cpp_static_runme.js
+index c7917e12ea..e78b7016bd 100644
+--- a/Examples/test-suite/javascript/cpp_static_runme.js
++++ b/Examples/test-suite/javascript/cpp_static_runme.js
+@@ -1,4 +1,4 @@
+-var cpp_static = require("cpp_static");
++var cpp_static = require("./cpp_static");
+
+ cpp_static.StaticFunctionTest.static_func();
+ cpp_static.StaticFunctionTest.static_func_2(1);
+@@ -7,3 +7,5 @@ cpp_static.StaticMemberTest.static_int = 10;
+ if (cpp_static.StaticMemberTest.static_int != 10)
+ throw "error";
+
++
++process.exit(0);
+diff --git a/Examples/test-suite/javascript/director_alternating_runme.js b/Examples/test-suite/javascript/director_alternating_runme.js
+index cff288d35c..40da25af0c 100644
+--- a/Examples/test-suite/javascript/director_alternating_runme.js
++++ b/Examples/test-suite/javascript/director_alternating_runme.js
+@@ -1,5 +1,7 @@
+-var director_alternating = require("director_alternating");
++var director_alternating = require("./director_alternating");
+
+ id = director_alternating.getBar().id();
+ if (id != director_alternating.idFromGetBar())
+ throw ("Error, Got wrong id: " + str(id));
++
++process.exit(0);
+diff --git a/Examples/test-suite/javascript/disown_runme.js b/Examples/test-suite/javascript/disown_runme.js
+index ea742b51e5..1950a2fb6c 100644
+--- a/Examples/test-suite/javascript/disown_runme.js
++++ b/Examples/test-suite/javascript/disown_runme.js
+@@ -1,4 +1,4 @@
+-var disown = require("disown");
++var disown = require("./disown");
+
+ var a = new disown.A();
+ var tmp = a.thisown;
+@@ -20,3 +20,5 @@ b.acquire(a);
+ if (a.thisown) {
+ throw new Error("Failed.");
+ }
++
++process.exit(0);
+diff --git a/Examples/test-suite/javascript/dynamic_cast_runme.js b/Examples/test-suite/javascript/dynamic_cast_runme.js
+index 32eabcf8b0..b807a93ca2 100644
+--- a/Examples/test-suite/javascript/dynamic_cast_runme.js
++++ b/Examples/test-suite/javascript/dynamic_cast_runme.js
+@@ -1,4 +1,4 @@
+-var dynamic_cast = require("dynamic_cast");
++var dynamic_cast = require("./dynamic_cast");
+
+ var f = new dynamic_cast.Foo();
+ var b = new dynamic_cast.Bar();
+@@ -10,3 +10,5 @@ var a = dynamic_cast.do_test(y);
+ if (a != "Bar::test") {
+ throw new Error("Failed.");
+ }
++
++process.exit(0);
+diff --git a/Examples/test-suite/javascript/empty_c_runme.js b/Examples/test-suite/javascript/empty_c_runme.js
+index 1cc22e4ce7..61d57853bf 100644
+--- a/Examples/test-suite/javascript/empty_c_runme.js
++++ b/Examples/test-suite/javascript/empty_c_runme.js
+@@ -1 +1,3 @@
+-var empty_c = require("empty_c");
++var empty_c = require("./empty_c");
++
++process.exit(0);
+diff --git a/Examples/test-suite/javascript/empty_runme.js b/Examples/test-suite/javascript/empty_runme.js
+index 7894379bee..a16eed15a1 100644
+--- a/Examples/test-suite/javascript/empty_runme.js
++++ b/Examples/test-suite/javascript/empty_runme.js
+@@ -1 +1,2 @@
+-var empty = require("empty");
+\ No newline at end of file
++var empty = require("./empty");
++process.exit(0);
+diff --git a/Examples/test-suite/javascript/enum_template_runme.js b/Examples/test-suite/javascript/enum_template_runme.js
+index 1e71e5f640..c44b813644 100644
+--- a/Examples/test-suite/javascript/enum_template_runme.js
++++ b/Examples/test-suite/javascript/enum_template_runme.js
+@@ -1,4 +1,4 @@
+-var enum_template = require("enum_template");
++var enum_template = require("./enum_template");
+
+ if (enum_template.MakeETest() != 1)
+ throw "RuntimeError";
+@@ -6,3 +6,5 @@ if (enum_template.MakeETest() != 1)
+ if (enum_template.TakeETest(0) != null)
+ throw "RuntimeError";
+
++
++process.exit(0);
+diff --git a/Examples/test-suite/javascript/infinity_runme.js b/Examples/test-suite/javascript/infinity_runme.js
+index 8ebe496a6b..4bef97a1c1 100644
+--- a/Examples/test-suite/javascript/infinity_runme.js
++++ b/Examples/test-suite/javascript/infinity_runme.js
+@@ -1,5 +1,7 @@
+-var infinity = require("infinity");
++var infinity = require("./infinity");
+
+ infinity.initialise_MYINFINITY();
+ var my_infinity = infinity.INFINITY;
+ var ret_val = infinity.use_infinity(my_infinity);
++
++process.exit(0);
+diff --git a/Examples/test-suite/javascript/namespace_virtual_method_runme.js b/Examples/test-suite/javascript/namespace_virtual_method_runme.js
+index 4f1e05c848..9dfe33a3ea 100644
+--- a/Examples/test-suite/javascript/namespace_virtual_method_runme.js
++++ b/Examples/test-suite/javascript/namespace_virtual_method_runme.js
+@@ -1,3 +1,5 @@
+-var namespace_virtual_method = require("namespace_virtual_method");
++var namespace_virtual_method = require("./namespace_virtual_method");
+
+ x = new namespace_virtual_method.Spam();
++
++process.exit(0);
+diff --git a/Examples/test-suite/javascript/native_directive_runme.js b/Examples/test-suite/javascript/native_directive_runme.js
+index 5c1d69cf17..c7573cf7d8 100644
+--- a/Examples/test-suite/javascript/native_directive_runme.js
++++ b/Examples/test-suite/javascript/native_directive_runme.js
+@@ -1,4 +1,4 @@
+-var native_directive = require("native_directive");
++var native_directive = require("./native_directive");
+
+ (function main() {
+ var s = "abc.DEF-123";
+@@ -7,3 +7,5 @@ var native_directive = require("native_directive");
+ if (native_directive.CountAlphaCharacters(s) !== 6)
+ throw "CountAlphaCharacters failed";
+ })();
++
++process.exit(0);
+diff --git a/Examples/test-suite/javascript/nspace_extend_runme.js b/Examples/test-suite/javascript/nspace_extend_runme.js
+index 8cabfe9457..b7daf883a9 100644
+--- a/Examples/test-suite/javascript/nspace_extend_runme.js
++++ b/Examples/test-suite/javascript/nspace_extend_runme.js
+@@ -1,4 +1,4 @@
+-var nspace_extend = require("nspace_extend");
++var nspace_extend = require("./nspace_extend");
+
+ // constructors and destructors
+ var color1 = new nspace_extend.Outer.Inner1.Color();
+@@ -25,3 +25,5 @@ created = nspace_extend.Outer.Inner2.Color.create();
+ var col1 = new nspace_extend.Outer.Inner1.Color();
+ var col2 = nspace_extend.Outer.Inner2.Color.create();
+ col2.colors(col1, col1, col2, col2, col2);
++
++process.exit(0);
+diff --git a/Examples/test-suite/javascript/nspace_runme.js b/Examples/test-suite/javascript/nspace_runme.js
+index 993610dd62..5402b13af9 100644
+--- a/Examples/test-suite/javascript/nspace_runme.js
++++ b/Examples/test-suite/javascript/nspace_runme.js
+@@ -1,4 +1,4 @@
+-var nspace = require("nspace");
++var nspace = require("./nspace");
+
+ var color1 = new nspace.Outer.Inner1.Color();
+ var color = new nspace.Outer.Inner1.Color(color1);
+@@ -74,3 +74,5 @@ var blue3 = new nspace.Outer.Inner3.Blue();
+ blue3.blueInstanceMethod();
+ var blue4 = new nspace.Outer.Inner4.Blue();
+ blue4.blueInstanceMethod();
++
++process.exit(0);
+diff --git a/Examples/test-suite/javascript/null_pointer_runme.js b/Examples/test-suite/javascript/null_pointer_runme.js
+index 8a9b611867..25d1e535f4 100644
+--- a/Examples/test-suite/javascript/null_pointer_runme.js
++++ b/Examples/test-suite/javascript/null_pointer_runme.js
+@@ -1,4 +1,4 @@
+-var null_pointer = require("null_pointer");
++var null_pointer = require("./null_pointer");
+
+ if (!null_pointer.funk(null)) {
+ throw new Error("Javascript 'null' should be converted into NULL.");
+@@ -7,3 +7,5 @@ if (!null_pointer.funk(null)) {
+ if (null_pointer.getnull() != null) {
+ throw new Error("NULL should be converted into Javascript 'null'.");
+ }
++
++process.exit(0);
+diff --git a/Examples/test-suite/javascript/overload_copy_runme.js b/Examples/test-suite/javascript/overload_copy_runme.js
+index e2f6107884..a1e1459317 100644
+--- a/Examples/test-suite/javascript/overload_copy_runme.js
++++ b/Examples/test-suite/javascript/overload_copy_runme.js
+@@ -1,4 +1,6 @@
+-var overload_copy = require("overload_copy");
++var overload_copy = require("./overload_copy");
+
+ f = new overload_copy.Foo();
+ g = new overload_copy.Foo(f);
++
++process.exit(0);
+diff --git a/Examples/test-suite/javascript/overload_null_runme.js b/Examples/test-suite/javascript/overload_null_runme.js
+index f1e35cac76..74d855248e 100644
+--- a/Examples/test-suite/javascript/overload_null_runme.js
++++ b/Examples/test-suite/javascript/overload_null_runme.js
+@@ -1,6 +1,6 @@
+ // There are no typecheck typemaps in Javascript yet, so most of this test
+ // does not actually worked - the check functions have thus been commented out.
+-var overload_null = require("overload_null");
++var overload_null = require("./overload_null");
+
+ var check = function(expected, actual) {
+ if (expected !== actual) {
+@@ -47,3 +47,5 @@ check(20, o.byval2forwardptr(x));
+ check(21, o.byval1forwardref(x));
+
+ check(22, o.byval2forwardref(x));
++
++process.exit(0);
+diff --git a/Examples/test-suite/javascript/preproc_include_runme.js b/Examples/test-suite/javascript/preproc_include_runme.js
+index 5ec72b842d..8d4e8601f6 100644
+--- a/Examples/test-suite/javascript/preproc_include_runme.js
++++ b/Examples/test-suite/javascript/preproc_include_runme.js
+@@ -1,4 +1,4 @@
+-var preproc_include = require("preproc_include");
++var preproc_include = require("./preproc_include");
+
+ if (preproc_include.multiply10(10) != 100)
+ throw "RuntimeError";
+@@ -21,3 +21,5 @@ if (preproc_include.multiply60(10) != 600)
+ if (preproc_include.multiply70(10) != 700)
+ throw "RuntimeError";
+
++
++process.exit(0);
+diff --git a/Examples/test-suite/javascript/preproc_runme.js b/Examples/test-suite/javascript/preproc_runme.js
+index 167ca5ac1c..15e026d8a6 100644
+--- a/Examples/test-suite/javascript/preproc_runme.js
++++ b/Examples/test-suite/javascript/preproc_runme.js
+@@ -1,4 +1,4 @@
+-var preproc = require("preproc");
++var preproc = require("./preproc");
+
+ if (preproc.endif != 1)
+ throw "RuntimeError";
+@@ -12,3 +12,5 @@ if (preproc.defined != 1)
+ if (2*preproc.one != preproc.two)
+ throw "RuntimeError";
+
++
++process.exit(0);
+diff --git a/Examples/test-suite/javascript/rename1_runme.js b/Examples/test-suite/javascript/rename1_runme.js
+index 7b2ac37b6d..4741673c90 100644
+--- a/Examples/test-suite/javascript/rename1_runme.js
++++ b/Examples/test-suite/javascript/rename1_runme.js
+@@ -1,4 +1,4 @@
+-var rename = require("rename1");
++var rename = require("./rename1");
+
+ function part1() {
+ var xyz = new rename.XYZInt();
+@@ -62,3 +62,5 @@ part2();
+ part3();
+ part4();
+ part5();
++
++process.exit(0);
+diff --git a/Examples/test-suite/javascript/rename2_runme.js b/Examples/test-suite/javascript/rename2_runme.js
+index 040c798bb5..6f6a7d3814 100644
+--- a/Examples/test-suite/javascript/rename2_runme.js
++++ b/Examples/test-suite/javascript/rename2_runme.js
+@@ -1,4 +1,4 @@
+-var rename = require("rename2");
++var rename = require("./rename2");
+
+ function part1() {
+ var xyz = new rename.XYZInt();
+@@ -62,3 +62,5 @@ part2();
+ part3();
+ part4();
+ part5();
++
++process.exit(0);
+diff --git a/Examples/test-suite/javascript/rename3_runme.js b/Examples/test-suite/javascript/rename3_runme.js
+index fb9393b037..fcac4dfe02 100644
+--- a/Examples/test-suite/javascript/rename3_runme.js
++++ b/Examples/test-suite/javascript/rename3_runme.js
+@@ -1,4 +1,4 @@
+-var rename = require("rename3");
++var rename = require("./rename3");
+
+ function part1() {
+ var xyz = new rename.XYZInt();
+@@ -62,3 +62,5 @@ part2();
+ part3();
+ part4();
+ part5();
++
++process.exit(0);
+diff --git a/Examples/test-suite/javascript/rename4_runme.js b/Examples/test-suite/javascript/rename4_runme.js
+index 1c3d8e77f5..9bf1c45a24 100644
+--- a/Examples/test-suite/javascript/rename4_runme.js
++++ b/Examples/test-suite/javascript/rename4_runme.js
+@@ -1,4 +1,4 @@
+-var rename = require("rename4");
++var rename = require("./rename4");
+
+ function part1() {
+ var xyz = new rename.XYZInt();
+@@ -62,3 +62,5 @@ part2();
+ part3();
+ part4();
+ part5();
++
++process.exit(0);
+diff --git a/Examples/test-suite/javascript/rename_scope_runme.js b/Examples/test-suite/javascript/rename_scope_runme.js
+index fea4d2ca99..dffbcded7d 100644
+--- a/Examples/test-suite/javascript/rename_scope_runme.js
++++ b/Examples/test-suite/javascript/rename_scope_runme.js
+@@ -1,4 +1,4 @@
+-var rename_scope = require("rename_scope");
++var rename_scope = require("./rename_scope");
+
+ var a = new rename_scope.Natural_UP();
+ var b = new rename_scope.Natural_BP();
+@@ -15,3 +15,5 @@ var f = rename_scope.equals;
+ if (f === undefined) {
+ throw new Error("Equality operator has not been renamed.");
+ }
++
++process.exit(0);
+diff --git a/Examples/test-suite/javascript/rename_simple_runme.js b/Examples/test-suite/javascript/rename_simple_runme.js
+index 21350cd3ee..9d39f1a62e 100644
+--- a/Examples/test-suite/javascript/rename_simple_runme.js
++++ b/Examples/test-suite/javascript/rename_simple_runme.js
+@@ -1,4 +1,4 @@
+-var rename_simple = require("rename_simple");
++var rename_simple = require("./rename_simple");
+ var NewStruct = rename_simple.NewStruct;
+
+ var s = new NewStruct();
+@@ -48,3 +48,5 @@ rename_simple.NewGlobalVariable = 6666;
+ if (rename_simple.NewGlobalVariable !== 6666) {
+ throw new Error("rename_simple.NewGlobalVariable: Expected 6666, was " + rename_simple.NewGlobalVariable);
+ }
++
++process.exit(0);
+diff --git a/Examples/test-suite/javascript/ret_by_value_runme.js b/Examples/test-suite/javascript/ret_by_value_runme.js
+index 9d0840602a..e0eec07cf7 100644
+--- a/Examples/test-suite/javascript/ret_by_value_runme.js
++++ b/Examples/test-suite/javascript/ret_by_value_runme.js
+@@ -1,4 +1,4 @@
+-var ret_by_value = require("ret_by_value");
++var ret_by_value = require("./ret_by_value");
+
+ a = ret_by_value.get_test();
+ if (a.myInt != 100)
+@@ -6,3 +6,5 @@ if (a.myInt != 100)
+
+ if (a.myShort != 200)
+ throw "RuntimeError";
++
++process.exit(0);
+diff --git a/Examples/test-suite/javascript/string_simple_runme.js b/Examples/test-suite/javascript/string_simple_runme.js
+index 71fbb7bd07..21668fc05f 100644
+--- a/Examples/test-suite/javascript/string_simple_runme.js
++++ b/Examples/test-suite/javascript/string_simple_runme.js
+@@ -1,4 +1,4 @@
+-var string_simple = require("string_simple");
++var string_simple = require("./string_simple");
+
+ // Test unicode string
+ var str = "olé";
+@@ -8,3 +8,5 @@ var copy = string_simple.copy_str(str);
+ if (str !== copy) {
+ throw "Error: copy is not equal: original="+str+", copy="+copy;
+ }
++
++process.exit(0);
+diff --git a/Examples/test-suite/javascript/struct_value_runme.js b/Examples/test-suite/javascript/struct_value_runme.js
+index 5b171b8fed..d277481ed0 100644
+--- a/Examples/test-suite/javascript/struct_value_runme.js
++++ b/Examples/test-suite/javascript/struct_value_runme.js
+@@ -1,4 +1,4 @@
+-var struct_value = require("struct_value");
++var struct_value = require("./struct_value");
+
+ b = new struct_value.Bar();
+
+@@ -9,3 +9,5 @@ throw "RuntimeError";
+ b.b.x = 3;
+ if (b.b.x != 3)
+ throw "RuntimeError"
++
++process.exit(0);
+diff --git a/Examples/test-suite/javascript/swig_exception_runme.js b/Examples/test-suite/javascript/swig_exception_runme.js
+index 55435e9477..257dedc8fc 100644
+--- a/Examples/test-suite/javascript/swig_exception_runme.js
++++ b/Examples/test-suite/javascript/swig_exception_runme.js
+@@ -1,4 +1,4 @@
+-var swig_exception = require("swig_exception");
++var swig_exception = require("./swig_exception");
+
+ var c = new swig_exception.Circle(10);
+ var s = new swig_exception.Square(10);
+@@ -28,3 +28,5 @@ if (swig_exception.Shape.nshapes != 0) {
+ throw "Shape.nshapes should be 0, actually " + swig_exception.Shape.nshapes;
+ }
+ */
++
++process.exit(0);
+diff --git a/Examples/test-suite/javascript/template_static_runme.js b/Examples/test-suite/javascript/template_static_runme.js
+index d6106138ae..aa3e548b8d 100644
+--- a/Examples/test-suite/javascript/template_static_runme.js
++++ b/Examples/test-suite/javascript/template_static_runme.js
+@@ -1,3 +1,5 @@
+-var template_static = require("template_static");
++var template_static = require("./template_static");
+
+ template_static.Foo.bar_double(1);
++
++process.exit(0);
+diff --git a/Examples/test-suite/javascript/typedef_class_runme.js b/Examples/test-suite/javascript/typedef_class_runme.js
+index 64e0051c37..5d6df5b6b7 100644
+--- a/Examples/test-suite/javascript/typedef_class_runme.js
++++ b/Examples/test-suite/javascript/typedef_class_runme.js
+@@ -1,7 +1,9 @@
+-var typedef_class = require("typedef_class");
++var typedef_class = require("./typedef_class");
+
+ a = new typedef_class.RealA();
+ a.a = 3;
+
+ b = new typedef_class.B();
+ b.testA(a);
++
++process.exit(0);
+diff --git a/Examples/test-suite/javascript/typedef_inherit_runme.js b/Examples/test-suite/javascript/typedef_inherit_runme.js
+index 7590e1e6ec..b13c59a030 100644
+--- a/Examples/test-suite/javascript/typedef_inherit_runme.js
++++ b/Examples/test-suite/javascript/typedef_inherit_runme.js
+@@ -1,4 +1,4 @@
+-var typedef_inherit = require("typedef_inherit");
++var typedef_inherit = require("./typedef_inherit");
+
+ a = new typedef_inherit.Foo();
+ b = new typedef_inherit.Bar();
+@@ -21,3 +21,5 @@ if (x != "Spam::blah")
+ x = typedef_inherit.do_blah2(d);
+ if (x != "Grok::blah")
+ print ("Whoa! Bad return" + x);
++
++process.exit(0);
+diff --git a/Examples/test-suite/javascript/typedef_scope_runme.js b/Examples/test-suite/javascript/typedef_scope_runme.js
+index 5c1368ab78..e8b2a8255c 100644
+--- a/Examples/test-suite/javascript/typedef_scope_runme.js
++++ b/Examples/test-suite/javascript/typedef_scope_runme.js
+@@ -1,4 +1,4 @@
+-var typedef_scope = require("typedef_scope");
++var typedef_scope = require("./typedef_scope");
+
+ b = new typedef_scope.Bar();
+ x = b.test1(42,"hello");
+@@ -10,3 +10,5 @@ if (x != "hello")
+ print("Failed!!");
+
+
++
++process.exit(0);
+diff --git a/Examples/test-suite/javascript/typemap_arrays_runme.js b/Examples/test-suite/javascript/typemap_arrays_runme.js
+index 610ecdd9c7..c333f43930 100644
+--- a/Examples/test-suite/javascript/typemap_arrays_runme.js
++++ b/Examples/test-suite/javascript/typemap_arrays_runme.js
+@@ -1,5 +1,7 @@
+-var typemap_arrays = require("typemap_arrays");
++var typemap_arrays = require("./typemap_arrays");
+
+ if (typemap_arrays.sumA(null) != 60)
+ throw "RuntimeError, Sum is wrong";
+
++
++process.exit(0);
+diff --git a/Examples/test-suite/javascript/typemap_delete_runme.js b/Examples/test-suite/javascript/typemap_delete_runme.js
+index 1d42ce4daf..72252fe013 100644
+--- a/Examples/test-suite/javascript/typemap_delete_runme.js
++++ b/Examples/test-suite/javascript/typemap_delete_runme.js
+@@ -1,5 +1,7 @@
+-var typemap_delete = require("typemap_delete");
++var typemap_delete = require("./typemap_delete");
+
+ r = new typemap_delete.Rect(123);
+ if (r.val != 123)
+ throw "RuntimeError";
++
++process.exit(0);
+diff --git a/Examples/test-suite/javascript/typemap_namespace_runme.js b/Examples/test-suite/javascript/typemap_namespace_runme.js
+index 2aa3580249..962e54afa4 100644
+--- a/Examples/test-suite/javascript/typemap_namespace_runme.js
++++ b/Examples/test-suite/javascript/typemap_namespace_runme.js
+@@ -1,7 +1,9 @@
+-var typemap_namespace = require("typemap_namespace");
++var typemap_namespace = require("./typemap_namespace");
+
+ if (typemap_namespace.test1("hello") != "hello")
+ throw "RuntimeError";
+
+ if (typemap_namespace.test2("hello") != "hello")
+ throw "RuntimeError";
++
++process.exit(0);
+diff --git a/Examples/test-suite/javascript/typemap_ns_using_runme.js b/Examples/test-suite/javascript/typemap_ns_using_runme.js
+index 7e4019ab24..e97ea473c6 100644
+--- a/Examples/test-suite/javascript/typemap_ns_using_runme.js
++++ b/Examples/test-suite/javascript/typemap_ns_using_runme.js
+@@ -1,4 +1,6 @@
+-var typemap_ns_using = require("typemap_ns_using");
++var typemap_ns_using = require("./typemap_ns_using");
+
+ if (typemap_ns_using.spam(37) != 37)
+ throw "RuntimeError";
++
++process.exit(0);
+diff --git a/Examples/test-suite/javascript/using1_runme.js b/Examples/test-suite/javascript/using1_runme.js
+index 2415156f08..68917b0156 100644
+--- a/Examples/test-suite/javascript/using1_runme.js
++++ b/Examples/test-suite/javascript/using1_runme.js
+@@ -1,4 +1,6 @@
+-var using1 = require("using1");
++var using1 = require("./using1");
+
+ if (using1.spam(37) != 37)
+ throw "RuntimeError";
++
++process.exit(0);
+diff --git a/Examples/test-suite/javascript/using2_runme.js b/Examples/test-suite/javascript/using2_runme.js
+index 2ef08faca1..001f551403 100644
+--- a/Examples/test-suite/javascript/using2_runme.js
++++ b/Examples/test-suite/javascript/using2_runme.js
+@@ -1,4 +1,6 @@
+-var using2 = require("using2");
++var using2 = require("./using2");
+
+ if (using2.spam(37) != 37)
+ throw "RuntimeError";
++
++process.exit(0);
+diff --git a/Examples/test-suite/javascript/varargs_runme.js b/Examples/test-suite/javascript/varargs_runme.js
+index fc6d945c1a..66348f2983 100644
+--- a/Examples/test-suite/javascript/varargs_runme.js
++++ b/Examples/test-suite/javascript/varargs_runme.js
+@@ -1,4 +1,4 @@
+-var varargs = require("varargs");
++var varargs = require("./varargs");
+
+ if (varargs.test("Hello") != "Hello") {
+ throw new Error("Failed");
+@@ -42,3 +42,5 @@ try {
+ if (!thrown) {
+ throw new Error("Failed");
+ }
++
++process.exit(0);
+diff --git a/Lib/javascript/v8/javascriptcode.swg b/Lib/javascript/v8/javascriptcode.swg
+index c4aaf3db0c..c2aacc61a5 100644
+--- a/Lib/javascript/v8/javascriptcode.swg
++++ b/Lib/javascript/v8/javascriptcode.swg
+@@ -11,7 +11,7 @@
+ static SwigV8ReturnValue $jswrapper(const SwigV8Arguments &args) {
+ SWIGV8_HANDLESCOPE();
+
+- v8::Handle self = args.Holder();
++ v8::Local self = args.Holder();
+ $jslocals
+ if(args.Length() != $jsargcount) SWIG_exception_fail(SWIG_ERROR, "Illegal number of arguments for $jswrapper.");
+ $jscode
+@@ -53,7 +53,7 @@ static SwigV8ReturnValue $jswrapper(const SwigV8Arguments &args) {
+ SWIGV8_HANDLESCOPE();
+
+ OverloadErrorHandler errorHandler;
+- v8::Handle self;
++ v8::Local self;
+
+ // switch all cases by means of series of if-returns.
+ $jsdispatchcases
+@@ -78,7 +78,7 @@ fail:
+ static SwigV8ReturnValue $jswrapper(const SwigV8Arguments &args, V8ErrorHandler &SWIGV8_ErrorHandler) {
+ SWIGV8_HANDLESCOPE();
+
+- v8::Handle self = args.Holder();
++ v8::Local self = args.Holder();
+ $jslocals
+ if(args.Length() != $jsargcount) SWIG_exception_fail(SWIG_ERROR, "Illegal number of arguments for $jswrapper.");
+ $jscode
+@@ -226,7 +226,7 @@ static SwigV8ReturnValue $jswrapper(v8::Local property, const SwigV8Pr
+ #endif
+ SWIGV8_HANDLESCOPE();
+
+- v8::Handle jsresult;
++ v8::Local jsresult;
+ $jslocals
+ $jscode
+ SWIGV8_RETURN_INFO(jsresult, info);
+@@ -271,7 +271,7 @@ fail:
+ static SwigV8ReturnValue $jswrapper(const SwigV8Arguments &args) {
+ SWIGV8_HANDLESCOPE();
+
+- v8::Handle jsresult;
++ v8::Local jsresult;
+ $jslocals
+ if(args.Length() != $jsargcount) SWIG_exception_fail(SWIG_ERROR, "Illegal number of arguments for $jswrapper.");
+
+@@ -296,7 +296,7 @@ fail:
+ static SwigV8ReturnValue $jswrapper(const SwigV8Arguments &args) {
+ SWIGV8_HANDLESCOPE();
+
+- v8::Handle jsresult;
++ v8::Local jsresult;
+ OverloadErrorHandler errorHandler;
+ $jscode
+
+@@ -320,7 +320,7 @@ static SwigV8ReturnValue $jswrapper(const SwigV8Arguments &args, V8ErrorHandler
+ {
+ SWIGV8_HANDLESCOPE();
+
+- v8::Handle jsresult;
++ v8::Local jsresult;
+ $jslocals
+ $jscode
+ SWIGV8_RETURN(jsresult);
+@@ -374,7 +374,7 @@ fail:
+ %fragment("jsv8_define_class_template", "templates")
+ %{
+ /* Name: $jsmangledname, Type: $jsmangledtype, Dtor: $jsdtor */
+- v8::Handle $jsmangledname_class = SWIGV8_CreateClassTemplate("$jsmangledname");
++ v8::Local $jsmangledname_class = SWIGV8_CreateClassTemplate("$jsmangledname");
+ SWIGV8_SET_CLASS_TEMPL($jsmangledname_clientData.class_templ, $jsmangledname_class);
+ $jsmangledname_clientData.dtor = $jsdtor;
+ if (SWIGTYPE_$jsmangledtype->clientdata == 0) {
+@@ -420,11 +420,15 @@ fail:
+ %fragment("jsv8_create_class_instance", "templates")
+ %{
+ /* Class: $jsname ($jsmangledname) */
+- v8::Handle $jsmangledname_class_0 = SWIGV8_CreateClassTemplate("$jsname");
++ v8::Local $jsmangledname_class_0 = SWIGV8_CreateClassTemplate("$jsname");
+ $jsmangledname_class_0->SetCallHandler($jsctor);
+ $jsmangledname_class_0->Inherit($jsmangledname_class);
++#if (SWIG_V8_VERSION < 0x0705)
+ $jsmangledname_class_0->SetHiddenPrototype(true);
+- v8::Handle $jsmangledname_obj = $jsmangledname_class_0->GetFunction();
++ v8::Local $jsmangledname_obj = $jsmangledname_class_0->GetFunction();
++#else
++ v8::Local $jsmangledname_obj = $jsmangledname_class_0->GetFunction(SWIGV8_CURRENT_CONTEXT()).ToLocalChecked();
++#endif
+ %}
+
+ /* -----------------------------------------------------------------------------
+@@ -435,7 +439,11 @@ fail:
+ * ----------------------------------------------------------------------------- */
+ %fragment("jsv8_register_class", "templates")
+ %{
++#if (SWIG_V8_VERSION < 0x0706)
+ $jsparent_obj->Set(SWIGV8_SYMBOL_NEW("$jsname"), $jsmangledname_obj);
++#else
++ $jsparent_obj->Set(SWIGV8_CURRENT_CONTEXT(), SWIGV8_SYMBOL_NEW("$jsname"), $jsmangledname_obj);
++#endif
+ %}
+
+ /* -----------------------------------------------------------------------------
+@@ -444,7 +452,7 @@ fail:
+ * ----------------------------------------------------------------------------- */
+ %fragment("jsv8_create_namespace", "templates")
+ %{
+- v8::Handle $jsmangledname_obj = SWIGV8_OBJECT_NEW();
++ v8::Local $jsmangledname_obj = SWIGV8_OBJECT_NEW();
+ %}
+
+ /* -----------------------------------------------------------------------------
+diff --git a/Lib/javascript/v8/javascriptcomplex.swg b/Lib/javascript/v8/javascriptcomplex.swg
+index d3b4aaffa6..533e548131 100644
+--- a/Lib/javascript/v8/javascriptcomplex.swg
++++ b/Lib/javascript/v8/javascriptcomplex.swg
+@@ -12,7 +12,7 @@
+ %fragment(SWIG_From_frag(Type),"header",
+ fragment=SWIG_From_frag(double))
+ {
+-SWIGINTERNINLINE v8::Handle
++SWIGINTERNINLINE v8::Local
+ SWIG_From_dec(Type)(%ifcplusplus(const Type&, Type) c)
+ {
+ SWIGV8_HANDLESCOPE_ESC();
+@@ -32,12 +32,12 @@ SWIG_From_dec(Type)(%ifcplusplus(const Type&, Type) c)
+ fragment=SWIG_AsVal_frag(double))
+ {
+ SWIGINTERN int
+-SWIG_AsVal_dec(Type) (v8::Handle o, Type* val)
++SWIG_AsVal_dec(Type) (v8::Local o, Type* val)
+ {
+ SWIGV8_HANDLESCOPE();
+
+ if (o->IsArray()) {
+- v8::Handle array = v8::Handle::Cast(o);
++ v8::Local array = v8::Local::Cast(o);
+
+ if(array->Length() != 2) SWIG_Error(SWIG_TypeError, "Illegal argument for complex: must be array[2].");
+ double re, im;
+@@ -74,12 +74,12 @@ SWIG_AsVal_dec(Type) (v8::Handle o, Type* val)
+ %fragment(SWIG_AsVal_frag(Type),"header",
+ fragment=SWIG_AsVal_frag(float)) {
+ SWIGINTERN int
+-SWIG_AsVal_dec(Type) (v8::Handle o, Type* val)
++SWIG_AsVal_dec(Type) (v8::Local o, Type* val)
+ {
+ SWIGV8_HANDLESCOPE();
+
+ if (o->IsArray()) {
+- v8::Handle array = v8::Handle::Cast(o);
++ v8::Local array = v8::Local::Cast(o);
+
+ if(array->Length() != 2) SWIG_Error(SWIG_TypeError, "Illegal argument for complex: must be array[2].");
+ double re, im;
+diff --git a/Lib/javascript/v8/javascripthelpers.swg b/Lib/javascript/v8/javascripthelpers.swg
+index 80fbd7aa1a..0cd24a1942 100644
+--- a/Lib/javascript/v8/javascripthelpers.swg
++++ b/Lib/javascript/v8/javascripthelpers.swg
+@@ -21,19 +21,19 @@ typedef v8::PropertyCallbackInfo SwigV8PropertyCallbackInfoVoid;
+ /**
+ * Creates a class template for a class with specified initialization function.
+ */
+-SWIGRUNTIME v8::Handle SWIGV8_CreateClassTemplate(const char* symbol) {
++SWIGRUNTIME v8::Local SWIGV8_CreateClassTemplate(const char* symbol) {
+ SWIGV8_HANDLESCOPE_ESC();
+
+ v8::Local class_templ = SWIGV8_FUNCTEMPLATE_NEW_VOID();
+ class_templ->SetClassName(SWIGV8_SYMBOL_NEW(symbol));
+
+- v8::Handle inst_templ = class_templ->InstanceTemplate();
++ v8::Local inst_templ = class_templ->InstanceTemplate();
+ inst_templ->SetInternalFieldCount(1);
+
+- v8::Handle equals_templ = class_templ->PrototypeTemplate();
++ v8::Local equals_templ = class_templ->PrototypeTemplate();
+ equals_templ->Set(SWIGV8_SYMBOL_NEW("equals"), SWIGV8_FUNCTEMPLATE_NEW(_SWIGV8_wrap_equals));
+
+- v8::Handle cptr_templ = class_templ->PrototypeTemplate();
++ v8::Local cptr_templ = class_templ->PrototypeTemplate();
+ cptr_templ->Set(SWIGV8_SYMBOL_NEW("getCPtr"), SWIGV8_FUNCTEMPLATE_NEW(_wrap_getCPtr));
+
+ SWIGV8_ESCAPE(class_templ);
+@@ -42,33 +42,39 @@ SWIGRUNTIME v8::Handle SWIGV8_CreateClassTemplate(const ch
+ /**
+ * Registers a class method with given name for a given class template.
+ */
+-SWIGRUNTIME void SWIGV8_AddMemberFunction(v8::Handle class_templ, const char* symbol,
++SWIGRUNTIME void SWIGV8_AddMemberFunction(v8::Local class_templ, const char* symbol,
+ SwigV8FunctionCallback _func) {
+- v8::Handle proto_templ = class_templ->PrototypeTemplate();
++ v8::Local proto_templ = class_templ->PrototypeTemplate();
+ proto_templ->Set(SWIGV8_SYMBOL_NEW(symbol), SWIGV8_FUNCTEMPLATE_NEW(_func));
+ }
+
+ /**
+ * Registers a class property with given name for a given class template.
+ */
+-SWIGRUNTIME void SWIGV8_AddMemberVariable(v8::Handle class_templ, const char* symbol,
++SWIGRUNTIME void SWIGV8_AddMemberVariable(v8::Local class_templ, const char* symbol,
+ SwigV8AccessorGetterCallback getter, SwigV8AccessorSetterCallback setter) {
+- v8::Handle proto_templ = class_templ->InstanceTemplate();
++ v8::Local proto_templ = class_templ->InstanceTemplate();
+ proto_templ->SetAccessor(SWIGV8_SYMBOL_NEW(symbol), getter, setter);
+ }
+
+ /**
+ * Registers a class method with given name for a given object.
+ */
+-SWIGRUNTIME void SWIGV8_AddStaticFunction(v8::Handle obj, const char* symbol,
++SWIGRUNTIME void SWIGV8_AddStaticFunction(v8::Local obj, const char* symbol,
+ const SwigV8FunctionCallback& _func) {
++#if (SWIG_V8_VERSION < 0x0705)
+ obj->Set(SWIGV8_SYMBOL_NEW(symbol), SWIGV8_FUNCTEMPLATE_NEW(_func)->GetFunction());
++#elif (SWIG_V8_VERSION < 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
+ }
+
+ /**
+ * Registers a class method with given name for a given object.
+ */
+-SWIGRUNTIME void SWIGV8_AddStaticVariable(v8::Handle obj, const char* symbol,
++SWIGRUNTIME void SWIGV8_AddStaticVariable(v8::Local obj, const char* symbol,
+ SwigV8AccessorGetterCallback getter, SwigV8AccessorSetterCallback setter) {
+ #if (V8_MAJOR_VERSION-0) < 5
+ obj->SetAccessor(SWIGV8_SYMBOL_NEW(symbol), getter, setter);
+diff --git a/Lib/javascript/v8/javascriptinit.swg b/Lib/javascript/v8/javascriptinit.swg
+index 8faf2dd8e1..450aa9c6d9 100644
+--- a/Lib/javascript/v8/javascriptinit.swg
++++ b/Lib/javascript/v8/javascriptinit.swg
+@@ -70,14 +70,14 @@ extern "C"
+ #if (NODE_MODULE_VERSION < 0x000C)
+ void SWIGV8_INIT (v8::Handle exports)
+ #else
+-void SWIGV8_INIT (v8::Handle exports, v8::Handle /*module*/)
++void SWIGV8_INIT (v8::Local exports, v8::Local /*module*/)
+ #endif
+ {
+ SWIG_InitializeModule(static_cast(&exports));
+
+ SWIGV8_HANDLESCOPE();
+
+- v8::Handle exports_obj = exports;
++ v8::Local exports_obj = exports;
+ %}
+
+
+diff --git a/Lib/javascript/v8/javascriptprimtypes.swg b/Lib/javascript/v8/javascriptprimtypes.swg
+index f76be983b1..24f5daf7c5 100644
+--- a/Lib/javascript/v8/javascriptprimtypes.swg
++++ b/Lib/javascript/v8/javascriptprimtypes.swg
+@@ -6,7 +6,7 @@
+
+ %fragment(SWIG_From_frag(bool),"header") {
+ SWIGINTERNINLINE
+-v8::Handle
++v8::Local
+ SWIG_From_dec(bool)(bool value)
+ {
+ return SWIGV8_BOOLEAN_NEW(value);
+@@ -16,7 +16,7 @@ SWIG_From_dec(bool)(bool value)
+ %fragment(SWIG_AsVal_frag(bool),"header",
+ fragment=SWIG_AsVal_frag(long)) {
+ SWIGINTERN
+-int SWIG_AsVal_dec(bool)(v8::Handle obj, bool *val)
++int SWIG_AsVal_dec(bool)(v8::Local obj, bool *val)
+ {
+ if(!obj->IsBoolean()) {
+ return SWIG_ERROR;
+@@ -31,7 +31,7 @@ int SWIG_AsVal_dec(bool)(v8::Handle obj, bool *val)
+
+ %fragment(SWIG_From_frag(int),"header") {
+ SWIGINTERNINLINE
+-v8::Handle SWIG_From_dec(int)(int value)
++v8::Local SWIG_From_dec(int)(int value)
+ {
+ return SWIGV8_INT32_NEW(value);
+ }
+@@ -39,7 +39,7 @@ v8::Handle SWIG_From_dec(int)(int value)
+
+ %fragment(SWIG_AsVal_frag(int),"header") {
+ SWIGINTERN
+-int SWIG_AsVal_dec(int)(v8::Handle valRef, int* val)
++int SWIG_AsVal_dec(int)(v8::Local valRef, int* val)
+ {
+ if (!valRef->IsNumber()) {
+ return SWIG_TypeError;
+@@ -54,7 +54,7 @@ int SWIG_AsVal_dec(int)(v8::Handle valRef, int* val)
+
+ %fragment(SWIG_From_frag(long),"header") {
+ SWIGINTERNINLINE
+-v8::Handle SWIG_From_dec(long)(long value)
++v8::Local SWIG_From_dec(long)(long value)
+ {
+ return SWIGV8_NUMBER_NEW(value);
+ }
+@@ -63,7 +63,7 @@ v8::Handle SWIG_From_dec(long)(long value)
+ %fragment(SWIG_AsVal_frag(long),"header",
+ fragment="SWIG_CanCastAsInteger") {
+ SWIGINTERN
+-int SWIG_AsVal_dec(long)(v8::Handle obj, long* val)
++int SWIG_AsVal_dec(long)(v8::Local obj, long* val)
+ {
+ if (!obj->IsNumber()) {
+ return SWIG_TypeError;
+@@ -79,7 +79,7 @@ int SWIG_AsVal_dec(long)(v8::Handle obj, long* val)
+ %fragment(SWIG_From_frag(unsigned long),"header",
+ fragment=SWIG_From_frag(long)) {
+ SWIGINTERNINLINE
+-v8::Handle SWIG_From_dec(unsigned long)(unsigned long value)
++v8::Local SWIG_From_dec(unsigned long)(unsigned long value)
+ {
+ return (value > LONG_MAX) ?
+ SWIGV8_INTEGER_NEW_UNS(value) : SWIGV8_INTEGER_NEW(%numeric_cast(value,long));
+@@ -89,7 +89,7 @@ v8::Handle SWIG_From_dec(unsigned long)(unsigned long value)
+ %fragment(SWIG_AsVal_frag(unsigned long),"header",
+ fragment="SWIG_CanCastAsInteger") {
+ SWIGINTERN
+-int SWIG_AsVal_dec(unsigned long)(v8::Handle obj, unsigned long *val)
++int SWIG_AsVal_dec(unsigned long)(v8::Local obj, unsigned long *val)
+ {
+ if(!obj->IsNumber()) {
+ return SWIG_TypeError;
+@@ -115,7 +115,7 @@ int SWIG_AsVal_dec(unsigned long)(v8::Handle obj, unsigned long *val)
+ fragment="SWIG_LongLongAvailable") {
+ %#ifdef SWIG_LONG_LONG_AVAILABLE
+ SWIGINTERNINLINE
+-v8::Handle SWIG_From_dec(long long)(long long value)
++v8::Local SWIG_From_dec(long long)(long long value)
+ {
+ return SWIGV8_NUMBER_NEW(value);
+ }
+@@ -128,7 +128,7 @@ v8::Handle SWIG_From_dec(long long)(long long value)
+ fragment="SWIG_LongLongAvailable") {
+ %#ifdef SWIG_LONG_LONG_AVAILABLE
+ SWIGINTERN
+-int SWIG_AsVal_dec(long long)(v8::Handle obj, long long* val)
++int SWIG_AsVal_dec(long long)(v8::Local obj, long long* val)
+ {
+ if (!obj->IsNumber()) {
+ return SWIG_TypeError;
+@@ -148,7 +148,7 @@ int SWIG_AsVal_dec(long long)(v8::Handle obj, long long* val)
+ fragment="SWIG_LongLongAvailable") {
+ %#ifdef SWIG_LONG_LONG_AVAILABLE
+ SWIGINTERNINLINE
+-v8::Handle SWIG_From_dec(unsigned long long)(unsigned long long value)
++v8::Local SWIG_From_dec(unsigned long long)(unsigned long long value)
+ {
+ return (value > LONG_MAX) ?
+ SWIGV8_INTEGER_NEW_UNS(value) : SWIGV8_INTEGER_NEW(%numeric_cast(value,long));
+@@ -162,7 +162,7 @@ v8::Handle SWIG_From_dec(unsigned long long)(unsigned long long value
+ fragment="SWIG_LongLongAvailable") {
+ %#ifdef SWIG_LONG_LONG_AVAILABLE
+ SWIGINTERN
+-int SWIG_AsVal_dec(unsigned long long)(v8::Handle obj, unsigned long long *val)
++int SWIG_AsVal_dec(unsigned long long)(v8::Local obj, unsigned long long *val)
+ {
+ if(!obj->IsNumber()) {
+ return SWIG_TypeError;
+@@ -185,7 +185,7 @@ int SWIG_AsVal_dec(unsigned long long)(v8::Handle obj, unsigned long
+
+ %fragment(SWIG_From_frag(double),"header") {
+ SWIGINTERN
+-v8::Handle SWIG_From_dec(double) (double val)
++v8::Local SWIG_From_dec(double) (double val)
+ {
+ return SWIGV8_NUMBER_NEW(val);
+ }
+@@ -193,7 +193,7 @@ v8::Handle SWIG_From_dec(double) (double val)
+
+ %fragment(SWIG_AsVal_frag(double),"header") {
+ SWIGINTERN
+-int SWIG_AsVal_dec(double)(v8::Handle obj, double *val)
++int SWIG_AsVal_dec(double)(v8::Local obj, double *val)
+ {
+ if(!obj->IsNumber()) {
+ return SWIG_TypeError;
+diff --git a/Lib/javascript/v8/javascriptrun.swg b/Lib/javascript/v8/javascriptrun.swg
+index 2452f4040d..db6299a84e 100644
+--- a/Lib/javascript/v8/javascriptrun.swg
++++ b/Lib/javascript/v8/javascriptrun.swg
+@@ -10,7 +10,11 @@
+ #if (V8_MAJOR_VERSION-0) < 4 && (SWIG_V8_VERSION < 0x031803)
+ #define SWIGV8_STRING_NEW2(cstr, len) v8::String::New(cstr, len)
+ #else
++#if (SWIG_V8_VERSION < 0x0706)
+ #define SWIGV8_STRING_NEW2(cstr, len) v8::String::NewFromUtf8(v8::Isolate::GetCurrent(), cstr, v8::String::kNormalString, len)
++#else
++#define SWIGV8_STRING_NEW2(cstr, len) (v8::String::NewFromUtf8(v8::Isolate::GetCurrent(), cstr, v8::NewStringType::kNormal, len)).ToLocalChecked()
++#endif
+ #endif
+
+ #if (V8_MAJOR_VERSION-0) < 4 && (SWIG_V8_VERSION < 0x031903)
+@@ -47,12 +51,18 @@ typedef v8::PropertyCallbackInfo SwigV8PropertyCallbackInfo;
+ #define SWIGV8_THROW_EXCEPTION(err) v8::ThrowException(err)
+ #define SWIGV8_STRING_NEW(str) v8::String::New(str)
+ #define SWIGV8_SYMBOL_NEW(sym) v8::String::NewSymbol(sym)
++#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)
+@@ -107,7 +117,7 @@ typedef v8::PropertyCallbackInfo SwigV8PropertyCallbackInfo;
+ #define SWIGV8_BOOLEAN_VALUE(handle) (handle)->BooleanValue()
+ #define SWIGV8_WRITE_UTF8(handle, buffer, len) (handle)->WriteUtf8(buffer, len)
+ #define SWIGV8_UTF8_LENGTH(handle) (handle)->Utf8Length()
+-#else
++#elif (SWIG_V8_VERSION < 0x0706)
+ #define SWIGV8_TO_OBJECT(handle) (handle)->ToObject(SWIGV8_CURRENT_CONTEXT()).ToLocalChecked()
+ #define SWIGV8_TO_STRING(handle) (handle)->ToString(SWIGV8_CURRENT_CONTEXT()).ToLocalChecked()
+ #define SWIGV8_NUMBER_VALUE(handle) (handle)->NumberValue(SWIGV8_CURRENT_CONTEXT()).ToChecked()
+@@ -115,6 +125,14 @@ typedef v8::PropertyCallbackInfo SwigV8PropertyCallbackInfo;
+ #define SWIGV8_BOOLEAN_VALUE(handle) (handle)->BooleanValue(SWIGV8_CURRENT_CONTEXT()).ToChecked()
+ #define SWIGV8_WRITE_UTF8(handle, buffer, len) (handle)->WriteUtf8(v8::Isolate::GetCurrent(), buffer, len)
+ #define SWIGV8_UTF8_LENGTH(handle) (handle)->Utf8Length(v8::Isolate::GetCurrent())
++#else
++#define SWIGV8_TO_OBJECT(handle) (handle)->ToObject(SWIGV8_CURRENT_CONTEXT()).ToLocalChecked()
++#define SWIGV8_TO_STRING(handle) (handle)->ToString(SWIGV8_CURRENT_CONTEXT()).ToLocalChecked()
++#define SWIGV8_NUMBER_VALUE(handle) (handle)->NumberValue(SWIGV8_CURRENT_CONTEXT()).ToChecked()
++#define SWIGV8_INTEGER_VALUE(handle) (handle)->IntegerValue(SWIGV8_CURRENT_CONTEXT()).ToChecked()
++#define SWIGV8_BOOLEAN_VALUE(handle) (handle)->BooleanValue(v8::Isolate::GetCurrent())
++#define SWIGV8_WRITE_UTF8(handle, buffer, len) (handle)->WriteUtf8(v8::Isolate::GetCurrent(), buffer, len)
++#define SWIGV8_UTF8_LENGTH(handle) (handle)->Utf8Length(v8::Isolate::GetCurrent())
+ #endif
+
+ /* ---------------------------------------------------------------------------
+@@ -163,7 +181,7 @@ public:
+ SWIGV8_THROW_EXCEPTION(err);
+ }
+ }
+- v8::Handle err;
++ v8::Local err;
+ };
+
+ /* ---------------------------------------------------------------------------
+@@ -228,13 +246,13 @@ public:
+
+ SWIGRUNTIME v8::Persistent SWIGV8_SWIGTYPE_Proxy_class_templ;
+
+-SWIGRUNTIME int SWIG_V8_ConvertInstancePtr(v8::Handle objRef, void **ptr, swig_type_info *info, int flags) {
++SWIGRUNTIME int SWIG_V8_ConvertInstancePtr(v8::Local objRef, void **ptr, swig_type_info *info, int flags) {
+ SWIGV8_HANDLESCOPE();
+
+ if(objRef->InternalFieldCount() < 1) return SWIG_ERROR;
+
+ #if (V8_MAJOR_VERSION-0) < 4 && (SWIG_V8_VERSION < 0x031511)
+- v8::Handle cdataRef = objRef->GetInternalField(0);
++ v8::Local cdataRef = objRef->GetInternalField(0);
+ SWIGV8_Proxy *cdata = static_cast(v8::External::Unwrap(cdataRef));
+ #else
+ SWIGV8_Proxy *cdata = static_cast(objRef->GetAlignedPointerFromInternalField(0));
+@@ -280,11 +298,11 @@ SWIGRUNTIME void SWIGV8_Proxy_DefaultDtor(const v8::WeakCallbackInfo valRef, void **ptr) {
++SWIGRUNTIME int SWIG_V8_GetInstancePtr(v8::Local valRef, void **ptr) {
+ if(!valRef->IsObject()) {
+ return SWIG_TypeError;
+ }
+- v8::Handle objRef = SWIGV8_TO_OBJECT(valRef);
++ v8::Local objRef = SWIGV8_TO_OBJECT(valRef);
+
+ if(objRef->InternalFieldCount() < 1) return SWIG_ERROR;
+
+@@ -304,7 +322,7 @@ SWIGRUNTIME int SWIG_V8_GetInstancePtr(v8::Handle valRef, void **ptr)
+ return SWIG_OK;
+ }
+
+-SWIGRUNTIME void SWIGV8_SetPrivateData(v8::Handle obj, void *ptr, swig_type_info *info, int flags) {
++SWIGRUNTIME void SWIGV8_SetPrivateData(v8::Local obj, void *ptr, swig_type_info *info, int flags) {
+ SWIGV8_Proxy *cdata = new SWIGV8_Proxy();
+ cdata->swigCObject = ptr;
+ cdata->swigCMemOwn = (flags & SWIG_POINTER_OWN) ? 1 : 0;
+@@ -361,13 +379,15 @@ SWIGRUNTIME void SWIGV8_SetPrivateData(v8::Handle obj, void *ptr, sw
+ cdata->handle.MarkIndependent();
+ #elif (V8_MAJOR_VERSION-0) < 4 && (SWIG_V8_VERSION < 0x032100)
+ cdata->handle.MarkIndependent(v8::Isolate::GetCurrent());
+-#else
++#elif (SWIG_V8_VERSION < 0x0706)
+ cdata->handle.MarkIndependent();
++// Looks like future versions do not require that anymore:
++// https://monorail-prod.appspot.com/p/chromium/issues/detail?id=923361#c11
+ #endif
+
+ }
+
+-SWIGRUNTIME int SWIG_V8_ConvertPtr(v8::Handle valRef, void **ptr, swig_type_info *info, int flags) {
++SWIGRUNTIME int SWIG_V8_ConvertPtr(v8::Local valRef, void **ptr, swig_type_info *info, int flags) {
+ SWIGV8_HANDLESCOPE();
+
+ /* special case: JavaScript null => C NULL pointer */
+@@ -378,14 +398,14 @@ SWIGRUNTIME int SWIG_V8_ConvertPtr(v8::Handle valRef, void **ptr, swi
+ if(!valRef->IsObject()) {
+ return SWIG_TypeError;
+ }
+- v8::Handle objRef = SWIGV8_TO_OBJECT(valRef);
++ v8::Local objRef = SWIGV8_TO_OBJECT(valRef);
+ return SWIG_V8_ConvertInstancePtr(objRef, ptr, info, flags);
+ }
+
+-SWIGRUNTIME v8::Handle SWIG_V8_NewPointerObj(void *ptr, swig_type_info *info, int flags) {
++SWIGRUNTIME v8::Local SWIG_V8_NewPointerObj(void *ptr, swig_type_info *info, int flags) {
+ SWIGV8_HANDLESCOPE_ESC();
+
+- v8::Handle class_templ;
++ v8::Local class_templ;
+
+ if (ptr == NULL) {
+ #if (V8_MAJOR_VERSION-0) < 4 && (SWIG_V8_VERSION < 0x031903)
+@@ -412,8 +432,11 @@ SWIGRUNTIME v8::Handle SWIG_V8_NewPointerObj(void *ptr, swig_type_inf
+ }
+ #endif
+
+-// v8::Handle result = class_templ->InstanceTemplate()->NewInstance();
++#if (SWIG_V8_VERSION < 0x0705)
+ v8::Local result = class_templ->InstanceTemplate()->NewInstance();
++#else
++ v8::Local result = class_templ->InstanceTemplate()->NewInstance(SWIGV8_CURRENT_CONTEXT()).ToLocalChecked();
++#endif
+ SWIGV8_SetPrivateData(result, ptr, info, flags);
+
+ SWIGV8_ESCAPE(result);
+@@ -433,7 +456,7 @@ SWIGRUNTIME v8::Handle SWIG_V8_NewPointerObj(void *ptr, swig_type_inf
+ SWIGRUNTIME SwigV8ReturnValue _SWIGV8_wrap_equals(const SwigV8Arguments &args) {
+ SWIGV8_HANDLESCOPE();
+
+- v8::Handle jsresult;
++ v8::Local jsresult;
+ void *arg1 = (void *) 0 ;
+ void *arg2 = (void *) 0 ;
+ bool result;
+@@ -463,7 +486,7 @@ fail:
+ SWIGRUNTIME SwigV8ReturnValue _wrap_getCPtr(const SwigV8Arguments &args) {
+ SWIGV8_HANDLESCOPE();
+
+- v8::Handle jsresult;
++ v8::Local jsresult;
+ void *arg1 = (void *) 0 ;
+ long result;
+ int res1;
+@@ -502,10 +525,10 @@ public:
+ };
+
+ SWIGRUNTIMEINLINE
+-int SwigV8Packed_Check(v8::Handle valRef) {
++int SwigV8Packed_Check(v8::Local valRef) {
+ SWIGV8_HANDLESCOPE();
+
+- v8::Handle objRef = SWIGV8_TO_OBJECT(valRef);
++ v8::Local objRef = SWIGV8_TO_OBJECT(valRef);
+ if(objRef->InternalFieldCount() < 1) return false;
+ #if (V8_MAJOR_VERSION-0) < 5
+ v8::Handle flag = objRef->GetHiddenValue(SWIGV8_STRING_NEW("__swig__packed_data__"));
+@@ -519,13 +542,13 @@ int SwigV8Packed_Check(v8::Handle valRef) {
+ }
+
+ SWIGRUNTIME
+-swig_type_info *SwigV8Packed_UnpackData(v8::Handle valRef, void *ptr, size_t size) {
++swig_type_info *SwigV8Packed_UnpackData(v8::Local valRef, void *ptr, size_t size) {
+ if (SwigV8Packed_Check(valRef)) {
+ SWIGV8_HANDLESCOPE();
+
+ SwigV8PackedData *sobj;
+
+- v8::Handle objRef = SWIGV8_TO_OBJECT(valRef);
++ v8::Local objRef = SWIGV8_TO_OBJECT(valRef);
+
+ #if (V8_MAJOR_VERSION-0) < 4 && (SWIG_V8_VERSION < 0x031511)
+ v8::Handle cdataRef = objRef->GetInternalField(0);
+@@ -542,7 +565,7 @@ swig_type_info *SwigV8Packed_UnpackData(v8::Handle valRef, void *ptr,
+ }
+
+ SWIGRUNTIME
+-int SWIGV8_ConvertPacked(v8::Handle valRef, void *ptr, size_t sz, swig_type_info *ty) {
++int SWIGV8_ConvertPacked(v8::Local valRef, void *ptr, size_t sz, swig_type_info *ty) {
+ swig_type_info *to = SwigV8Packed_UnpackData(valRef, ptr, sz);
+ if (!to) return SWIG_ERROR;
+ if (ty) {
+@@ -590,7 +613,7 @@ SWIGRUNTIME void _wrap_SwigV8PackedData_delete(const v8::WeakCallbackInfo SWIGV8_NewPackedObj(void *data, size_t size, swig_type_info *type) {
++v8::Local SWIGV8_NewPackedObj(void *data, size_t size, swig_type_info *type) {
+ SWIGV8_HANDLESCOPE_ESC();
+
+ SwigV8PackedData *cdata = new SwigV8PackedData(data, size, type);
+@@ -636,8 +659,10 @@ v8::Handle SWIGV8_NewPackedObj(void *data, size_t size, swig_type_inf
+ cdata->handle.MarkIndependent();
+ #elif (V8_MAJOR_VERSION-0) < 4 && (SWIG_V8_VERSION < 0x032100)
+ cdata->handle.MarkIndependent(v8::Isolate::GetCurrent());
+-#else
++#elif (SWIG_V8_VERSION < 0x0706)
+ cdata->handle.MarkIndependent();
++// Looks like future versions do not require that anymore:
++// https://monorail-prod.appspot.com/p/chromium/issues/detail?id=923361#c11
+ #endif
+
+ SWIGV8_ESCAPE(obj);
+@@ -657,7 +682,7 @@ SWIGRUNTIME
+ #if (V8_MAJOR_VERSION-0) < 4 && (SWIG_V8_VERSION < 0x031903)
+ v8::Handle SWIGV8_AppendOutput(v8::Handle result, v8::Handle obj) {
+ #else
+-v8::Handle SWIGV8_AppendOutput(v8::Local result, v8::Handle obj) {
++v8::Local SWIGV8_AppendOutput(v8::Local result, v8::Local obj) {
+ #endif
+ SWIGV8_HANDLESCOPE_ESC();
+
+@@ -669,7 +694,12 @@ v8::Handle SWIGV8_AppendOutput(v8::Local result, v8::Handl
+ #else
+ v8::Local arr = v8::Local::Cast(result);
+ #endif
++
++#if (SWIG_V8_VERSION < 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 c78e04efbb..773014f2a5 100644
+--- a/Lib/javascript/v8/javascriptruntime.swg
++++ b/Lib/javascript/v8/javascriptruntime.swg
+@@ -56,6 +56,11 @@
+ %insert(runtime) %{
+ #include
+
++#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
+ #include
+ #include
+diff --git a/Lib/javascript/v8/javascriptstrings.swg b/Lib/javascript/v8/javascriptstrings.swg
+index e767a6d662..61a937fa52 100644
+--- a/Lib/javascript/v8/javascriptstrings.swg
++++ b/Lib/javascript/v8/javascriptstrings.swg
+@@ -4,10 +4,10 @@
+ * ------------------------------------------------------------ */
+ %fragment("SWIG_AsCharPtrAndSize", "header", fragment="SWIG_pchar_descriptor") {
+ SWIGINTERN int
+-SWIG_AsCharPtrAndSize(v8::Handle valRef, char** cptr, size_t* psize, int *alloc)
++SWIG_AsCharPtrAndSize(v8::Local valRef, char** cptr, size_t* psize, int *alloc)
+ {
+ if(valRef->IsString()) {
+- v8::Handle js_str = SWIGV8_TO_STRING(valRef);
++ v8::Local js_str = SWIGV8_TO_STRING(valRef);
+
+ size_t len = SWIGV8_UTF8_LENGTH(js_str) + 1;
+ char* cstr = new char[len];
+@@ -20,7 +20,7 @@ SWIG_AsCharPtrAndSize(v8::Handle valRef, char** cptr, size_t* psize,
+ return SWIG_OK;
+ } else {
+ if(valRef->IsObject()) {
+- v8::Handle obj = SWIGV8_TO_OBJECT(valRef);
++ v8::Local obj = SWIGV8_TO_OBJECT(valRef);
+ // try if the object is a wrapped char[]
+ swig_type_info* pchar_descriptor = SWIG_pchar_descriptor();
+ if (pchar_descriptor) {
+@@ -41,7 +41,7 @@ SWIG_AsCharPtrAndSize(v8::Handle valRef, char** cptr, size_t* psize,
+ }
+
+ %fragment("SWIG_FromCharPtrAndSize","header",fragment="SWIG_pchar_descriptor") {
+-SWIGINTERNINLINE v8::Handle
++SWIGINTERNINLINE v8::Local
+ SWIG_FromCharPtrAndSize(const char* carray, size_t size)
+ {
+ if (carray) {
+@@ -49,7 +49,7 @@ SWIG_FromCharPtrAndSize(const char* carray, size_t size)
+ // TODO: handle extra long strings
+ return SWIGV8_UNDEFINED();
+ } else {
+- v8::Handle js_str = SWIGV8_STRING_NEW2(carray, size);
++ v8::Local js_str = SWIGV8_STRING_NEW2(carray, size);
+ return js_str;
+ }
+ } else {
+diff --git a/Lib/javascript/v8/javascripttypemaps.swg b/Lib/javascript/v8/javascripttypemaps.swg
+index 4601698e03..fbe7849cd2 100644
+--- a/Lib/javascript/v8/javascripttypemaps.swg
++++ b/Lib/javascript/v8/javascripttypemaps.swg
+@@ -25,7 +25,7 @@
+
+ /* Javascript types */
+
+-#define SWIG_Object v8::Handle
++#define SWIG_Object v8::Local
+ #define VOID_Object SWIGV8_UNDEFINED()
+
+ /* Overload of the output/constant/exception/dirout handling */
+diff --git a/Source/Modules/javascript.cxx b/Source/Modules/javascript.cxx
+index d2b33b1b42..450ebbd497 100644
+--- a/Source/Modules/javascript.cxx
++++ b/Source/Modules/javascript.cxx
+@@ -548,7 +548,7 @@ void JAVASCRIPT::main(int argc, char *argv[]) {
+ }
+ Swig_mark_arg(i);
+ engine = JSEmitter::JavascriptCore;
+- } else if (strcmp(argv[i], "-node") == 0) {
++ } else if ((strcmp(argv[i], "-node") == 0) || (strcmp(argv[i], "-electron") == 0)) {
+ if (engine != -1) {
+ Printf(stderr, ERR_MSG_ONLY_ONE_ENGINE_PLEASE);
+ SWIG_exit(-1);
+@@ -594,7 +594,7 @@ void JAVASCRIPT::main(int argc, char *argv[]) {
+ }
+ default:
+ {
+- Printf(stderr, "SWIG Javascript: Unknown engine. Please specify one of '-jsc', '-v8' or '-node'.\n");
++ Printf(stderr, "SWIG Javascript: Unknown engine. Please specify one of '-jsc', '-v8' or '-node/-electron'.\n");
+ SWIG_exit(-1);
+ break;
+ }
+diff --git a/Tools/javascript/v8_shell.cxx b/Tools/javascript/v8_shell.cxx
+index 5001bc25a6..8067247a41 100644
+--- a/Tools/javascript/v8_shell.cxx
++++ b/Tools/javascript/v8_shell.cxx
+@@ -9,7 +9,7 @@
+
+ #include "js_shell.h"
+
+-typedef int (*V8ExtensionInitializer) (v8::Handle module);
++typedef int (*V8ExtensionInitializer) (v8::Local module);
+
+ // Note: these typedefs and defines are used to deal with v8 API changes since version 3.19.00
+
+@@ -87,7 +87,7 @@ class V8Shell: public JSShell {
+
+ private:
+
+- v8::Handle Import(const std::string &moduleName);
++ v8::Local Import(const std::string &moduleName);
+
+ SwigV8Context CreateShellContext();
+
+@@ -135,7 +135,7 @@ bool V8Shell::RunScript(const std::string &scriptPath) {
+
+ // Store a pointer to this shell for later use
+
+- v8::Handle global = context->Global();
++ v8::Local global = context->Global();
+ v8::Local __shell__ = SWIGV8_EXTERNAL_NEW((void*) (long) this);
+
+ global->SetHiddenValue(SWIGV8_STRING_NEW("__shell__"), __shell__);
+@@ -215,7 +215,7 @@ bool V8Shell::ExecuteScript(const std::string &source, const std::string &name)
+ SWIGV8_HANDLESCOPE();
+
+ v8::TryCatch try_catch;
+- v8::Handle script = v8::Script::Compile(SWIGV8_STRING_NEW(source.c_str()), SWIGV8_STRING_NEW(name.c_str()));
++ v8::Local script = v8::Script::Compile(SWIGV8_STRING_NEW(source.c_str()), SWIGV8_STRING_NEW(name.c_str()));
+
+ // Stop if script is empty
+ if (script.IsEmpty()) {
+@@ -224,7 +224,7 @@ bool V8Shell::ExecuteScript(const std::string &source, const std::string &name)
+ return false;
+ }
+
+- v8::Handle result = script->Run();
++ v8::Local result = script->Run();
+
+ // Print errors that happened during execution.
+ if (try_catch.HasCaught()) {
+@@ -241,7 +241,7 @@ bool V8Shell::DisposeEngine() {
+
+ SwigV8Context V8Shell::CreateShellContext() {
+ // Create a template for the global object.
+- v8::Handle global = v8::ObjectTemplate::New();
++ v8::Local global = v8::ObjectTemplate::New();
+
+ // Bind global functions
+ global->Set(SWIGV8_STRING_NEW("print"), SWIGV8_FUNCTEMPLATE_NEW(V8Shell::Print));
+@@ -258,7 +258,7 @@ SwigV8Context V8Shell::CreateShellContext() {
+ #endif
+ }
+
+-v8::Handle V8Shell::Import(const std::string &module_path)
++v8::Local V8Shell::Import(const std::string &module_path)
+ {
+ SWIGV8_HANDLESCOPE_ESC();
+
+@@ -319,7 +319,7 @@ SwigV8ReturnValue V8Shell::Require(const SwigV8Arguments &args) {
+ v8::Local __shell__ = v8::Local::Cast(hidden);
+ V8Shell *_this = (V8Shell *) (long) __shell__->Value();
+
+- v8::Handle module = _this->Import(moduleName);
++ v8::Local module = _this->Import(moduleName);
+
+ SWIGV8_RETURN(module);
+ }
+@@ -345,7 +345,7 @@ void V8Shell::ReportException(v8::TryCatch *try_catch) {
+
+ v8::String::Utf8Value exception(try_catch->Exception());
+ const char *exception_string = V8Shell::ToCString(exception);
+- v8::Handle message = try_catch->Message();
++ v8::Local message = try_catch->Message();
+ if (message.IsEmpty()) {
+ // V8 didn't provide any extra information about this error; just
+ // print the exception.
+diff --git a/Tools/testflags.py b/Tools/testflags.py
+index f3d216b59a..64528d6925 100755
+--- a/Tools/testflags.py
++++ b/Tools/testflags.py
+@@ -41,7 +41,10 @@ def get_cxxflags(language, std, compiler):
+ "go":"-Werror " + cxx_common,
+ "guile":"-Werror " + cxx_common,
+ "java":"-Werror " + cxx_common,
+- "javascript":"-Werror " + cxx_common + " -Wno-error=unused-function", # Until overload_rename is fixed for node
++ "javascript":"-Werror " + cxx_common +
++ " -Wno-error=unused-function" + # Until overload_rename is fixed for node
++ " -Wno-error=unused-result -Wno-unused-result", # Until proper update of latest NodeJS / V8
++ # " -Wno-error=cast-function-type" + Only in GCC 8.x+
+ "lua":"-Werror " + cxx_common,
+ "mzscheme":"-Werror " + cxx_common,
+ "ocaml":"-Werror " + cxx_common,
+diff --git a/Tools/travis-linux-install.sh b/Tools/travis-linux-install.sh
+index c8347d27a4..04683572af 100755
+--- a/Tools/travis-linux-install.sh
++++ b/Tools/travis-linux-install.sh
+@@ -33,7 +33,7 @@ case "$SWIGLANG" in
+ ;;
+ "javascript")
+ case "$ENGINE" in
+- "node")
++ "node"|"electron")
+ travis_retry wget -qO- https://raw.githubusercontent.com/creationix/nvm/v0.33.10/install.sh | bash
+ export NVM_DIR="$HOME/.nvm"
+ [ -s "$NVM_DIR/nvm.sh" ] && \. "$NVM_DIR/nvm.sh"
+@@ -45,6 +45,11 @@ case "$SWIGLANG" in
+ else
+ travis_retry npm install -g node-gyp
+ fi
++
++ if [ ! -z "$ELECTRON_VER" ] ; then
++ travis_retry npm install -g electron@$ELECTRON_VER
++ fi
++
+ ;;
+ "jsc")
+ travis_retry sudo apt-get install -qq libwebkitgtk-dev
+
diff --git a/swig-node-v7.patch b/swig-node-v7.patch
new file mode 100644
index 0000000..4f5e1fc
--- /dev/null
+++ b/swig-node-v7.patch
@@ -0,0 +1,541 @@
+From f08d7a63a92a3ba89d97bdfcc206e1e1c4804c0f Mon Sep 17 00:00:00 2001
+From: Patrick Schneider
+Date: Thu, 13 Apr 2017 15:02:53 +0200
+Subject: [PATCH 1/2] Add Node 7.x aka V8 5.2+ support
+
+* Use WeakCallbackInfo instead of WeakCallbackData
+* Use GetPrivate instead of GetHiddenValue
+* Adopted new signature for SetWeak to support destructor calling
+* SetAccessor deprecation fixed
+* Proper version checks where applicable
+---
+ Lib/javascript/v8/javascriptcode.swg | 27 +++++++++++++++++-----
+ Lib/javascript/v8/javascripthelpers.swg | 29 +++++++++++++++++++++---
+ Lib/javascript/v8/javascriptinit.swg | 16 +++++++++++--
+ Lib/javascript/v8/javascriptrun.swg | 40 ++++++++++++++++++++++++++++-----
+ 4 files changed, 95 insertions(+), 17 deletions(-)
+
+diff --git a/Lib/javascript/v8/javascriptcode.swg b/Lib/javascript/v8/javascriptcode.swg
+index fb7d55c2ad..b8c5089816 100644
+--- a/Lib/javascript/v8/javascriptcode.swg
++++ b/Lib/javascript/v8/javascriptcode.swg
+@@ -133,10 +133,13 @@ static void $jswrapper(v8::Isolate *isolate, v8::Persistent object, v
+ SWIGV8_Proxy *proxy = static_cast(parameter);
+ #elif (V8_MAJOR_VERSION-0) < 4 && (SWIG_V8_VERSION < SWIGV8_SETWEAK_VERSION)
+ static void $jswrapper(v8::Isolate *isolate, v8::Persistent *object, SWIGV8_Proxy *proxy) {
+-#else
++#elif (V8_MAJOR_VERSION-0) < 5 || (V8_MAJOR_VERSION == 5 && V8_MINOR_VERSION < 2)
+ static void $jswrapper(const v8::WeakCallbackData &data) {
+ v8::Local object = data.GetValue();
+ SWIGV8_Proxy *proxy = data.GetParameter();
++#else
++ static void $jswrapper(const v8::WeakCallbackInfo &data) {
++ SWIGV8_Proxy *proxy = data.GetParameter();
+ #endif
+
+ if(proxy->swigCMemOwn && proxy->swigCObject) {
+@@ -147,7 +150,9 @@ static void $jswrapper(const v8::WeakCallbackData &dat
+ }
+ delete proxy;
+
++#if (V8_MAJOR_VERSION-0) < 5 || (V8_MAJOR_VERSION == 5 && V8_MINOR_VERSION < 2)
+ object.Clear();
++#endif
+
+ #if (V8_MAJOR_VERSION-0) < 4 && (SWIG_V8_VERSION < 0x031710)
+ object.Dispose();
+@@ -155,7 +160,7 @@ static void $jswrapper(const v8::WeakCallbackData &dat
+ object.Dispose(isolate);
+ #elif (V8_MAJOR_VERSION-0) < 4 && (SWIG_V8_VERSION < 0x032100)
+ object->Dispose(isolate);
+-#else
++#elif (V8_MAJOR_VERSION-0) < 5 || (V8_MAJOR_VERSION == 5 && V8_MINOR_VERSION < 2)
+ object->Dispose();
+ #endif
+ }
+@@ -177,10 +182,13 @@ static void $jswrapper(v8::Isolate *isolate, v8::Persistent object, v
+ SWIGV8_Proxy *proxy = static_cast(parameter);
+ #elif (V8_MAJOR_VERSION-0) < 4 && (SWIG_V8_VERSION < SWIGV8_SETWEAK_VERSION)
+ static void $jswrapper(v8::Isolate *isolate, v8::Persistent< v8::Object> *object, SWIGV8_Proxy *proxy) {
+-#else
++#elif (V8_MAJOR_VERSION-0) < 5 || (V8_MAJOR_VERSION == 5 && V8_MINOR_VERSION < 2)
+ static void $jswrapper(const v8::WeakCallbackData &data) {
+ v8::Local object = data.GetValue();
+ SWIGV8_Proxy *proxy = data.GetParameter();
++#else
++static void $jswrapper(const v8::WeakCallbackInfo &data) {
++ SWIGV8_Proxy *proxy = data.GetParameter();
+ #endif
+
+ if(proxy->swigCMemOwn && proxy->swigCObject) {
+@@ -197,7 +205,7 @@ static void $jswrapper(const v8::WeakCallbackData &dat
+ object->Dispose(isolate);
+ #elif (V8_MAJOR_VERSION-0) < 4 && (SWIG_V8_VERSION < SWIGV8_SETWEAK_VERSION)
+ object->Dispose();
+-#else
++#elif (V8_MAJOR_VERSION-0) < 5 || (V8_MAJOR_VERSION == 5 && V8_MINOR_VERSION < 2)
+ object.Clear();
+ #endif
+ }
+@@ -211,7 +219,11 @@ static void $jswrapper(const v8::WeakCallbackData &dat
+ * ----------------------------------------------------------------------------- */
+ %fragment("js_getter", "templates")
+ %{
++#if (V8_MAJOR_VERSION-0) < 5 || (V8_MAJOR_VERSION == 5 && V8_MINOR_VERSION < 2)
+ static SwigV8ReturnValue $jswrapper(v8::Local