diff --git a/.gitignore b/.gitignore index 8cec1dc..2286b59 100644 --- a/.gitignore +++ b/.gitignore @@ -25,11 +25,3 @@ swig-2.0.0.tar.gz /swig-4.0.0.tar.gz /swig-4.0.1.tar.gz /swig-4.0.2.tar.gz -/swig-4.1.0.tar.gz -/swig-4.1.1.tar.gz -/swig-4.2.0.tar.gz -/swig-4.2.1.tar.gz -/swig-4.3.0.tar.gz -/swig-4.3.1.tar.gz -/swig-4.4.0.tar.gz -/swig-4.4.1.tar.gz diff --git a/sources b/sources index f6fe3ce..f9f798f 100644 --- a/sources +++ b/sources @@ -1 +1 @@ -SHA512 (swig-4.4.1.tar.gz) = 103ddb4a5914f28e6739a006d35042c701e55ba05066acff3f3609befb5f43f253ea717fc41d06c93d8fb187ded4399c12c94665b93dc06d0fb835069391c7c7 +SHA512 (swig-4.0.2.tar.gz) = 05e7da70ce6d9a733b96c0bcfa3c1b82765bd859f48c74759bbf4bb1467acb1809caa310cba5e2b3280cd704fca249eaa0624821dffae1d2a75097c7f55d14ed 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-overload_simple_cast-test-with-Python-3.10.patch b/swig-4.0.2-Fix-overload_simple_cast-test-with-Python-3.10.patch new file mode 100644 index 0000000..a3c8cff --- /dev/null +++ b/swig-4.0.2-Fix-overload_simple_cast-test-with-Python-3.10.patch @@ -0,0 +1,23 @@ +From a2850397ba3eec5d4c58304cf8277ca535919760 Mon Sep 17 00:00:00 2001 +From: Julien Schueller +Date: Thu, 5 Aug 2021 14:05:10 +0200 +Subject: [PATCH] [Python] Fix overload_simple_cast test with 3.10 + +Closes #2044 +--- + Examples/test-suite/python/python_overload_simple_cast_runme.py | 2 ++ + 1 file changed, 2 insertions(+) + +diff --git a/Examples/test-suite/python/python_overload_simple_cast_runme.py b/Examples/test-suite/python/python_overload_simple_cast_runme.py +index fc398ab29b9..7a0174af8a2 100644 +--- a/Examples/test-suite/python/python_overload_simple_cast_runme.py ++++ b/Examples/test-suite/python/python_overload_simple_cast_runme.py +@@ -9,6 +9,8 @@ def __init__(self, x): + def __int__(self): + return self.x + ++ def __index__(self): ++ return self.x + + class Ad: + 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 @@

32 SWIG and PHP

+ +

+ 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 @@

11.3 Conditional Compilation5.1 Running SWIG

