diff --git a/.gitignore b/.gitignore
index 8cec1dc..34ba3f1 100644
--- a/.gitignore
+++ b/.gitignore
@@ -31,5 +31,3 @@ swig-2.0.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..581ec8f 100644
--- a/sources
+++ b/sources
@@ -1 +1 @@
-SHA512 (swig-4.4.1.tar.gz) = 103ddb4a5914f28e6739a006d35042c701e55ba05066acff3f3609befb5f43f253ea717fc41d06c93d8fb187ded4399c12c94665b93dc06d0fb835069391c7c7
+SHA512 (swig-4.3.1.tar.gz) = 8958f7bc3345549a9bc4e00aa8d40a99f6c4bb92b95d627c8796cf8f8d1ba0041a89cab542f171778c2b26aa2a877767181ae9bd2c05fd055f373a32a463399c
diff --git a/swig-4.4.0-Python-DeprecationWarning-fixes.patch b/swig-4.4.0-Python-DeprecationWarning-fixes.patch
new file mode 100644
index 0000000..17b9246
--- /dev/null
+++ b/swig-4.4.0-Python-DeprecationWarning-fixes.patch
@@ -0,0 +1,806 @@
+From 49a7d2b0c6aed00bd07a9a28569020d560c2658c Mon Sep 17 00:00:00 2001
+From: William S Fulton
+Date: Sat, 10 May 2025 13:47:35 +0100
+Subject: [PATCH 1/5] Python DeprecationWarning fixes
+
+DeprecationWarning fixes when using 'python -Walways' or if using one of the types being warned about:
+
+ DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute
+ DeprecationWarning: builtin type SwigPyObject has no __module__ attribute
+ DeprecationWarning: builtin type swigvarlink has no __module__ attribute
+
+The warning was present if code was generated without using -builtin in 4.3.x.
+The warning was only present if using the Python limited API in 4.2.1 and earlier.
+
+These 3 types were not in any module at all. Now they are in the swig runtime module.
+Docs to follow.
+
+Issue #2881
+Issue #3061
+Issue #3160
+---
+ CHANGES.current | 11 +++++++++++
+ Lib/python/pyhead.swg | 4 +++-
+ Lib/python/pyrun.swg | 22 +++++++++++-----------
+ 3 files changed, 25 insertions(+), 12 deletions(-)
+
+#diff --git a/CHANGES.current b/CHANGES.current
+#index 99c8a1d8f..0bce7937f 100644
+#--- a/CHANGES.current
+#+++ b/CHANGES.current
+#@@ -7,6 +7,17 @@ the issue number to the end of the URL: https://github.com/swig/swig/issues/
+# Version 4.4.0 (in progress)
+# ===========================
+#
+#+2025-05-10: jschueller, wsfulton
+#+ [Python] #2881 #3061 #3160 DeprecationWarning fixes when using 'python -Walways'
+#+ or if using one of the types being warned about:
+#+
+#+ DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute
+#+ DeprecationWarning: builtin type SwigPyObject has no __module__ attribute
+#+ DeprecationWarning: builtin type swigvarlink has no __module__ attribute
+#+
+#+ The warning was present if code was generated without using -builtin in 4.3.x.
+#+ The warning was only present if using the Python limited API in 4.2.1 and earlier.
+#+
+# 2025-04-30: wsfulton
+# [Python] #3134 Fix maximum size of strings being marshalled from C/C++
+# into Python. This has been changed from INT_MAX to PY_SSIZE_T_MAX in line
+diff --git a/Lib/python/pyhead.swg b/Lib/python/pyhead.swg
+index 50dca5bc0..4f238b9f6 100644
+--- a/Lib/python/pyhead.swg
++++ b/Lib/python/pyhead.swg
+@@ -60,6 +60,8 @@ SWIG_Python_str_FromChar(const char *c)
+ #endif
+ }
+
++#define SWIG_RUNTIME_MODULE "swig_runtime_data" SWIG_RUNTIME_VERSION
++
+ /* SWIGPY_USE_CAPSULE is no longer used within SWIG itself, but some user interface files check for it. */
+ # define SWIGPY_USE_CAPSULE
+ #ifdef SWIGPYTHON_BUILTIN
+@@ -67,7 +69,7 @@ SWIG_Python_str_FromChar(const char *c)
+ #else
+ # define SWIGPY_CAPSULE_ATTR_NAME "type_pointer_capsule" SWIG_TYPE_TABLE_NAME
+ #endif
+-# define SWIGPY_CAPSULE_NAME ("swig_runtime_data" SWIG_RUNTIME_VERSION "." SWIGPY_CAPSULE_ATTR_NAME)
++#define SWIGPY_CAPSULE_NAME SWIG_RUNTIME_MODULE "." SWIGPY_CAPSULE_ATTR_NAME
+
+ #if PY_VERSION_HEX < 0x03020000
+ #define PyDescr_TYPE(x) (((PyDescrObject *)(x))->d_type)
+diff --git a/Lib/python/pyrun.swg b/Lib/python/pyrun.swg
+index 77d7fccfa..b9e3e7241 100644
+--- a/Lib/python/pyrun.swg
++++ b/Lib/python/pyrun.swg
+@@ -353,7 +353,7 @@ swig_varlink_type(void) {
+ PyObject_HEAD_INIT(NULL)
+ 0, /* ob_size */
+ #endif
+- "swigvarlink", /* tp_name */
++ SWIG_RUNTIME_MODULE ".swigvarlink", /* tp_name */
+ sizeof(swig_varlinkobject), /* tp_basicsize */
+ 0, /* tp_itemsize */
+ (destructor) swig_varlink_dealloc, /* tp_dealloc */
+@@ -424,7 +424,7 @@ swig_varlink_type(void) {
+ { 0, NULL }
+ };
+ PyType_Spec spec = {
+- "swigvarlink",
++ SWIG_RUNTIME_MODULE ".swigvarlink",
+ sizeof(swig_varlinkobject),
+ 0,
+ Py_TPFLAGS_DEFAULT,
+@@ -750,7 +750,7 @@ SwigPyObject_Check(PyObject *op) {
+ #ifdef SWIGPYTHON_BUILTIN
+ if (PyType_IsSubtype(op_type, target_tp))
+ return 1;
+- return (strcmp(op_type->tp_name, "SwigPyObject") == 0);
++ return (strcmp(op_type->tp_name, SWIG_RUNTIME_MODULE ".SwigPyObject") == 0);
+ #else
+ # ifdef Py_LIMITED_API
+ int cmp;
+@@ -766,7 +766,7 @@ SwigPyObject_Check(PyObject *op) {
+ SWIG_Py_DECREF(tp_name);
+ return cmp == 0;
+ # else
+- return (strcmp(op_type->tp_name, "SwigPyObject") == 0);
++ return (strcmp(op_type->tp_name, SWIG_RUNTIME_MODULE ".SwigPyObject") == 0);
+ # endif
+ #endif
+ }
+@@ -966,7 +966,7 @@ SwigPyObject_TypeOnce(void) {
+ PyObject_HEAD_INIT(NULL)
+ 0, /* ob_size */
+ #endif
+- "SwigPyObject", /* tp_name */
++ SWIG_RUNTIME_MODULE ".SwigPyObject", /* tp_name */
+ sizeof(SwigPyObject), /* tp_basicsize */
+ 0, /* tp_itemsize */
+ (destructor)SwigPyObject_dealloc, /* tp_dealloc */
+@@ -1061,7 +1061,7 @@ SwigPyObject_TypeOnce(void) {
+ { 0, NULL }
+ };
+ PyType_Spec spec = {
+- "SwigPyObject",
++ SWIG_RUNTIME_MODULE ".SwigPyObject",
+ sizeof(SwigPyObject),
+ 0,
+ Py_TPFLAGS_DEFAULT|Py_TPFLAGS_BASETYPE,
+@@ -1160,7 +1160,7 @@ SwigPyPacked_Check(PyObject *op) {
+ SWIG_Py_DECREF(tp_name);
+ return cmp == 0;
+ #else
+- return (strcmp(op_type->tp_name, "SwigPyPacked") == 0);
++ return (strcmp(op_type->tp_name, SWIG_RUNTIME_MODULE ".SwigPyPacked") == 0);
+ #endif
+ }
+
+@@ -1188,7 +1188,7 @@ SwigPyPacked_TypeOnce(void) {
+ PyObject_HEAD_INIT(NULL)
+ 0, /* ob_size */
+ #endif
+- "SwigPyPacked", /* tp_name */
++ SWIG_RUNTIME_MODULE ".SwigPyPacked", /* tp_name */
+ sizeof(SwigPyPacked), /* tp_basicsize */
+ 0, /* tp_itemsize */
+ (destructor)SwigPyPacked_dealloc, /* tp_dealloc */
+@@ -1281,7 +1281,7 @@ SwigPyPacked_TypeOnce(void) {
+ { 0, NULL }
+ };
+ PyType_Spec spec = {
+- "SwigPyPacked",
++ SWIG_RUNTIME_MODULE ".SwigPyPacked",
+ sizeof(SwigPyPacked),
+ 0,
+ Py_TPFLAGS_DEFAULT,
+@@ -1846,10 +1846,10 @@ SWIGRUNTIME void
+ SWIG_Python_SetModule(swig_module_info *swig_module) {
+ #if PY_VERSION_HEX >= 0x03000000
+ /* Add a dummy module object into sys.modules */
+- PyObject *module = PyImport_AddModule("swig_runtime_data" SWIG_RUNTIME_VERSION);
++ PyObject *module = PyImport_AddModule(SWIG_RUNTIME_MODULE);
+ #else
+ static PyMethodDef swig_empty_runtime_method_table[] = { {NULL, NULL, 0, NULL} }; /* Sentinel */
+- PyObject *module = Py_InitModule("swig_runtime_data" SWIG_RUNTIME_VERSION, swig_empty_runtime_method_table);
++ PyObject *module = Py_InitModule(SWIG_RUNTIME_MODULE, swig_empty_runtime_method_table);
+ #endif
+ PyObject *pointer = PyCapsule_New((void *) swig_module, SWIGPY_CAPSULE_NAME, SWIG_Python_DestroyModule);
+ if (pointer && module) {
+--
+2.50.1
+
+
+From 7ecbb7103dec48bb316baa9ccd71ba7888de7c54 Mon Sep 17 00:00:00 2001
+From: William S Fulton
+Date: Sun, 11 May 2025 16:02:43 +0100
+Subject: [PATCH 2/5] Add SwigPyObject, SwigPyPacked, swigvarlink to the swig
+ runtime module
+
+Also add SWIG_REFCNT_DEBUG for debugging reference counts when the main
+module is destroyed - there's some work to be done here on reference
+counts!
+---
+ Lib/python/pyinit.swg | 1 +
+ Lib/python/pyrun.swg | 91 +++++++++++++++++++++++++++++++++----------
+ 2 files changed, 71 insertions(+), 21 deletions(-)
+
+diff --git a/Lib/python/pyinit.swg b/Lib/python/pyinit.swg
+index 5bf7097f5..4e25323f6 100644
+--- a/Lib/python/pyinit.swg
++++ b/Lib/python/pyinit.swg
+@@ -261,6 +261,7 @@ SWIG_init(void) {
+ (void)globals;
+
+ /* Create singletons now to avoid potential deadlocks with multi-threaded usage after module initialization */
++ SWIG_runtime_data_module();
+ SWIG_This();
+ SWIG_Python_TypeCache();
+ SwigPyPacked_type();
+diff --git a/Lib/python/pyrun.swg b/Lib/python/pyrun.swg
+index b9e3e7241..2ef79f348 100644
+--- a/Lib/python/pyrun.swg
++++ b/Lib/python/pyrun.swg
+@@ -114,8 +114,25 @@ SWIG_Python_SetConstant(PyObject *d, const char *name, PyObject *obj) {
+
+ #endif
+
+-/* Append a value to the result obj */
++/* SWIG runtime data Python module */
++static PyObject *Swig_runtime_data_module_global = NULL;
++
++/* Create/obtain the single swig_runtime_data module which is used across different SWIG generated modules */
++SWIGINTERN PyObject *
++SWIG_runtime_data_module() {
++ if (!Swig_runtime_data_module_global) {
++#if PY_VERSION_HEX >= 0x03000000
++ Swig_runtime_data_module_global = PyImport_AddModule(SWIG_RUNTIME_MODULE);
++#else
++ static PyMethodDef swig_empty_runtime_method_table[] = { {NULL, NULL, 0, NULL} }; /* Sentinel */
++ Swig_runtime_data_module_global = Py_InitModule(SWIG_RUNTIME_MODULE, swig_empty_runtime_method_table);
++#endif
++ SWIG_Py_XINCREF(Swig_runtime_data_module_global);
++ }
++ return Swig_runtime_data_module_global;
++}
+
++/* Append a value to the result obj */
+ SWIGINTERN PyObject*
+ SWIG_Python_AppendOutput(PyObject* result, PyObject* obj, int is_void) {
+ if (!result) {
+@@ -341,7 +358,7 @@ swig_varlink_setattr(PyObject *o, char *n, PyObject *p) {
+
+ SWIGINTERN PyTypeObject*
+ swig_varlink_type(void) {
+- static char varlink__doc__[] = "Swig var link object";
++ static char varlink__doc__[] = "Swig variable link object";
+ #ifndef SWIG_HEAPTYPES
+ static PyTypeObject varlink_type;
+ static int type_init = 0;
+@@ -407,10 +424,13 @@ swig_varlink_type(void) {
+ 0 /* tp_next */
+ #endif
+ };
++ PyObject *runtime_data_module = SWIG_runtime_data_module();
+ varlink_type = tmp;
+ type_init = 1;
+ if (PyType_Ready(&varlink_type) < 0)
+ return NULL;
++ if (PyModule_AddObject(runtime_data_module, "swigvarlink", (PyObject *)&varlink_type) == 0)
++ SWIG_Py_INCREF((PyObject *)&varlink_type);
+ }
+ return &varlink_type;
+ #else
+@@ -430,7 +450,11 @@ swig_varlink_type(void) {
+ Py_TPFLAGS_DEFAULT,
+ slots
+ };
+- return (PyTypeObject *)PyType_FromSpec(&spec);
++ PyObject *pytype = PyType_FromSpec(&spec);
++ PyObject *runtime_data_module = SWIG_runtime_data_module();
++ if (pytype && PyModule_AddObject(runtime_data_module, "swigvarlink", pytype) == 0)
++ SWIG_Py_INCREF(pytype);
++ return (PyTypeObject *)pytype;
+ #endif
+ }
+
+@@ -910,7 +934,7 @@ swigobject_methods[] = {
+
+ SWIGRUNTIME PyTypeObject*
+ SwigPyObject_TypeOnce(void) {
+- static char swigobject_doc[] = "Swig object carries a C/C++ instance pointer";
++ static char swigobject_doc[] = "Swig object holding a C/C++ pointer";
+ #ifndef SWIG_HEAPTYPES
+ static PyNumberMethods SwigPyObject_as_number = {
+ (binaryfunc)0, /*nb_add*/
+@@ -1043,10 +1067,13 @@ SwigPyObject_TypeOnce(void) {
+ 0 /* tp_next */
+ #endif
+ };
++ PyObject *runtime_data_module = SWIG_runtime_data_module();
+ swigpyobject_type = tmp;
+ type_init = 1;
+ if (PyType_Ready(&swigpyobject_type) != 0)
+ return NULL;
++ if (PyModule_AddObject(runtime_data_module, "SwigPyObject", (PyObject *)&swigpyobject_type) == 0)
++ SWIG_Py_INCREF((PyObject *)&swigpyobject_type);
+ }
+ return &swigpyobject_type;
+ #else
+@@ -1067,7 +1094,11 @@ SwigPyObject_TypeOnce(void) {
+ Py_TPFLAGS_DEFAULT|Py_TPFLAGS_BASETYPE,
+ slots
+ };
+- return (PyTypeObject *)PyType_FromSpec(&spec);
++ PyObject *pytype = PyType_FromSpec(&spec);
++ PyObject *runtime_data_module = SWIG_runtime_data_module();
++ if (pytype && PyModule_AddObject(runtime_data_module, "SwigPyObject", pytype) == 0)
++ SWIG_Py_INCREF(pytype);
++ return (PyTypeObject *)pytype;
+ #endif
+ }
+
+@@ -1150,7 +1181,7 @@ SwigPyPacked_Check(PyObject *op) {
+ PyObject *tp_name;
+ #endif
+ PyTypeObject* op_type = Py_TYPE(op);
+- if (op_type == SwigPyPacked_TypeOnce())
++ if (op_type == SwigPyPacked_type())
+ return 1;
+ #ifdef Py_LIMITED_API
+ tp_name = PyObject_GetAttrString((PyObject *)op_type, "__name__");
+@@ -1176,7 +1207,7 @@ SwigPyPacked_dealloc(PyObject *v)
+
+ SWIGRUNTIME PyTypeObject*
+ SwigPyPacked_TypeOnce(void) {
+- static char swigpacked_doc[] = "Swig object carries a C/C++ instance pointer";
++ static char swigpacked_doc[] = "Swig object holding a C/C++ function pointer";
+ #ifndef SWIG_HEAPTYPES
+ static PyTypeObject swigpypacked_type;
+ static int type_init = 0;
+@@ -1265,10 +1296,13 @@ SwigPyPacked_TypeOnce(void) {
+ 0 /* tp_next */
+ #endif
+ };
++ PyObject *runtime_data_module = SWIG_runtime_data_module();
+ swigpypacked_type = tmp;
+ type_init = 1;
+ if (PyType_Ready(&swigpypacked_type) != 0)
+ return NULL;
++ if (PyModule_AddObject(runtime_data_module, "SwigPyPacked", (PyObject *)&swigpypacked_type) == 0)
++ SWIG_Py_INCREF((PyObject *)&swigpypacked_type);
+ }
+ return &swigpypacked_type;
+ #else
+@@ -1287,7 +1321,11 @@ SwigPyPacked_TypeOnce(void) {
+ Py_TPFLAGS_DEFAULT,
+ slots
+ };
+- return (PyTypeObject *)PyType_FromSpec(&spec);
++ PyObject *pytype = PyType_FromSpec(&spec);
++ PyObject *runtime_data_module = SWIG_runtime_data_module();
++ if (pytype && PyModule_AddObject(runtime_data_module, "SwigPyPacked", pytype) == 0)
++ SWIG_Py_INCREF(pytype);
++ return (PyTypeObject *)pytype;
+ #endif
+ }
+
+@@ -1815,6 +1853,12 @@ SWIG_Python_GetModule(void *SWIGUNUSEDPARM(clientdata)) {
+ }
+
+
++#if defined(SWIG_REFCNT_DEBUG)
++#define SWIG_PYOBJ_REFCNT(OBJ) fprintf(stdout, "" #OBJ " count %ld\n", (OBJ ? Py_REFCNT(OBJ) : 0))
++#else
++#define SWIG_PYOBJ_REFCNT(OBJ)
++#endif
++
+ static int interpreter_counter = 0; /* how many (sub-)interpreters are using swig_module's types */
+
+ SWIGRUNTIME void
+@@ -1825,7 +1869,7 @@ SWIG_Python_DestroyModule(PyObject *obj)
+ size_t i;
+ if (--interpreter_counter != 0) /* another sub-interpreter may still be using the swig_module's types */
+ return;
+- for (i =0; i < swig_module->size; ++i) {
++ for (i = 0; i < swig_module->size; ++i) {
+ swig_type_info *ty = types[i];
+ if (ty->owndata) {
+ SwigPyClientData *data = (SwigPyClientData *) ty->clientdata;
+@@ -1833,27 +1877,32 @@ SWIG_Python_DestroyModule(PyObject *obj)
+ if (data) SwigPyClientData_Del(data);
+ }
+ }
+- SWIG_Py_DECREF(SWIG_This());
++ SWIG_Py_XDECREF(Swig_This_global);
++ SWIG_PYOBJ_REFCNT(Swig_This_global);
+ Swig_This_global = NULL;
+- SWIG_Py_DECREF(SWIG_globals());
++
++ SWIG_Py_XDECREF(Swig_Globals_global);
++ SWIG_PYOBJ_REFCNT(Swig_Globals_global);
+ Swig_Globals_global = NULL;
+- SWIG_Py_DECREF(SWIG_Python_TypeCache());
++
++ SWIG_Py_XDECREF(Swig_TypeCache_global);
++ SWIG_PYOBJ_REFCNT(Swig_TypeCache_global);
+ Swig_TypeCache_global = NULL;
++
++ SWIG_PYOBJ_REFCNT(Swig_Capsule_global);
+ Swig_Capsule_global = NULL;
++
++ SWIG_Py_XDECREF(Swig_runtime_data_module_global);
++ SWIG_PYOBJ_REFCNT(Swig_runtime_data_module_global);
++ Swig_runtime_data_module_global = NULL;
+ }
+
+ SWIGRUNTIME void
+ SWIG_Python_SetModule(swig_module_info *swig_module) {
+-#if PY_VERSION_HEX >= 0x03000000
+- /* Add a dummy module object into sys.modules */
+- PyObject *module = PyImport_AddModule(SWIG_RUNTIME_MODULE);
+-#else
+- static PyMethodDef swig_empty_runtime_method_table[] = { {NULL, NULL, 0, NULL} }; /* Sentinel */
+- PyObject *module = Py_InitModule(SWIG_RUNTIME_MODULE, swig_empty_runtime_method_table);
+-#endif
++ PyObject *runtime_data_module = SWIG_runtime_data_module();
+ PyObject *pointer = PyCapsule_New((void *) swig_module, SWIGPY_CAPSULE_NAME, SWIG_Python_DestroyModule);
+- if (pointer && module) {
+- if (PyModule_AddObject(module, SWIGPY_CAPSULE_ATTR_NAME, pointer) == 0) {
++ if (pointer && runtime_data_module) {
++ if (PyModule_AddObject(runtime_data_module, SWIGPY_CAPSULE_ATTR_NAME, pointer) == 0) {
+ ++interpreter_counter;
+ Swig_Capsule_global = pointer;
+ } else {
+--
+2.50.1
+
+
+From 53453d51ec3ca111c5c97530d8ee4c6b5184c85e Mon Sep 17 00:00:00 2001
+From: William S Fulton
+Date: Mon, 12 May 2025 07:25:35 +0100
+Subject: [PATCH 3/5] Rename Python swigvarlink type to SwigVarLink
+
+With this type having just moved into a module, let's also
+make a change to use correct Python naming conventions for the
+name of the type.
+---
+ CHANGES.current | 8 ++++++
+ Lib/python/pyrun.swg | 64 ++++++++++++++++++++++----------------------
+ 2 files changed, 40 insertions(+), 32 deletions(-)
+
+#diff --git a/CHANGES.current b/CHANGES.current
+#index 0bce7937f..9a2c0f5e2 100644
+#--- a/CHANGES.current
+#+++ b/CHANGES.current
+#@@ -7,6 +7,14 @@ the issue number to the end of the URL: https://github.com/swig/swig/issues/
+# Version 4.4.0 (in progress)
+# ===========================
+#
+#+2025-05-11: wsfulton
+#+ [Python] Move the SwigPyObject, SwigPyPacked, SwigVarLink (renamed from
+#+ swigvarlink) support Python types to the SWIG runtime module (currently called
+#+ swig_runtime_data5).
+#+
+#+ Note that these affect the Python runtime implementation, so the recently bumped
+#+ SWIG_RUNTIME_VERSION to 5 for all scripting languages will now include this change.
+#+
+# 2025-05-10: jschueller, wsfulton
+# [Python] #2881 #3061 #3160 DeprecationWarning fixes when using 'python -Walways'
+# or if using one of the types being warned about:
+diff --git a/Lib/python/pyrun.swg b/Lib/python/pyrun.swg
+index 2ef79f348..e7164725d 100644
+--- a/Lib/python/pyrun.swg
++++ b/Lib/python/pyrun.swg
+@@ -257,7 +257,7 @@ typedef struct swig_varlinkobject {
+ } swig_varlinkobject;
+
+ SWIGINTERN PyObject *
+-swig_varlink_repr(PyObject *SWIGUNUSEDPARM(v)) {
++SwigVarLink_repr(PyObject *SWIGUNUSEDPARM(v)) {
+ #if PY_VERSION_HEX >= 0x03000000
+ return PyUnicode_InternFromString("");
+ #else
+@@ -266,7 +266,7 @@ swig_varlink_repr(PyObject *SWIGUNUSEDPARM(v)) {
+ }
+
+ SWIGINTERN PyObject *
+-swig_varlink_str(PyObject *o) {
++SwigVarLink_str(PyObject *o) {
+ swig_varlinkobject *v = (swig_varlinkobject *) o;
+ #if PY_VERSION_HEX >= 0x03000000
+ PyObject *str = PyUnicode_InternFromString("(");
+@@ -305,7 +305,7 @@ swig_varlink_str(PyObject *o) {
+ }
+
+ SWIGINTERN void
+-swig_varlink_dealloc(PyObject *o) {
++SwigVarLink_dealloc(PyObject *o) {
+ swig_varlinkobject *v = (swig_varlinkobject *) o;
+ swig_globalvar *var = v->vars;
+ while (var) {
+@@ -317,7 +317,7 @@ swig_varlink_dealloc(PyObject *o) {
+ }
+
+ SWIGINTERN PyObject *
+-swig_varlink_getattr(PyObject *o, char *n) {
++SwigVarLink_getattr(PyObject *o, char *n) {
+ swig_varlinkobject *v = (swig_varlinkobject *) o;
+ PyObject *res = NULL;
+ swig_globalvar *var = v->vars;
+@@ -335,7 +335,7 @@ swig_varlink_getattr(PyObject *o, char *n) {
+ }
+
+ SWIGINTERN int
+-swig_varlink_setattr(PyObject *o, char *n, PyObject *p) {
++SwigVarLink_setattr(PyObject *o, char *n, PyObject *p) {
+ swig_varlinkobject *v = (swig_varlinkobject *) o;
+ int res = 1;
+ swig_globalvar *var = v->vars;
+@@ -358,7 +358,7 @@ swig_varlink_setattr(PyObject *o, char *n, PyObject *p) {
+
+ SWIGINTERN PyTypeObject*
+ swig_varlink_type(void) {
+- static char varlink__doc__[] = "Swig variable link object";
++ static char SwigVarLink_doc[] = "Swig variable link object";
+ #ifndef SWIG_HEAPTYPES
+ static PyTypeObject varlink_type;
+ static int type_init = 0;
+@@ -370,30 +370,30 @@ swig_varlink_type(void) {
+ PyObject_HEAD_INIT(NULL)
+ 0, /* ob_size */
+ #endif
+- SWIG_RUNTIME_MODULE ".swigvarlink", /* tp_name */
++ SWIG_RUNTIME_MODULE ".SwigVarLink", /* tp_name */
+ sizeof(swig_varlinkobject), /* tp_basicsize */
+ 0, /* tp_itemsize */
+- (destructor) swig_varlink_dealloc, /* tp_dealloc */
++ (destructor) SwigVarLink_dealloc, /* tp_dealloc */
+ #if PY_VERSION_HEX < 0x030800b4
+ (printfunc)0, /* tp_print */
+ #else
+ (Py_ssize_t)0, /* tp_vectorcall_offset */
+ #endif
+- (getattrfunc) swig_varlink_getattr, /* tp_getattr */
+- (setattrfunc) swig_varlink_setattr, /* tp_setattr */
++ (getattrfunc) SwigVarLink_getattr, /* tp_getattr */
++ (setattrfunc) SwigVarLink_setattr, /* tp_setattr */
+ 0, /* tp_compare */
+- (reprfunc) swig_varlink_repr, /* tp_repr */
++ (reprfunc) SwigVarLink_repr, /* tp_repr */
+ 0, /* tp_as_number */
+ 0, /* tp_as_sequence */
+ 0, /* tp_as_mapping */
+ 0, /* tp_hash */
+ 0, /* tp_call */
+- (reprfunc) swig_varlink_str, /* tp_str */
++ (reprfunc) SwigVarLink_str, /* tp_str */
+ 0, /* tp_getattro */
+ 0, /* tp_setattro */
+ 0, /* tp_as_buffer */
+ 0, /* tp_flags */
+- varlink__doc__, /* tp_doc */
++ SwigVarLink_doc, /* tp_doc */
+ 0, /* tp_traverse */
+ 0, /* tp_clear */
+ 0, /* tp_richcompare */
+@@ -429,22 +429,22 @@ swig_varlink_type(void) {
+ type_init = 1;
+ if (PyType_Ready(&varlink_type) < 0)
+ return NULL;
+- if (PyModule_AddObject(runtime_data_module, "swigvarlink", (PyObject *)&varlink_type) == 0)
++ if (PyModule_AddObject(runtime_data_module, "SwigVarLink", (PyObject *)&varlink_type) == 0)
+ SWIG_Py_INCREF((PyObject *)&varlink_type);
+ }
+ return &varlink_type;
+ #else
+ PyType_Slot slots[] = {
+- { Py_tp_dealloc, (void *)swig_varlink_dealloc },
+- { Py_tp_repr, (void *)swig_varlink_repr },
+- { Py_tp_getattr, (void *)swig_varlink_getattr },
+- { Py_tp_setattr, (void *)swig_varlink_setattr },
+- { Py_tp_str, (void *)swig_varlink_str },
+- { Py_tp_doc, (void *)varlink__doc__ },
++ { Py_tp_dealloc, (void *)SwigVarLink_dealloc },
++ { Py_tp_repr, (void *)SwigVarLink_repr },
++ { Py_tp_getattr, (void *)SwigVarLink_getattr },
++ { Py_tp_setattr, (void *)SwigVarLink_setattr },
++ { Py_tp_str, (void *)SwigVarLink_str },
++ { Py_tp_doc, (void *)SwigVarLink_doc },
+ { 0, NULL }
+ };
+ PyType_Spec spec = {
+- SWIG_RUNTIME_MODULE ".swigvarlink",
++ SWIG_RUNTIME_MODULE ".SwigVarLink",
+ sizeof(swig_varlinkobject),
+ 0,
+ Py_TPFLAGS_DEFAULT,
+@@ -452,7 +452,7 @@ swig_varlink_type(void) {
+ };
+ PyObject *pytype = PyType_FromSpec(&spec);
+ PyObject *runtime_data_module = SWIG_runtime_data_module();
+- if (pytype && PyModule_AddObject(runtime_data_module, "swigvarlink", pytype) == 0)
++ if (pytype && PyModule_AddObject(runtime_data_module, "SwigVarLink", pytype) == 0)
+ SWIG_Py_INCREF(pytype);
+ return (PyTypeObject *)pytype;
+ #endif
+@@ -715,7 +715,7 @@ SwigPyObject_repr(SwigPyObject *v)
+ }
+
+ /* We need a version taking two PyObject* parameters so it's a valid
+- * PyCFunction to use in swigobject_methods[]. */
++ * PyCFunction to use in SwigPyObject_methods[]. */
+ SWIGRUNTIME PyObject *
+ SwigPyObject_repr2(PyObject *v, PyObject *SWIGUNUSEDPARM(args))
+ {
+@@ -922,7 +922,7 @@ SwigPyObject_own(PyObject *v, PyObject *args)
+ }
+
+ static PyMethodDef
+-swigobject_methods[] = {
++SwigPyObject_methods[] = {
+ {"disown", SwigPyObject_disown, METH_NOARGS, "releases ownership of the pointer"},
+ {"acquire", SwigPyObject_acquire, METH_NOARGS, "acquires ownership of the pointer"},
+ {"own", SwigPyObject_own, METH_VARARGS, "returns/sets ownership of the pointer"},
+@@ -934,7 +934,7 @@ swigobject_methods[] = {
+
+ SWIGRUNTIME PyTypeObject*
+ SwigPyObject_TypeOnce(void) {
+- static char swigobject_doc[] = "Swig object holding a C/C++ pointer";
++ static char SwigPyObject_doc[] = "Swig object holding a C/C++ pointer";
+ #ifndef SWIG_HEAPTYPES
+ static PyNumberMethods SwigPyObject_as_number = {
+ (binaryfunc)0, /*nb_add*/
+@@ -1017,14 +1017,14 @@ SwigPyObject_TypeOnce(void) {
+ 0, /* tp_setattro */
+ 0, /* tp_as_buffer */
+ Py_TPFLAGS_DEFAULT, /* tp_flags */
+- swigobject_doc, /* tp_doc */
++ SwigPyObject_doc, /* tp_doc */
+ 0, /* tp_traverse */
+ 0, /* tp_clear */
+ (richcmpfunc)SwigPyObject_richcompare,/* tp_richcompare */
+ 0, /* tp_weaklistoffset */
+ 0, /* tp_iter */
+ 0, /* tp_iternext */
+- swigobject_methods, /* tp_methods */
++ SwigPyObject_methods, /* tp_methods */
+ 0, /* tp_members */
+ 0, /* tp_getset */
+ 0, /* tp_base */
+@@ -1081,9 +1081,9 @@ SwigPyObject_TypeOnce(void) {
+ { Py_tp_dealloc, (void *)SwigPyObject_dealloc },
+ { Py_tp_repr, (void *)SwigPyObject_repr },
+ { Py_tp_getattro, (void *)PyObject_GenericGetAttr },
+- { Py_tp_doc, (void *)swigobject_doc },
++ { Py_tp_doc, (void *)SwigPyObject_doc },
+ { Py_tp_richcompare, (void *)SwigPyObject_richcompare },
+- { Py_tp_methods, (void *)swigobject_methods },
++ { Py_tp_methods, (void *)SwigPyObject_methods },
+ { Py_nb_int, (void *)SwigPyObject_long },
+ { 0, NULL }
+ };
+@@ -1207,7 +1207,7 @@ SwigPyPacked_dealloc(PyObject *v)
+
+ SWIGRUNTIME PyTypeObject*
+ SwigPyPacked_TypeOnce(void) {
+- static char swigpacked_doc[] = "Swig object holding a C/C++ function pointer";
++ static char SwigPyPacked_doc[] = "Swig object holding a C/C++ function pointer";
+ #ifndef SWIG_HEAPTYPES
+ static PyTypeObject swigpypacked_type;
+ static int type_init = 0;
+@@ -1246,7 +1246,7 @@ SwigPyPacked_TypeOnce(void) {
+ 0, /* tp_setattro */
+ 0, /* tp_as_buffer */
+ Py_TPFLAGS_DEFAULT, /* tp_flags */
+- swigpacked_doc, /* tp_doc */
++ SwigPyPacked_doc, /* tp_doc */
+ 0, /* tp_traverse */
+ 0, /* tp_clear */
+ 0, /* tp_richcompare */
+@@ -1311,7 +1311,7 @@ SwigPyPacked_TypeOnce(void) {
+ { Py_tp_repr, (void *)SwigPyPacked_repr },
+ { Py_tp_str, (void *)SwigPyPacked_str },
+ { Py_tp_getattro, (void *)PyObject_GenericGetAttr },
+- { Py_tp_doc, (void *)swigpacked_doc },
++ { Py_tp_doc, (void *)SwigPyPacked_doc },
+ { 0, NULL }
+ };
+ PyType_Spec spec = {
+--
+2.50.1
+
+
+From 831fc6069115b8a31bed5d0bcae221825cd43c18 Mon Sep 17 00:00:00 2001
+From: William S Fulton
+Date: Tue, 13 May 2025 08:40:45 +0100
+Subject: [PATCH 4/5] Add docs on the python runtime module
+
+---
+ Doc/Manual/Python.html | 50 ++++++++++++++++++++++++++++++++++++++++++
+ 1 file changed, 50 insertions(+)
+
+diff --git a/Doc/Manual/Python.html b/Doc/Manual/Python.html
+index 7427ca4cf..cc82e9762 100644
+--- a/Doc/Manual/Python.html
++++ b/Doc/Manual/Python.html
+@@ -1000,6 +1000,10 @@ module name, make sure you don't use the same name as a built-in
+ Python command or standard module name.
+
+
++
++There is also a further 'behind the scenes' Python runtime module, but this implementation detail is covered later.
++
++
+
+
+
+@@ -2704,6 +2708,52 @@ in the file python/pyopers.swg in the SWIG library.
+
+
+
++
++
++
++In addition to the two Python modules that are generated by SWIG, there is also a third 'behind the scenes' Python runtime module.
++The runtime module is very much an implementation level detail, but is mentioned here for completeness and for the inquisitive!
++
++
++
++SWIG implements a run-time type checker for checking a Python type/class as it passes between the Python and C/C++ layers.
++It is also used when multiple SWIG modules need to share type information with each other (when using the %import directive).
++More details can be found in the SWIG runtime code and run-time type checker sections.
++The runtime module contains the following:
++
++
++
++ - A Python Capsule containing a pointer to the underlying C module data structure used by the runtime type checker. For multiple modules to access the common runtime implementation. The Capsule is named type_pointer_capsule except when using -builtin when it is instead called type_pointer_capsule_builtin.
++ - The builtin type SwigPyObject - Swig object holding a C/C++ pointer. For 'normal' pointers, that is, not for function pointers nor member function pointers.
++ - The builtin type SwigPyPacked - Swig object holding a C/C++ function pointer. For C pointers to a function or C++ member function pointers.
++ - The builtin type SwigVarLink - Swig variable link object. The type used by the 'cvar' field for accessing C/C++ global variables.
++
++
++
++If multiple SWIG modules are being used, the C/C++ wrapped proxy classes/types can be shared or used across the different modules via the SWIG runtime.
++The runtime is accessed and shared via the Capsule in the runtime module.
++The Python runtime module is implemented as a Python builtin module. While users are unlikely to use or import the runtime module directly, it can be inspected simply enough.
++The name of the module is swig_runtime_data appended with the runtime version as defined by SWIG_RUNTIME_VERSION.
++First import your SWIG generated module. Next find the exact runtime module name so you know what to import before inspecting it with say dir.
++The interpreter session below demonstrates this with a SWIG generated module called example:
++
++
++
++
++>>> import example
++>>> import sys
++>>> list(m for m in sys.modules if m.startswith("swig_runtime_data"))
++['swig_runtime_data5']
++>>> import swig_runtime_data5
++>>> dir(swig_runtime_data5)
++['SwigPyObject', 'SwigPyPacked', 'SwigVarLink', '__doc__', '__loader__', '__name__', '__package__', '__spec__', 'type_pointer_capsule']
++
++
++
++
++Compatibility Note: Only the Capsule was stored in the Python runtime module prior to SWIG-4.4.0.
++
++
+
+
+
+--
+2.50.1
+
+
+From d966fd3ba18370b5bf34b67ff376d88fb6d3e65b Mon Sep 17 00:00:00 2001
+From: William S Fulton
+Date: Tue, 13 May 2025 21:42:56 +0100
+Subject: [PATCH 5/5] Test swig runtime module contains expected names
+
+---
+ .../python/python_moduleimport_runme.py | 17 +++++++++++++++++
+ Examples/test-suite/python_moduleimport.i | 2 ++
+ 2 files changed, 19 insertions(+)
+
+diff --git a/Examples/test-suite/python/python_moduleimport_runme.py b/Examples/test-suite/python/python_moduleimport_runme.py
+index cdb860730..8e0aa6121 100644
+--- a/Examples/test-suite/python/python_moduleimport_runme.py
++++ b/Examples/test-suite/python/python_moduleimport_runme.py
+@@ -1,7 +1,24 @@
+ import python_moduleimport
+
++# Test custom moduleimport in %module
+ if python_moduleimport.simple_function(99) != 99:
+ raise RuntimeError("simple_function")
+
+ if python_moduleimport.extra_import_variable != "custom import of _python_moduleimport":
+ raise RuntimeError("custom import")
++
++
++# Test the swig runtime module contains the expected names/types
++import importlib
++swig_runtime_version = python_moduleimport.runtime_version()
++swig_runtime_data = importlib.import_module("swig_runtime_data" + swig_runtime_version) # Equivalent to (for version 5): import swig_runtime_data5 as swig_runtime_data
++
++names = dir(swig_runtime_data)
++expected_names = ("SwigPyObject", "SwigPyPacked", "SwigVarLink")
++for name in expected_names:
++ if name not in names:
++ raise RuntimeError("{} not in {}".format(name, names))
++
++cvar_type = type(python_moduleimport.cvar)
++if cvar_type.__name__ != "SwigVarLink":
++ raise RuntimeError("cvar type name is incorrect: {}".format(cvar_type.__name__))
+diff --git a/Examples/test-suite/python_moduleimport.i b/Examples/test-suite/python_moduleimport.i
+index f62547dcd..f0d203433 100644
+--- a/Examples/test-suite/python_moduleimport.i
++++ b/Examples/test-suite/python_moduleimport.i
+@@ -23,4 +23,6 @@ from $module import *
+
+ %inline %{
+ int simple_function(int i) { return i; }
++int globalvar = 99;
++const char * runtime_version() { return SWIG_RUNTIME_VERSION; }
+ %}
+--
+2.50.1
+
diff --git a/swig.spec b/swig.spec
index 0b7b0f9..4861e11 100644
--- a/swig.spec
+++ b/swig.spec
@@ -56,7 +56,7 @@
%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}
+%{!?javalang:%global javalang 0}
%endif
# Do not run Go tests, they failed with 4.0.0 on ppc64le, s390
@@ -68,8 +68,8 @@
Summary: Connects C/C++/Objective C to some high-level programming languages
Name: swig
-Version: 4.4.1
-Release: 1%{?dist}
+Version: 4.3.1
+Release: 5%{?dist}
License: GPL-3.0-or-later AND BSD-3-Clause
URL: https://www.swig.org/
Source0: http://downloads.sourceforge.net/project/swig/swig/swig-%{version}/swig-%{version}.tar.gz
@@ -80,6 +80,11 @@ Source2: description-ccache.h2m
Source3: ccache-swig.sh
Source4: ccache-swig.csh
%endif
+# https://github.com/swig/swig/pull/3159
+Patch0: swig-python-Python-3.14-support.patch
+# Python DeprecationWarning fixes - in upstream after 4.4.0
+# https://github.com/swig/swig/issues/2881
+Patch1: swig-4.4.0-Python-DeprecationWarning-fixes.patch
BuildRequires: coreutils
BuildRequires: findutils
@@ -363,15 +368,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