From 8dd96e975df3249e97848897b7bfec800e22006a Mon Sep 17 00:00:00 2001 From: Adam Samalik Date: Thu, 29 Jun 2023 10:26:48 +0200 Subject: [PATCH] re-import sources as agreed with the maintainer --- .gitignore | 27 +- ...har-typecheck-typemap-to-accept-Null.patch | 82 ---- ...ed-directed-methods-with-non-void-re.patch | 101 ----- swig-4.0.2-Improve-PHP-object-creation.patch | 82 ---- swig-4.0.2-Support-PHP8.patch | 409 ------------------ 5 files changed, 26 insertions(+), 675 deletions(-) delete mode 100644 swig-4.0.2-Fix-char-typecheck-typemap-to-accept-Null.patch delete mode 100644 swig-4.0.2-Fix-overloaded-directed-methods-with-non-void-re.patch delete mode 100644 swig-4.0.2-Improve-PHP-object-creation.patch delete mode 100644 swig-4.0.2-Support-PHP8.patch diff --git a/.gitignore b/.gitignore index f776bba..2286b59 100644 --- a/.gitignore +++ b/.gitignore @@ -1,2 +1,27 @@ -SOURCES/swig-4.0.2.tar.gz +swig-2.0.0.tar.gz +/swig-2.0.1.tar.gz +/swig-2.0.2.tar.gz +/swig-2.0.3.tar.gz +/swig-2.0.4.tar.gz +/swig-2.0.5.tar.gz +/swig-2.0.6.tar.gz +/swig-2.0.7.tar.gz +/swig-2.0.8.tar.gz +/swig-2.0.9.tar.gz +/swig-2.0.10.tar.gz +/swig-2.0.11.tar.gz +/swig-2.0.12.tar.gz +/swig-3.0.0.tar.gz +/swig-3.0.1.tar.gz +/swig-3.0.2.tar.gz +/swig-3.0.5.tar.gz +/swig-3.0.6.tar.gz +/swig-3.0.7.tar.gz +/swig-3.0.8.tar.gz +/swig-3.0.9.tar.gz +/swig-3.0.10.tar.gz +/swig-3.0.11.tar.gz +/swig-3.0.12.tar.gz +/swig-4.0.0.tar.gz +/swig-4.0.1.tar.gz /swig-4.0.2.tar.gz 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 deleted file mode 100644 index b293d2f..0000000 --- a/swig-4.0.2-Fix-char-typecheck-typemap-to-accept-Null.patch +++ /dev/null @@ -1,82 +0,0 @@ -From b7dedecfdd708c5323addc1b28e16cc727e01980 Mon Sep 17 00:00:00 2001 -From: Olly Betts -Date: Thu, 18 Mar 2021 10:53:58 +1300 -Subject: [PATCH] php: Fix char* typecheck typemap to accept Null - -The corresponding in typemap already does. - -Fixes #1655, reported by CJSlominski. ---- - CHANGES.current | 4 ++++ - Examples/test-suite/overload_polymorphic.i | 3 +++ - .../test-suite/php/overload_polymorphic_runme.php | 14 ++++++++++++++ - Lib/php/php.swg | 5 ++++- - 4 files changed, 25 insertions(+), 1 deletion(-) - create mode 100644 Examples/test-suite/php/overload_polymorphic_runme.php - -#diff --git a/CHANGES.current b/CHANGES.current -#index 58fd05a56..f287e3d60 100644 -#--- a/CHANGES.current -#+++ b/CHANGES.current -#@@ -7,6 +7,10 @@ the issue number to the end of the URL: https://github.com/swig/swig/issues/ -# Version 4.1.0 (in progress) -# =========================== -# -#+2021-03-18: olly -#+ #1655 [PHP] Fix char* typecheck typemap to accept PHP Null like the -#+ corresponding in typemap does. -#+ -# 2021-03-18: olly -# #1900, #1905 [PHP] Fix wrapping of overloaded directed methods with -# non-void return. -diff --git a/Examples/test-suite/overload_polymorphic.i b/Examples/test-suite/overload_polymorphic.i -index ac004f948..72aabd840 100644 ---- a/Examples/test-suite/overload_polymorphic.i -+++ b/Examples/test-suite/overload_polymorphic.i -@@ -23,4 +23,7 @@ class Unknown; - int test2(Unknown* unknown) { return 0; } - int test2(Base* base) { return 1; } - -+int test3(const char*, const Base* = 0, bool = false) { return 0; } -+int test3(Base&, const char* = 0, const Base* = 0, bool = false) { return 1; } -+ - %} -diff --git a/Examples/test-suite/php/overload_polymorphic_runme.php b/Examples/test-suite/php/overload_polymorphic_runme.php -new file mode 100644 -index 000000000..0afe16808 ---- /dev/null -+++ b/Examples/test-suite/php/overload_polymorphic_runme.php -@@ -0,0 +1,14 @@ -+ -diff --git a/Lib/php/php.swg b/Lib/php/php.swg -index 4eba6be2a..ccfd371ab 100644 ---- a/Lib/php/php.swg -+++ b/Lib/php/php.swg -@@ -465,7 +465,10 @@ - %php_typecheck(double,SWIG_TYPECHECK_DOUBLE,IS_DOUBLE) - %php_typecheck(char,SWIG_TYPECHECK_CHAR,IS_STRING) - --%typemap(typecheck,precedence=SWIG_TYPECHECK_STRING) char *, char *&, char [] -+%typemap(typecheck,precedence=SWIG_TYPECHECK_STRING) char *, char *& -+ " $1 = (Z_TYPE($input) == IS_STRING || Z_TYPE($input) == IS_NULL); " -+ -+%typemap(typecheck,precedence=SWIG_TYPECHECK_STRING) char [] - " $1 = (Z_TYPE($input) == IS_STRING); " - - %typecheck(SWIG_TYPECHECK_POINTER) SWIGTYPE --- -2.26.3 - diff --git a/swig-4.0.2-Fix-overloaded-directed-methods-with-non-void-re.patch b/swig-4.0.2-Fix-overloaded-directed-methods-with-non-void-re.patch deleted file mode 100644 index 1cc5e91..0000000 --- a/swig-4.0.2-Fix-overloaded-directed-methods-with-non-void-re.patch +++ /dev/null @@ -1,101 +0,0 @@ -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 deleted file mode 100644 index 2239053..0000000 --- a/swig-4.0.2-Improve-PHP-object-creation.patch +++ /dev/null @@ -1,82 +0,0 @@ -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 deleted file mode 100644 index 56e9831..0000000 --- a/swig-4.0.2-Support-PHP8.patch +++ /dev/null @@ -1,409 +0,0 @@ -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.