+ -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-octave-6.patch b/swig-octave-6.patch new file mode 100644 index 0000000..f3cc909 --- /dev/null +++ b/swig-octave-6.patch @@ -0,0 +1,346 @@ +From 582e3a3fee8a7cfe5903da1c4b0db8e40d5d2deb Mon Sep 17 00:00:00 2001 +From: Robert Fries +Date: Wed, 12 May 2021 19:44:17 -0400 +Subject: [PATCH 2/5] Allow swig wrapped modules to compile with -Bsymbolic + +--- + Lib/octave/octrun.swg | 8 ++++++++ + Lib/octave/octruntime.swg | 2 ++ + 2 files changed, 10 insertions(+) + +diff --git a/Lib/octave/octrun.swg b/Lib/octave/octrun.swg +index 1069e0e54b7..a7291df1478 100644 +--- a/Lib/octave/octrun.swg ++++ b/Lib/octave/octrun.swg +@@ -1178,6 +1178,10 @@ SWIGRUNTIME void swig_acquire_ownership_obj(void *vptr, int own); + #endif + { return ptr->print(os, pr_as_read_syntax); } + ++#if SWIG_OCTAVE_PREREQ(4,4,0) ++ static void set_type_id(int type_id) { t_id=type_id; } ++#endif ++ + virtual type_conv_info numeric_conversion_function(void) const { + return octave_base_value::type_conv_info (default_numeric_conversion_function, + octave_scalar::static_type_id ()); +@@ -1285,6 +1289,10 @@ SWIGRUNTIME void swig_acquire_ownership_obj(void *vptr, int own); + # endif + #endif + ++#if SWIG_OCTAVE_PREREQ(4,4,0) ++ static void set_type_id(int type_id) { t_id=type_id; } ++#endif ++ + private: + #if !SWIG_OCTAVE_PREREQ(4,0,0) + DECLARE_OCTAVE_ALLOCATOR; +diff --git a/Lib/octave/octruntime.swg b/Lib/octave/octruntime.swg +index a397fb7c189..ca69e44c48f 100644 +--- a/Lib/octave/octruntime.swg ++++ b/Lib/octave/octruntime.swg +@@ -295,9 +295,11 @@ DEFUN_DLD( SWIG_name, args, nargout, SWIG_name_usage ) { + for (int i = 0; i < types.numel(); ++i) { + if (types(i) == octave_swig_ref::static_type_name()) { + register_octave_swig_ref = false; ++ octave_swig_ref::set_type_id(i); + } + if (types(i) == octave_swig_packed::static_type_name()) { + register_octave_swig_packed = false; ++ octave_swig_packed::set_type_id(i); + } + } + if (register_octave_swig_ref) { + +From 2536f07ec26a06adb4290747cd229928b569ed72 Mon Sep 17 00:00:00 2001 +From: Robert Fries +Date: Wed, 12 May 2021 19:45:24 -0400 +Subject: [PATCH 3/5] Octave module lets examples and tests work with Octave-6 + * Try-catch replacement for check of error_state * Add execute method in + addition to call * Replace oct_mach_info with octave::mach_info * Call + from interpreter: global_varval global_assign * Assign a global name + requires locating the stack which requires interpreter to tree evaluator + to callStack * Do not use discard_error_messages or + discard_warning_messages + +--- + Lib/octave/octcontainer.swg | 11 +++++- + Lib/octave/octrun.swg | 69 ++++++++++++++++++++++++++++++++++--- + Lib/octave/octruntime.swg | 12 +++++-- + 3 files changed, 83 insertions(+), 9 deletions(-) + +diff --git a/Lib/octave/octcontainer.swg b/Lib/octave/octcontainer.swg +index 80d593f4fd5..85954acb031 100644 +--- a/Lib/octave/octcontainer.swg ++++ b/Lib/octave/octcontainer.swg +@@ -569,8 +569,17 @@ namespace swig { + } else { + return octseq.check() ? SWIG_OK : SWIG_ERROR; + } +- } catch (std::exception& e) { ++ } ++%#if SWIG_OCTAVE_PREREQ(6,0,0) ++ catch (octave::execution_exception& exec) { ++ } ++%#endif ++ catch (std::exception& e) { ++%#if SWIG_OCTAVE_PREREQ(6,0,0) ++ if (seq) // Know that octave is not in an error state ++%#else + if (seq&&!error_state) ++%#endif + error("swig type error: %s",e.what()); + return SWIG_ERROR; + } +diff --git a/Lib/octave/octrun.swg b/Lib/octave/octrun.swg +index a7291df1478..68bdeea0993 100644 +--- a/Lib/octave/octrun.swg ++++ b/Lib/octave/octrun.swg +@@ -171,7 +171,16 @@ SWIGRUNTIME void swig_acquire_ownership_obj(void *vptr, int own); + + octave_function* function_value(bool = false) { return this; } + ++#if SWIG_OCTAVE_PREREQ(6,0,0) ++ octave_value_list call(octave::tree_evaluator& tw, int nargout = 0, const octave_value_list& args = octave_value_list()) { ++ return execute(tw,nargout,args); ++ } ++#endif ++#if SWIG_OCTAVE_PREREQ(6,0,0) ++ octave_value_list execute(octave::tree_evaluator& tw, int nargout = 0, const octave_value_list& args = octave_value_list()) { ++#else + octave_value_list call(octave::tree_evaluator& tw, int nargout = 0, const octave_value_list& args = octave_value_list()) { ++#endif + octave_value_list all_args; + all_args.append(first_args); + all_args.append(args); +@@ -456,10 +465,20 @@ SWIGRUNTIME void swig_acquire_ownership_obj(void *vptr, int own); + // Fill in dim_vector + for (int k=0;k a; ++ try { ++ a = out.int_vector_value(); ++ } ++ catch (octave::execution_exception& oee) { ++ return dim_vector(1,1); ++ } ++#else + Array a = out.int_vector_value(); + if (error_state) return dim_vector(1,1); ++#endif + dim_vector d; + d.resize(a.numel() < 2 ? 2 : a.numel()); + d(0) = d(1) = 1; +@@ -874,7 +903,11 @@ SWIGRUNTIME void swig_acquire_ownership_obj(void *vptr, int own); + } + + virtual bool load_binary (std::istream& is, bool swap, +- oct_mach_info::float_format fmt) { ++#if SWIG_OCTAVE_PREREQ(6,0,0) ++ octave::mach_info::float_format fmt) { ++#else ++ oct_mach_info::float_format fmt) { ++#endif + return true; + } + +@@ -1142,7 +1175,11 @@ SWIGRUNTIME void swig_acquire_ownership_obj(void *vptr, int own); + { return ptr->save_binary(os, save_as_floats); } + + virtual bool load_binary (std::istream& is, bool swap, +- oct_mach_info::float_format fmt) ++#if SWIG_OCTAVE_PREREQ(6,0,0) ++ octave::mach_info::float_format fmt) ++#else ++ oct_mach_info::float_format fmt) ++#endif + { return ptr->load_binary(is, swap, fmt); } + + #if defined (HAVE_HDF5) +@@ -1261,7 +1298,11 @@ SWIGRUNTIME void swig_acquire_ownership_obj(void *vptr, int own); + } + + virtual bool load_binary (std::istream& is, bool swap, +- oct_mach_info::float_format fmt) { ++#if SWIG_OCTAVE_PREREQ(6,0,0) ++ octave::mach_info::float_format fmt) { ++#else ++ oct_mach_info::float_format fmt) { ++#endif + return true; + } + +@@ -1515,16 +1556,24 @@ SWIGRUNTIMEINLINE void SWIG_Octave_SetConstant(octave_swig_type *module_ns, cons + } + + SWIGRUNTIMEINLINE octave_value SWIG_Octave_GetGlobalValue(std::string name) { ++#if SWIG_OCTAVE_PREREQ(6,0,0) ++ octave::interpreter *interp = octave::interpreter::the_interpreter (); ++ return interp->global_varval(name); ++#else + #if SWIG_OCTAVE_PREREQ(4,4,0) + octave::symbol_table& symtab = octave::interpreter::the_interpreter()->get_symbol_table(); + return symtab.global_varval(name); + #else + return get_global_value(name, true); + #endif ++#endif + } + + SWIGRUNTIME void SWIG_Octave_SetGlobalValue(std::string name, const octave_value& value) { +-#if SWIG_OCTAVE_PREREQ(4,4,0) ++#if SWIG_OCTAVE_PREREQ(6,0,0) ++ octave::interpreter *interp = octave::interpreter::the_interpreter (); ++ interp->global_assign(name, value); ++#elif SWIG_OCTAVE_PREREQ(4,4,0) + octave::symbol_table& symtab = octave::interpreter::the_interpreter()->get_symbol_table(); + symtab.global_assign(name, value); + #else +@@ -1534,10 +1583,20 @@ SWIGRUNTIME void SWIG_Octave_SetGlobalValue(std::string name, const octave_value + + SWIGRUNTIME void SWIG_Octave_LinkGlobalValue(std::string name) { + #if SWIG_OCTAVE_PREREQ(4,4,0) +- octave::symbol_table& symtab = octave::interpreter::the_interpreter()->get_symbol_table(); + octave::symbol_scope symscope = octave::interpreter::the_interpreter()->get_current_scope(); ++#if SWIG_OCTAVE_PREREQ(6,0,0) ++ octave::interpreter *interp = octave::interpreter::the_interpreter (); ++ interp->assign(name, interp->global_varval(name)); ++ octave::tree_evaluator& tree_eval = interp->get_evaluator(); ++ octave::call_stack& callStack = tree_eval.get_call_stack(); ++ std::shared_ptr stackFrame = callStack.get_current_stack_frame(); ++ octave::symbol_record sym=symscope.lookup_symbol(name); ++ stackFrame->mark_global(sym); ++#else ++ octave::symbol_table& symtab = octave::interpreter::the_interpreter()->get_symbol_table(); + symscope.assign(name, symtab.global_varval(name)); + symscope.mark_global(name); ++#endif + #else + #if !SWIG_OCTAVE_PREREQ(3,2,0) + link_to_global_variable(curr_sym_tab->lookup(name, true)); +diff --git a/Lib/octave/octruntime.swg b/Lib/octave/octruntime.swg +index ca69e44c48f..e76151f146b 100644 +--- a/Lib/octave/octruntime.swg ++++ b/Lib/octave/octruntime.swg +@@ -19,7 +19,8 @@ static bool SWIG_init_user(octave_swig_type* module_ns); + SWIGINTERN bool SWIG_Octave_LoadModule(std::string name) { + bool retn = false; + { +-#if SWIG_OCTAVE_PREREQ(4,2,0) ++#if SWIG_OCTAVE_PREREQ(6,0,0) ++#elif SWIG_OCTAVE_PREREQ(4,2,0) + octave::unwind_protect frame; + frame.protect_var(discard_error_messages); discard_error_messages = true; + frame.protect_var(discard_warning_messages); discard_warning_messages = true; +@@ -62,7 +63,8 @@ SWIGINTERN bool SWIG_Octave_LoadModule(std::string name) { + SWIGINTERN bool SWIG_Octave_InstallFunction(octave_function *octloadfcn, std::string name) { + bool retn = false; + { +-#if SWIG_OCTAVE_PREREQ(4,2,0) ++#if SWIG_OCTAVE_PREREQ(6,0,0) ++#elif SWIG_OCTAVE_PREREQ(4,2,0) + octave::unwind_protect frame; + frame.protect_var(discard_error_messages); discard_error_messages = true; + frame.protect_var(discard_warning_messages); discard_warning_messages = true; +@@ -316,7 +318,11 @@ DEFUN_DLD( SWIG_name, args, nargout, SWIG_name_usage ) { + SWIG_InitializeModule(0); + SWIG_PropagateClientData(); + +-#if SWIG_OCTAVE_PREREQ(4,4,0) ++#if SWIG_OCTAVE_PREREQ(6,0,0) ++ octave::tree_evaluator& tree_eval = octave::interpreter::the_interpreter()->get_evaluator(); ++ octave::call_stack& stack = tree_eval.get_call_stack(); ++ octave_function *me = stack.current_function(); ++#elif SWIG_OCTAVE_PREREQ(4,4,0) + octave::call_stack& stack = octave::interpreter::the_interpreter()->get_call_stack(); + octave_function *me = stack.current(); + #else + +From 0bf0d58c52e477cae99986b7c7a656c09d50aa43 Mon Sep 17 00:00:00 2001 +From: Robert Fries +Date: Wed, 12 May 2021 20:22:30 -0400 +Subject: [PATCH 4/5] Additional changes due to name changes in octave-6 * + is_map to isstruct, is_object to isobject + +--- + Lib/octave/octrun.swg | 18 ++++++++++++++++++ + 1 file changed, 18 insertions(+) + +diff --git a/Lib/octave/octrun.swg b/Lib/octave/octrun.swg +index 68bdeea0993..e95f9e9de6b 100644 +--- a/Lib/octave/octrun.swg ++++ b/Lib/octave/octrun.swg +@@ -660,7 +660,11 @@ SWIGRUNTIME void swig_acquire_ownership_obj(void *vptr, int own); + return true; + } + ++#if SWIG_OCTAVE_PREREQ(6,0,0) ++ virtual bool isstruct() const { ++#else + virtual bool is_map() const { ++#endif + return true; + } + +@@ -808,7 +812,11 @@ SWIGRUNTIME void swig_acquire_ownership_obj(void *vptr, int own); + return as_value(); + } + ++#if SWIG_OCTAVE_PREREQ(6,0,0) ++ virtual bool isobject() const { ++#else + virtual bool is_object() const { ++#endif + return true; + } + +@@ -1117,8 +1125,13 @@ SWIGRUNTIME void swig_acquire_ownership_obj(void *vptr, int own); + bool is_defined() const + { return ptr->is_defined(); } + ++#if SWIG_OCTAVE_PREREQ(6,0,0) ++ virtual bool isstruct() const ++ { return ptr->isstruct(); } ++#else + virtual bool is_map() const + { return ptr->is_map(); } ++#endif + + virtual octave_value subsref(const std::string &ops, const std::list < octave_value_list > &idx) + { return ptr->subsref(ops, idx); } +@@ -1129,8 +1142,13 @@ SWIGRUNTIME void swig_acquire_ownership_obj(void *vptr, int own); + octave_value subsasgn(const std::string &ops, const std::list < octave_value_list > &idx, const octave_value &rhs) + { return ptr->subsasgn(ops, idx, rhs); } + ++#if SWIG_OCTAVE_PREREQ(6,0,0) ++ virtual bool isobject() const ++ { return ptr->isobject(); } ++#else + virtual bool is_object() const + { return ptr->is_object(); } ++#endif + + virtual bool is_string() const + { return ptr->is_string(); } + diff --git a/swig-python-Python-3.14-support.patch b/swig-python-Python-3.14-support.patch deleted file mode 100644 index ceee305..0000000 --- a/swig-python-Python-3.14-support.patch +++ /dev/null @@ -1,153 +0,0 @@ -From 50e1cc8bc0d090164762ec166439f8b0f3855308 Mon Sep 17 00:00:00 2001 -From: Julien Schueller -Date: Thu, 10 Apr 2025 17:22:15 +0200 -Subject: [PATCH 1/3] Python: Handle __package__ removal - -Closes #2967 ---- - Doc/Manual/Python.html | 6 +++--- - Source/Modules/python.cxx | 8 +++++--- - 2 files changed, 8 insertions(+), 6 deletions(-) - -diff --git a/Doc/Manual/Python.html b/Doc/Manual/Python.html -index 23587e5dbcc..01fc449a68a 100644 ---- a/Doc/Manual/Python.html -+++ b/Doc/Manual/Python.html -@@ -6552,7 +6552,7 @@

33.11.6.1 Both modules - -

- In this configuration, the pure Python module, foo.py, tries to load the C/C++ module, _foo, from the same package foo.py is --located in. The package name is determined from the __package__ -+located in. The package name is determined from the __spec__.parent (or __package__ before Python 3.4) - attribute if available, see PEP 366. Otherwise it is derived from the __name__ - attribute given to foo.py by the Python loader that imported foo.py. - The interface file for this configuration would contain: -@@ -6675,7 +6675,7 @@

33.11.6.4 More on customizing the modu - -
-
--if __package__ or '.' in __name__:
-+if getattr(__spec__, "parent", None) or '.' in __name__:
-     from . import _foo
- else:
-     import _foo
-@@ -6760,7 +6760,7 @@ 

33.11.6.4 More on customizing the modu - -
-
--if __package__ or '.' in __name__:
-+if getattr(__spec__, "parent", None) or '.' in __name__:
-     from ._foo import *
- else:
-     from _foo import *
-diff --git a/Source/Modules/python.cxx b/Source/Modules/python.cxx
-index 86daf131c8b..a71fc3cdb25 100644
---- a/Source/Modules/python.cxx
-+++ b/Source/Modules/python.cxx
-@@ -703,20 +703,22 @@ class PYTHON:public Language {
- 	 * onwards (implicit relative imports raised a DeprecationWarning in 2.6,
- 	 * and fail in 2.7 onwards).
- 	 *
--	 * First check for __package__ which is available from 2.6 onwards, see PEP366.
-+	 * First check for __spec__.parent which is available from 3.4 onwards,
-+	 * see https://docs.python.org/3/reference/import.html#spec. If not,
-+	 * check for __package__, which was set before 3.14.
- 	 * Next try determine the shadow wrapper's package based on the __name__ it
- 	 * was given by the importer that loaded it.
- 	 * If the module is in a package, load the low-level C/C++ module from the
- 	 * same package, otherwise load it as a global module.
- 	 */
-         Printv(default_import_code, "# Import the low-level C/C++ module\n", NULL);
--        Printv(default_import_code, "if __package__ or \".\" in __name__:\n", NULL);
-+        Printv(default_import_code, "if getattr(globals().get(\"__spec__\"), \"parent\", None) or globals().get(\"__package__\") or \".\" in __name__:\n", NULL);
-         Printv(default_import_code, tab4, "from . import ", module, "\n", NULL);
-         Printv(default_import_code, "else:\n", NULL);
-         Printv(default_import_code, tab4, "import ", module, "\n", NULL);
-       } else {
-         Printv(default_import_code, "# Pull in all the attributes from the low-level C/C++ module\n", NULL);
--        Printv(default_import_code, "if __package__ or \".\" in __name__:\n", NULL);
-+        Printv(default_import_code, "if getattr(globals().get(\"__spec__\"), \"parent\", None) or globals().get(\"__package__\") or \".\" in __name__:\n", NULL);
-         Printv(default_import_code, tab4, "from .", module, " import *\n", NULL);
-         Printv(default_import_code, "else:\n", NULL);
-         Printv(default_import_code, tab4, "from ", module, " import *\n", NULL);
-
-From 3bfdf13c602f877860a9949ba751a5b5a9ba70aa Mon Sep 17 00:00:00 2001
-From: Julien Schueller 
-Date: Thu, 10 Apr 2025 18:35:25 +0200
-Subject: [PATCH 2/3] Python: Add ht_token
-
----
- Source/Modules/python.cxx | 5 +++++
- 1 file changed, 5 insertions(+)
-
-diff --git a/Source/Modules/python.cxx b/Source/Modules/python.cxx
-index a71fc3cdb25..3070a94face 100644
---- a/Source/Modules/python.cxx
-+++ b/Source/Modules/python.cxx
-@@ -4374,6 +4374,11 @@ class PYTHON:public Language {
-     Printv(f, "#if PY_VERSION_HEX >= 0x030b0000\n", NIL);
-     printSlot(f, getSlot(n, "feature:python:_ht_tpname"), "_ht_tpname", "char *");
- 
-+    // void *ht_token;
-+    Printv(f, "#if PY_VERSION_HEX >= 0x030e0000\n", NIL);
-+    printSlot(f, getSlot(n, "feature:python:ht_token"), "ht_token", "void *");
-+    Printv(f, "#endif\n", NIL);
-+
-     // struct _specialization_cache _spec_cache;
-     Printf(f, "  {\n");
-     printSlot(f, getSlot(n, "feature:python:getitem"), "getitem", "PyObject *");
-
-From 55237efa7219f65a04e0ffc69a81c574b5f5e162 Mon Sep 17 00:00:00 2001
-From: Julien Schueller 
-Date: Thu, 10 Apr 2025 17:47:59 +0200
-Subject: [PATCH 3/3] Python: Amend annotations test
-
----
- .../python_annotations_variable_c_runme.py    | 24 +++++++++++++------
- 1 file changed, 17 insertions(+), 7 deletions(-)
-
-diff --git a/Examples/test-suite/python/python_annotations_variable_c_runme.py b/Examples/test-suite/python/python_annotations_variable_c_runme.py
-index 153852d05e6..d1f359bbbd0 100644
---- a/Examples/test-suite/python/python_annotations_variable_c_runme.py
-+++ b/Examples/test-suite/python/python_annotations_variable_c_runme.py
-@@ -1,4 +1,17 @@
- import sys
-+import inspect
-+
-+
-+def get_annotations(cls):
-+    # Python >=3.14 removed the __annotations__ attribute
-+    # retrieve it via inspect (see also annotationlib)
-+    if hasattr(inspect, "get_annotations"):
-+        # Python >=3.10
-+        return inspect.get_annotations(cls)
-+    else:
-+        # Python <3.10
-+        return getattr(cls, "__annotations__", {})
-+
- 
- # Variable annotations for properties is only supported in python-3.6 and later (PEP 526)
- if sys.version_info[0:2] >= (3, 6):
-@@ -8,17 +21,14 @@
-     annotations_supported = not(is_python_builtin() or is_python_fastproxy())
- 
-     if annotations_supported:
--        ts = TemplateShort()
--        anno = ts.__annotations__
-+        anno = get_annotations(TemplateShort)
-         if anno != {'member_variable': 'int'}:
-             raise RuntimeError("annotations mismatch: {}".format(anno))
- 
--        ts = StructWithVar()
--        anno = ts.__annotations__
-+        anno = get_annotations(StructWithVar)
-         if anno != {'member_variable': 'int'}:
-             raise RuntimeError("annotations mismatch: {}".format(anno))
- 
--        ts = StructWithVarNotAnnotated()
--        if getattr(ts, "__annotations__", None) != None:
--            anno = ts.__annotations__
-+        anno = get_annotations(StructWithVarNotAnnotated)
-+        if anno != {}:
-             raise RuntimeError("annotations mismatch: {}".format(anno))
-
diff --git a/swig.spec b/swig.spec
index 0b7b0f9..d55a1eb 100644
--- a/swig.spec
+++ b/swig.spec
@@ -3,7 +3,6 @@
 
 %if %{without testsuite}
 %global tcl 0
-%global guile 0
 %global lualang 0
 %global perllang 0
 %global phplang 0
@@ -13,65 +12,51 @@
 %global octave 0
 %global Rlang 0
 %global javalang 0
-%global ocamllang 0
 %endif
 
 %{!?tcl:%global tcl 1}
+%{!?guile:%global guile 0}
 %{!?lualang:%global lualang 1}
 %{!?perllang:%global perllang 1}
-%{!?rubylang:%global rubylang 1}
-%{!?python3lang:%global python3lang 1}
-
-# PHP drop support for 32-bit builds since Fedora 41.
-%if 0%{?fedora} >= 41 || 0%{?rhel} >= 11
-%ifarch %{ix86}
-%global phplang 0
-%endif
-%endif
 %{!?phplang:%global phplang 1}
-
-# OCaml packages not built on i686 since OCaml 5 / Fedora 39.
-%ifarch %{ix86}
-%{!?ocamllang:%global ocamllang 0}
+# Disable Ruby test failed with swig 4.0.0 on s390
+%ifarch s390x %{power64}
+%{!?rubylang:%global rubylang 0}
 %else
-%{!?ocamllang:%global ocamllang 1}
+%{!?rubylang:%global rubylang 1}
 %endif
+%{!?python3lang:%global python3lang 1}
 
 %if 0%{?rhel}
 %{!?golang:%global golang 0}
-%{!?guile:%global guile 0}
 %{!?octave:%global octave 0}
 %{!?Rlang:%global Rlang 0}
 %bcond_with build_ccache_swig
 %else
-%{!?guile:%global guile 1}
 %{!?octave:%global octave 1}
-# R-core requires tcl < 9.0.0
-%{!?Rlang:%global Rlang 0}
+%{!?Rlang:%global Rlang 1}
 %bcond_without build_ccache_swig
 %endif
-
-%ifarch %{ix86}
+%ifarch aarch64 %{arm} %{mips} ppc %{power64} s390 s390x
 %{!?javalang:%global javalang 0}
 %else
-# Temporary disable java tests, because they doesn't pass with java-21-openjdk
-# https://github.com/swig/swig/issues/2767
 %{!?javalang:%global javalang 1}
 %endif
 
-# Do not run Go tests, they failed with 4.0.0 on ppc64le, s390
-%ifarch x86_64 %{arm} aarch64
-%{!?golang:%global golang 1}
+# Do not run Go tests, they failed with 4.0.0 on ppc64le
+%ifarch %{ix86} x86_64 %{arm} aarch64
+# Tests do not work with Go 1.15
+%{!?golang:%global golang 0}
 %else
 %{!?golang:%global golang 0}
 %endif
 
 Summary: Connects C/C++/Objective C to some high-level programming languages
 Name:    swig
-Version: 4.4.1
-Release: 1%{?dist}
-License: GPL-3.0-or-later AND BSD-3-Clause
-URL:     https://www.swig.org/
+Version: 4.0.2
+Release: 10%{?dist}
+License: GPLv3+ and BSD
+URL:     http://swig.sourceforge.net/
 Source0: http://downloads.sourceforge.net/project/swig/swig/swig-%{version}/swig-%{version}.tar.gz
 # Define the part of man page sections
 Source1: description.h2m
@@ -81,15 +66,24 @@ Source3: ccache-swig.sh
 Source4: ccache-swig.csh
 %endif
 
-BuildRequires: coreutils
-BuildRequires: findutils
+# https://github.com/swig/swig/pull/1702
+Patch0: swig-Upgrade-to-support-newer-NodeJS.patch
+# Backport PHP 7.x and 8 updates
+Patch1: swig-4.0.2-Fix-overloaded-directed-methods-with-non-void-re.patch
+Patch2: swig-4.0.2-Fix-char-typecheck-typemap-to-accept-Null.patch
+Patch3: swig-4.0.2-Improve-PHP-object-creation.patch
+Patch4: swig-4.0.2-Support-PHP8.patch
+# octave 6 support - rebased version of https://github.com/swig/swig/pull/2020
+Patch5: swig-octave-6.patch
+# Fix overload_simple_cast test with Python 3.10 GH#2044
+Patch6: swig-4.0.2-Fix-overload_simple_cast-test-with-Python-3.10.patch
+
 BuildRequires: make
-BuildRequires: perl-interpreter, pcre2-devel
+BuildRequires: perl-interpreter, pcre-devel
 BuildRequires: python%{python3_pkgversion}-devel
 BuildRequires: autoconf, automake, gawk, dos2unix
 BuildRequires: gcc-c++
 BuildRequires: help2man
-BuildRequires: sed
 BuildRequires: perl-devel
 BuildRequires: perl(base)
 BuildRequires: perl(Config)
@@ -105,7 +99,7 @@ BuildRequires: boost-devel
 # Need when Source/CParse/parser.y is patched
 BuildRequires: bison
 %if %{tcl}
-BuildRequires: tcl-devel >= 9.0.0
+BuildRequires: tcl-devel
 %endif
 %if %{guile}
 BuildRequires: guile-devel
@@ -116,9 +110,7 @@ BuildRequires: octave-devel
 %if %{golang}
 BuildRequires: golang
 BuildRequires: golang-bin
-%ifnarch s390x
 BuildRequires: golang-shared
-%endif
 BuildRequires: golang-src
 %endif
 %if %{lualang}
@@ -136,10 +128,6 @@ BuildRequires: java, java-devel
 %if %{phplang}
 BuildRequires: php, php-devel
 %endif
-%if %{ocamllang}
-BuildRequires: ocaml
-BuildRequires: ocaml-findlib
-%endif
 
 %description
 Simplified Wrapper and Interface Generator (SWIG) is a software
@@ -157,7 +145,7 @@ testing and prototyping C/C++ software.
 %if %{with build_ccache_swig}
 %package -n ccache-swig
 Summary:   Fast compiler cache
-License:   GPL-2.0-or-later
+License:   GPLv2+
 Requires:  swig
 Conflicts: swig < 3.0.8-2
 
@@ -169,7 +157,7 @@ being done again. ccache-swig is ccache plus support for SWIG.
 
 %package doc
 Summary:   Documentation files for SWIG
-License:   BSD-3-Clause
+License:   BSD
 BuildArch: noarch
 
 %description doc
@@ -177,7 +165,7 @@ This package contains documentation for SWIG and useful examples
 
 %package gdb
 Summary:   Commands for easier debugging of SWIG
-License:   BSD-3-Clause
+License:   BSD
 Requires:  swig
 
 %description gdb
@@ -199,14 +187,13 @@ done
 # Disable maximum compile warnings when octave is supported, because Octave
 # code produces lots of the warnings demanded by strict ISO C and ISO C++.
 # It causes that log had more then 600M.
+# AC_CHECK_PROGS requires just the name, so use for configure
+#   --with-python3=python3 --with-2to3=2to3
 %configure \
-%if %{ocamllang}
-  --with-ocaml \
-%else
   --without-ocaml \
-%endif
 %if %{python3lang}
   --with-python3=python3 \
+  --with-2to3=2to3 \
 %else
   --without-python3 \
 %endif
@@ -230,9 +217,6 @@ done
 %if ! %{golang}
   --without-go \
 %endif
-%if ! %{guile}
-  --without-guile \
-%endif
 %if %{octave}
   --with-octave=%{_bindir}/octave \
   --without-maximum-compile-warnings \
@@ -363,152 +347,6 @@ install -pm 644 Tools/swig.gdb %{buildroot}%{_datadir}/%{name}/gdb
 %{_datadir}/%{name}/gdb
 
 %changelog
-* Mon Dec 08 2025 Jitka Plesnikova  - 4.4.1-1
-- 4.4.1 bump (rhbz#2419819, rhbz#2415440)
-
-* Tue Oct 21 2025 Jitka Plesnikova  - 4.4.0-1
-- 4.4.0 bump (rhbz#2405182)
-
-* Mon Oct 13 2025 Richard W.M. Jones  - 4.3.1-6
-- OCaml 5.4.0 rebuild
-
-* Thu Aug 07 2025 Orion Poplawski  - 4.3.1-5
-- Rebuild for Octave 10.2
-
-* Thu Jul 31 2025 Jitka Plesnikova  - 4.3.1-4
-- Fix Python DeprecationWarning
-
-* Fri Jul 25 2025 Fedora Release Engineering  - 4.3.1-3
-- Rebuilt for https://fedoraproject.org/wiki/Fedora_43_Mass_Rebuild
-
-* Wed Jun 25 2025 Yaakov Selkowitz  - 4.3.1-2
-- Add Python 3.14 support
-
-* Wed Apr 16 2025 Jitka Plesnikova  - 4.3.1-1
-- 4.3.1 bump (rhbz#2360009)
-
-* Mon Feb 17 2025 Jitka Plesnikova  - 4.3.0-5
-- Disable R tests, because they need tcl < 9
-
-* Sun Jan 19 2025 Fedora Release Engineering  - 4.3.0-4
-- Rebuilt for https://fedoraproject.org/wiki/Fedora_42_Mass_Rebuild
-
-* Thu Nov 14 2024 Orion Poplawski  - 4.3.0-3
-- Rebuild for octave 9.2
-
-* Tue Oct 29 2024 Jitka Plesnikova  - 4.3.0-2
-- Fix precedence of casts
-
-* Mon Oct 21 2024 Jitka Plesnikova  - 4.3.0-1
-- 4.3.0 bump (rhbz#2320047)
-
-* Sat Jul 20 2024 Fedora Release Engineering  - 4.2.1-8
-- Rebuilt for https://fedoraproject.org/wiki/Fedora_41_Mass_Rebuild
-
-* Sun Jun 23 2024 Yaakov Selkowitz  - 4.2.1-7
-- Rebuild for Python 3.13
-
-* Wed Jun 19 2024 Richard W.M. Jones  - 4.2.1-6
-- OCaml 5.2.0 ppc64le fix
-
-* Wed May 29 2024 Richard W.M. Jones  - 4.2.1-5
-- OCaml 5.2.0 for Fedora 41
-
-* Mon Apr 29 2024 Jitka Plesnikova  - 4.2.1-4
-- Fix gcc's -Wformat-security warning in R Raise function (rhbz#2277767)
-
-* Fri Apr 12 2024 Remi Collet  - 4.2.1-3
-- disable PHP support on 32-bit
-  https://fedoraproject.org/wiki/Changes/php_no_32_bit
-
-* Tue Feb 27 2024 Jiri Vanek  - 4.2.1-2
-- Rebuilt for java-21-openjdk as system jdk
-- Temporary disable java tests (rhbz#2266693)
-
-* Mon Feb 26 2024 Jitka Plesnikova  - 4.2.1-1
-- 4.2.1 bump (rhbz#2265786)
-
-* Tue Jan 23 2024 Jitka Plesnikova  - 4.2.0-1
-- 4.2.0 bump
-
-* Mon Dec 18 2023 Richard W.M. Jones  - 4.1.1-15
-- OCaml 5.1.1 + s390x code gen fix for Fedora 40
-
-* Tue Dec 12 2023 Richard W.M. Jones  - 4.1.1-14
-- OCaml 5.1.1 rebuild for Fedora 40
-
-* Thu Dec 07 2023 Jitka Plesnikova  - 4.1.1-13
-- Fix PHP director_classes testcase failures on x86
-
-* Fri Oct 20 2023 Jitka Plesnikova  - 4.1.1-12
-- Stop using Python's 2to3
-
-* Wed Oct 11 2023 Jitka Plesnikova  - 4.1.1-11
-- Fix PHP test, it fails with PHP 8.3
-
-* Thu Oct 05 2023 Richard W.M. Jones  - 4.1.1-10
-- OCaml 5.1 rebuild for Fedora 40
-
-* Sat Jul 22 2023 Fedora Release Engineering  - 4.1.1-9
-- Rebuilt for https://fedoraproject.org/wiki/Fedora_39_Mass_Rebuild
-
-* Wed Jul 12 2023 Jerry James  - 4.1.1-8
-- Add patch for python 3.12
-
-* Tue Jul 11 2023 Richard W.M. Jones  - 4.1.1-8
-- OCaml 5.0 rebuild for Fedora 39
-
-* Tue Jun 20 2023 Jerry James  - 4.1.1-7
-- Enable OCaml support
-- Add patch for OCaml 5.0.0
-
-* Sat Apr 08 2023 Orion Poplawski  - 4.1.1-6
-- Rebuild with octave 8.1.0
-
-* Thu Mar 16 2023 Orion Poplawski  - 4.1.1-5
-- Add patch to support octave 8.1
-
-* Thu Feb 02 2023 Jitka Plesnikova  - 4.1.1-4
-- Disable PHP test on i686
-
-* Sat Jan 21 2023 Fedora Release Engineering  - 4.1.1-3
-- Rebuilt for https://fedoraproject.org/wiki/Fedora_38_Mass_Rebuild
-
-* Thu Jan 12 2023 Florian Weimer  - 4.1.1-2
-- Port configure script to C99
-
-* Thu Dec 01 2022 Jitka Plesnikova  - 4.1.1-1
-- Update to 4.1.1
-
-* Tue Oct 25 2022 Jitka Plesnikova  - 4.1.0-1
-- Update to 4.1.0
-
-* Thu Jul 21 2022 Maxwell G  - 4.0.2-18
-- Exclude golang extension from i686
-
-* Tue Jul 19 2022 Maxwell G  - 4.0.2-17
-- Rebuild for CVE-2022-{1705,32148,30631,30633,28131,30635,30632,30630,1962} in
-  golang
-
-* Sat Jun 18 2022 Robert-André Mauchin  - 4.0.2-16
-- Rebuilt for CVE-2022-1996, CVE-2022-24675, CVE-2022-28327, CVE-2022-27191,
-  CVE-2022-29526, CVE-2022-30629
-
-* Wed Jun 01 2022 Orion Poplawski  - 4.0.2-15
-- Rebuild for octave 7.1
-
-* Thu Feb 24 2022 Jitka Plesnikova  - 4.0.2-14
-- Disable Java tests
-
-* Sat Jan 22 2022 Jitka Plesnikova  - 4.0.2-13
-- Fix tests against GCC12, enable Guile tests
-
-* Sat Jan 22 2022 Fedora Release Engineering  - 4.0.2-12
-- Rebuilt for https://fedoraproject.org/wiki/Fedora_36_Mass_Rebuild
-
-* Wed Nov 24 2021 Jitka Plesnikova  - 4.0.2-11
-- Disable PHP test, it fails with PHP 8.1
-
 * Thu Oct 07 2021 Jitka Plesnikova  - 4.0.2-10
 - Enable Python tests