From 98c803eb1ac384644213057650f9f26249c22362 Mon Sep 17 00:00:00 2001 From: Jim Easterbrook Date: Fri, 6 Mar 2026 13:48:03 +0000 Subject: [PATCH 01/13] Don't test ref count on "immortal" object I can't trigger this problem on Linux, but the GitHiub actions MacOS build has it. There are probably more to find. --- tests/test_basicio.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/tests/test_basicio.py b/tests/test_basicio.py index 732de66d..edfa5743 100644 --- a/tests/test_basicio.py +++ b/tests/test_basicio.py @@ -227,6 +227,9 @@ def test_MemIo(self): def test_ref_counts(self): # MemIo keeps a reference to the data buffer count = sys.getrefcount(self.data) + if count > 1000000: + # self.data is "immortal" + return io = exiv2.ImageFactory.createIo(self.data) self.assertEqual(sys.getrefcount(self.data), count + 1) del io From d9f1fcc8c9efdba1559a13cf3eacec2e2597efd2 Mon Sep 17 00:00:00 2001 From: Jim Easterbrook Date: Sat, 7 Mar 2026 11:08:53 +0000 Subject: [PATCH 02/13] Build only needs toml for Python < 3.9 --- pyproject.toml | 21 ++++++++++++++++++++- 1 file changed, 20 insertions(+), 1 deletion(-) diff --git a/pyproject.toml b/pyproject.toml index 92e4715a..663c4369 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,8 +1,27 @@ +# python-exiv2 - Python interface to libexiv2 +# http://github.com/jim-easterbrook/python-exiv2 +# Copyright (C) 2023-26 Jim Easterbrook jim@jim-easterbrook.me.uk +# +# This file is part of python-exiv2. +# +# python-exiv2 is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# python-exiv2 is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with python-exiv2. If not, see . + [build-system] requires = [ "setuptools >= 59.6, < 61.0; python_version < '3.9'", "setuptools >= 77.0; python_version >= '3.9'", - "toml" + "toml; python_version < '3.9'" ] build-backend = "setuptools.build_meta" From 57c9f6a613f247d885af62c38c26855d507490bd Mon Sep 17 00:00:00 2001 From: Jim Easterbrook Date: Mon, 9 Mar 2026 16:07:57 +0000 Subject: [PATCH 03/13] Use raw strings for regex expressions --- setup.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/setup.py b/setup.py index de27481c..071450e6 100644 --- a/setup.py +++ b/setup.py @@ -92,13 +92,13 @@ def get_mod_src_dir(exiv2_version): library_dirs = [path] package_dir['exiv2.lib'] = path package_data['exiv2.lib'] = [x for x in os.listdir(path) - if re.fullmatch('libexiv2\.so\.\d+', x)] + if re.fullmatch(r'libexiv2\.so\.\d+', x)] elif platform == 'darwin': path = os.path.join(exiv2_root, 'lib') library_dirs = [path] package_dir['exiv2.lib'] = path package_data['exiv2.lib'] = [x for x in os.listdir(path) - if re.fullmatch('libexiv2\.\d+\.dylib', x)] + if re.fullmatch(r'libexiv2\.\d+\.dylib', x)] elif platform in ('win32', 'mingw'): library_dirs = [os.path.join(exiv2_root, 'lib')] package_dir['exiv2.lib'] = os.path.join(exiv2_root, 'bin') From 8a666d240dfcca48e3294b972f85b365cb7c149c Mon Sep 17 00:00:00 2001 From: Jim Easterbrook Date: Sat, 20 Jun 2026 16:20:30 +0100 Subject: [PATCH 04/13] Provide PyWeakref_GetRef for Python < 3.13 This replacement for PyWeakref_GetObject was introduced in 3.13 and PyWeakref_GetRef is removed in 3.15. This should fix bug #64. --- src/interface/shared/pointer_store.i | 10 ++++++---- src/interface/shared/private_data.i | 25 +++++++++++++++++++++---- src/swig-0_27_7/basicio_wrap.cxx | 18 ++++++++++++++++-- src/swig-0_27_7/exif_wrap.cxx | 18 ++++++++++++++++-- src/swig-0_27_7/image_wrap.cxx | 18 ++++++++++++++++-- src/swig-0_27_7/iptc_wrap.cxx | 18 ++++++++++++++++-- src/swig-0_27_7/preview_wrap.cxx | 18 ++++++++++++++++-- src/swig-0_27_7/types_wrap.cxx | 18 ++++++++++++++++-- src/swig-0_27_7/value_wrap.cxx | 18 ++++++++++++++++-- src/swig-0_27_7/xmp_wrap.cxx | 18 ++++++++++++++++-- src/swig-0_28_7/basicio_wrap.cxx | 18 ++++++++++++++++-- src/swig-0_28_7/exif_wrap.cxx | 18 ++++++++++++++++-- src/swig-0_28_7/image_wrap.cxx | 18 ++++++++++++++++-- src/swig-0_28_7/iptc_wrap.cxx | 18 ++++++++++++++++-- src/swig-0_28_7/preview_wrap.cxx | 18 ++++++++++++++++-- src/swig-0_28_7/types_wrap.cxx | 18 ++++++++++++++++-- src/swig-0_28_7/value_wrap.cxx | 18 ++++++++++++++++-- src/swig-0_28_7/xmp_wrap.cxx | 18 ++++++++++++++++-- src/swig-0_28_8/basicio_wrap.cxx | 18 ++++++++++++++++-- src/swig-0_28_8/exif_wrap.cxx | 18 ++++++++++++++++-- src/swig-0_28_8/image_wrap.cxx | 18 ++++++++++++++++-- src/swig-0_28_8/iptc_wrap.cxx | 18 ++++++++++++++++-- src/swig-0_28_8/preview_wrap.cxx | 18 ++++++++++++++++-- src/swig-0_28_8/types_wrap.cxx | 18 ++++++++++++++++-- src/swig-0_28_8/value_wrap.cxx | 18 ++++++++++++++++-- src/swig-0_28_8/xmp_wrap.cxx | 18 ++++++++++++++++-- 26 files changed, 411 insertions(+), 56 deletions(-) diff --git a/src/interface/shared/pointer_store.i b/src/interface/shared/pointer_store.i index 3ad18466..0b6c5631 100644 --- a/src/interface/shared/pointer_store.i +++ b/src/interface/shared/pointer_store.i @@ -1,6 +1,6 @@ // python-exiv2 - Python interface to libexiv2 // http://github.com/jim-easterbrook/python-exiv2 -// Copyright (C) 2023-25 Jim Easterbrook jim@jim-easterbrook.me.uk +// Copyright (C) 2023-26 Jim Easterbrook jim@jim-easterbrook.me.uk // // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by @@ -25,15 +25,17 @@ #if SWIG_VERSION >= 0x040400 // Functions to store weak references to pointers (swig >= v4.4) -%fragment("pointer_store", "header", fragment="private_data") { +%fragment("pointer_store", "header", fragment="private_data", + fragment="weakref_getref") { static void _process_list(PyObject* list, bool purge_only, Exiv2::container_type::iterator* beg, Exiv2::container_type::iterator* end) { PyObject* py_ptr = NULL; datum_type##_pointer* cpp_ptr = NULL; for (Py_ssize_t idx = PyList_Size(list); idx > 0; idx--) { - py_ptr = PyWeakref_GetObject(PyList_GetItem(list, idx-1)); - if (py_ptr == Py_None) + if (PyWeakref_GetRef(PyList_GetItem(list, idx-1), &py_ptr) == 1) + Py_DECREF(py_ptr); + else goto forget; if (purge_only) continue; diff --git a/src/interface/shared/private_data.i b/src/interface/shared/private_data.i index 5bc28670..54c934f1 100644 --- a/src/interface/shared/private_data.i +++ b/src/interface/shared/private_data.i @@ -1,6 +1,6 @@ // python-exiv2 - Python interface to libexiv2 // http://github.com/jim-easterbrook/python-exiv2 -// Copyright (C) 2025 Jim Easterbrook jim@jim-easterbrook.me.uk +// Copyright (C) 2025-26 Jim Easterbrook jim@jim-easterbrook.me.uk // // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by @@ -60,8 +60,24 @@ static int private_store_del(PyObject* py_self, const char* name) { }; } +// Implementation of PyWeakref_GetRef for Python < 3.13 +%fragment("weakref_getref", "header") { +%#if PY_VERSION_HEX < 0x030d0000 +static int PyWeakref_GetRef(PyObject *ref, PyObject **pobj) { + *pobj = PyWeakref_GetObject(ref); + if (*pobj == Py_None) { + *pobj = NULL; + return 0; + } + Py_INCREF(*pobj); + return 1; +}; +%#endif +} + // Functions to store references to memoryview objects and release them -%fragment("memoryview_funcs", "header", fragment="private_data") { +%fragment("memoryview_funcs", "header", fragment="private_data", + fragment="weakref_getref") { static int store_view(PyObject* py_self, PyObject* view) { PyObject* view_list = private_store_get(py_self, "view_list"); if (!view_list) { @@ -92,9 +108,10 @@ static int release_views(PyObject* py_self) { PyObject* view = NULL; for (Py_ssize_t idx = PyList_Size(view_list); idx > 0; idx--) { view_ref = PyList_GetItem(view_list, idx - 1); - view = PyWeakref_GetObject(view_ref); - if (view != Py_None) + if (PyWeakref_GetRef(view_ref, &view) == 1) { Py_XDECREF(PyObject_CallMethod(view, "release", NULL)); + Py_DECREF(view); + } PyList_SetSlice(view_list, idx - 1, idx, NULL); } return 0; diff --git a/src/swig-0_27_7/basicio_wrap.cxx b/src/swig-0_27_7/basicio_wrap.cxx index 1390eacf..cfd7f2f6 100644 --- a/src/swig-0_27_7/basicio_wrap.cxx +++ b/src/swig-0_27_7/basicio_wrap.cxx @@ -4835,6 +4835,19 @@ static int private_store_del(PyObject* py_self, const char* name) { }; +#if PY_VERSION_HEX < 0x030d0000 +static int PyWeakref_GetRef(PyObject *ref, PyObject **pobj) { + *pobj = PyWeakref_GetObject(ref); + if (*pobj == Py_None) { + *pobj = NULL; + return 0; + } + Py_INCREF(*pobj); + return 1; +}; +#endif + + static int store_view(PyObject* py_self, PyObject* view) { PyObject* view_list = private_store_get(py_self, "view_list"); if (!view_list) { @@ -4865,9 +4878,10 @@ static int release_views(PyObject* py_self) { PyObject* view = NULL; for (Py_ssize_t idx = PyList_Size(view_list); idx > 0; idx--) { view_ref = PyList_GetItem(view_list, idx - 1); - view = PyWeakref_GetObject(view_ref); - if (view != Py_None) + if (PyWeakref_GetRef(view_ref, &view) == 1) { Py_XDECREF(PyObject_CallMethod(view, "release", NULL)); + Py_DECREF(view); + } PyList_SetSlice(view_list, idx - 1, idx, NULL); } return 0; diff --git a/src/swig-0_27_7/exif_wrap.cxx b/src/swig-0_27_7/exif_wrap.cxx index 7436cbdc..fb03c35d 100644 --- a/src/swig-0_27_7/exif_wrap.cxx +++ b/src/swig-0_27_7/exif_wrap.cxx @@ -5631,14 +5631,28 @@ static PyObject* set_value_from_py(Exiv2::Exifdatum* datum, }; +#if PY_VERSION_HEX < 0x030d0000 +static int PyWeakref_GetRef(PyObject *ref, PyObject **pobj) { + *pobj = PyWeakref_GetObject(ref); + if (*pobj == Py_None) { + *pobj = NULL; + return 0; + } + Py_INCREF(*pobj); + return 1; +}; +#endif + + static void _process_list(PyObject* list, bool purge_only, Exiv2::ExifData::iterator* beg, Exiv2::ExifData::iterator* end) { PyObject* py_ptr = NULL; Exifdatum_pointer* cpp_ptr = NULL; for (Py_ssize_t idx = PyList_Size(list); idx > 0; idx--) { - py_ptr = PyWeakref_GetObject(PyList_GetItem(list, idx-1)); - if (py_ptr == Py_None) + if (PyWeakref_GetRef(PyList_GetItem(list, idx-1), &py_ptr) == 1) + Py_DECREF(py_ptr); + else goto forget; if (purge_only) continue; diff --git a/src/swig-0_27_7/image_wrap.cxx b/src/swig-0_27_7/image_wrap.cxx index 9e4c2e8e..11311050 100644 --- a/src/swig-0_27_7/image_wrap.cxx +++ b/src/swig-0_27_7/image_wrap.cxx @@ -5053,6 +5053,19 @@ static int private_store_del(PyObject* py_self, const char* name) { }; +#if PY_VERSION_HEX < 0x030d0000 +static int PyWeakref_GetRef(PyObject *ref, PyObject **pobj) { + *pobj = PyWeakref_GetObject(ref); + if (*pobj == Py_None) { + *pobj = NULL; + return 0; + } + Py_INCREF(*pobj); + return 1; +}; +#endif + + static int store_view(PyObject* py_self, PyObject* view) { PyObject* view_list = private_store_get(py_self, "view_list"); if (!view_list) { @@ -5083,9 +5096,10 @@ static int release_views(PyObject* py_self) { PyObject* view = NULL; for (Py_ssize_t idx = PyList_Size(view_list); idx > 0; idx--) { view_ref = PyList_GetItem(view_list, idx - 1); - view = PyWeakref_GetObject(view_ref); - if (view != Py_None) + if (PyWeakref_GetRef(view_ref, &view) == 1) { Py_XDECREF(PyObject_CallMethod(view, "release", NULL)); + Py_DECREF(view); + } PyList_SetSlice(view_list, idx - 1, idx, NULL); } return 0; diff --git a/src/swig-0_27_7/iptc_wrap.cxx b/src/swig-0_27_7/iptc_wrap.cxx index bf279966..f4101f36 100644 --- a/src/swig-0_27_7/iptc_wrap.cxx +++ b/src/swig-0_27_7/iptc_wrap.cxx @@ -5623,14 +5623,28 @@ static PyObject* set_value_from_py(Exiv2::Iptcdatum* datum, }; +#if PY_VERSION_HEX < 0x030d0000 +static int PyWeakref_GetRef(PyObject *ref, PyObject **pobj) { + *pobj = PyWeakref_GetObject(ref); + if (*pobj == Py_None) { + *pobj = NULL; + return 0; + } + Py_INCREF(*pobj); + return 1; +}; +#endif + + static void _process_list(PyObject* list, bool purge_only, Exiv2::IptcData::iterator* beg, Exiv2::IptcData::iterator* end) { PyObject* py_ptr = NULL; Iptcdatum_pointer* cpp_ptr = NULL; for (Py_ssize_t idx = PyList_Size(list); idx > 0; idx--) { - py_ptr = PyWeakref_GetObject(PyList_GetItem(list, idx-1)); - if (py_ptr == Py_None) + if (PyWeakref_GetRef(PyList_GetItem(list, idx-1), &py_ptr) == 1) + Py_DECREF(py_ptr); + else goto forget; if (purge_only) continue; diff --git a/src/swig-0_27_7/preview_wrap.cxx b/src/swig-0_27_7/preview_wrap.cxx index e3be5cb4..d40692e7 100644 --- a/src/swig-0_27_7/preview_wrap.cxx +++ b/src/swig-0_27_7/preview_wrap.cxx @@ -5940,6 +5940,19 @@ static int private_store_del(PyObject* py_self, const char* name) { }; +#if PY_VERSION_HEX < 0x030d0000 +static int PyWeakref_GetRef(PyObject *ref, PyObject **pobj) { + *pobj = PyWeakref_GetObject(ref); + if (*pobj == Py_None) { + *pobj = NULL; + return 0; + } + Py_INCREF(*pobj); + return 1; +}; +#endif + + static int store_view(PyObject* py_self, PyObject* view) { PyObject* view_list = private_store_get(py_self, "view_list"); if (!view_list) { @@ -5970,9 +5983,10 @@ static int release_views(PyObject* py_self) { PyObject* view = NULL; for (Py_ssize_t idx = PyList_Size(view_list); idx > 0; idx--) { view_ref = PyList_GetItem(view_list, idx - 1); - view = PyWeakref_GetObject(view_ref); - if (view != Py_None) + if (PyWeakref_GetRef(view_ref, &view) == 1) { Py_XDECREF(PyObject_CallMethod(view, "release", NULL)); + Py_DECREF(view); + } PyList_SetSlice(view_list, idx - 1, idx, NULL); } return 0; diff --git a/src/swig-0_27_7/types_wrap.cxx b/src/swig-0_27_7/types_wrap.cxx index d6ab2127..9914d1d1 100644 --- a/src/swig-0_27_7/types_wrap.cxx +++ b/src/swig-0_27_7/types_wrap.cxx @@ -5163,6 +5163,19 @@ static int private_store_del(PyObject* py_self, const char* name) { }; +#if PY_VERSION_HEX < 0x030d0000 +static int PyWeakref_GetRef(PyObject *ref, PyObject **pobj) { + *pobj = PyWeakref_GetObject(ref); + if (*pobj == Py_None) { + *pobj = NULL; + return 0; + } + Py_INCREF(*pobj); + return 1; +}; +#endif + + static int store_view(PyObject* py_self, PyObject* view) { PyObject* view_list = private_store_get(py_self, "view_list"); if (!view_list) { @@ -5193,9 +5206,10 @@ static int release_views(PyObject* py_self) { PyObject* view = NULL; for (Py_ssize_t idx = PyList_Size(view_list); idx > 0; idx--) { view_ref = PyList_GetItem(view_list, idx - 1); - view = PyWeakref_GetObject(view_ref); - if (view != Py_None) + if (PyWeakref_GetRef(view_ref, &view) == 1) { Py_XDECREF(PyObject_CallMethod(view, "release", NULL)); + Py_DECREF(view); + } PyList_SetSlice(view_list, idx - 1, idx, NULL); } return 0; diff --git a/src/swig-0_27_7/value_wrap.cxx b/src/swig-0_27_7/value_wrap.cxx index 0028a5df..a2170677 100644 --- a/src/swig-0_27_7/value_wrap.cxx +++ b/src/swig-0_27_7/value_wrap.cxx @@ -6541,6 +6541,19 @@ static int private_store_del(PyObject* py_self, const char* name) { }; +#if PY_VERSION_HEX < 0x030d0000 +static int PyWeakref_GetRef(PyObject *ref, PyObject **pobj) { + *pobj = PyWeakref_GetObject(ref); + if (*pobj == Py_None) { + *pobj = NULL; + return 0; + } + Py_INCREF(*pobj); + return 1; +}; +#endif + + static int store_view(PyObject* py_self, PyObject* view) { PyObject* view_list = private_store_get(py_self, "view_list"); if (!view_list) { @@ -6571,9 +6584,10 @@ static int release_views(PyObject* py_self) { PyObject* view = NULL; for (Py_ssize_t idx = PyList_Size(view_list); idx > 0; idx--) { view_ref = PyList_GetItem(view_list, idx - 1); - view = PyWeakref_GetObject(view_ref); - if (view != Py_None) + if (PyWeakref_GetRef(view_ref, &view) == 1) { Py_XDECREF(PyObject_CallMethod(view, "release", NULL)); + Py_DECREF(view); + } PyList_SetSlice(view_list, idx - 1, idx, NULL); } return 0; diff --git a/src/swig-0_27_7/xmp_wrap.cxx b/src/swig-0_27_7/xmp_wrap.cxx index 81c179bb..965b7a35 100644 --- a/src/swig-0_27_7/xmp_wrap.cxx +++ b/src/swig-0_27_7/xmp_wrap.cxx @@ -5626,14 +5626,28 @@ static PyObject* set_value_from_py(Exiv2::Xmpdatum* datum, }; +#if PY_VERSION_HEX < 0x030d0000 +static int PyWeakref_GetRef(PyObject *ref, PyObject **pobj) { + *pobj = PyWeakref_GetObject(ref); + if (*pobj == Py_None) { + *pobj = NULL; + return 0; + } + Py_INCREF(*pobj); + return 1; +}; +#endif + + static void _process_list(PyObject* list, bool purge_only, Exiv2::XmpData::iterator* beg, Exiv2::XmpData::iterator* end) { PyObject* py_ptr = NULL; Xmpdatum_pointer* cpp_ptr = NULL; for (Py_ssize_t idx = PyList_Size(list); idx > 0; idx--) { - py_ptr = PyWeakref_GetObject(PyList_GetItem(list, idx-1)); - if (py_ptr == Py_None) + if (PyWeakref_GetRef(PyList_GetItem(list, idx-1), &py_ptr) == 1) + Py_DECREF(py_ptr); + else goto forget; if (purge_only) continue; diff --git a/src/swig-0_28_7/basicio_wrap.cxx b/src/swig-0_28_7/basicio_wrap.cxx index 2b95ee76..61214318 100644 --- a/src/swig-0_28_7/basicio_wrap.cxx +++ b/src/swig-0_28_7/basicio_wrap.cxx @@ -4834,6 +4834,19 @@ static int private_store_del(PyObject* py_self, const char* name) { }; +#if PY_VERSION_HEX < 0x030d0000 +static int PyWeakref_GetRef(PyObject *ref, PyObject **pobj) { + *pobj = PyWeakref_GetObject(ref); + if (*pobj == Py_None) { + *pobj = NULL; + return 0; + } + Py_INCREF(*pobj); + return 1; +}; +#endif + + static int store_view(PyObject* py_self, PyObject* view) { PyObject* view_list = private_store_get(py_self, "view_list"); if (!view_list) { @@ -4864,9 +4877,10 @@ static int release_views(PyObject* py_self) { PyObject* view = NULL; for (Py_ssize_t idx = PyList_Size(view_list); idx > 0; idx--) { view_ref = PyList_GetItem(view_list, idx - 1); - view = PyWeakref_GetObject(view_ref); - if (view != Py_None) + if (PyWeakref_GetRef(view_ref, &view) == 1) { Py_XDECREF(PyObject_CallMethod(view, "release", NULL)); + Py_DECREF(view); + } PyList_SetSlice(view_list, idx - 1, idx, NULL); } return 0; diff --git a/src/swig-0_28_7/exif_wrap.cxx b/src/swig-0_28_7/exif_wrap.cxx index cce1eb3d..c51ce0a0 100644 --- a/src/swig-0_28_7/exif_wrap.cxx +++ b/src/swig-0_28_7/exif_wrap.cxx @@ -5793,14 +5793,28 @@ static PyObject* set_value_from_py(Exiv2::Exifdatum* datum, }; +#if PY_VERSION_HEX < 0x030d0000 +static int PyWeakref_GetRef(PyObject *ref, PyObject **pobj) { + *pobj = PyWeakref_GetObject(ref); + if (*pobj == Py_None) { + *pobj = NULL; + return 0; + } + Py_INCREF(*pobj); + return 1; +}; +#endif + + static void _process_list(PyObject* list, bool purge_only, Exiv2::ExifData::iterator* beg, Exiv2::ExifData::iterator* end) { PyObject* py_ptr = NULL; Exifdatum_pointer* cpp_ptr = NULL; for (Py_ssize_t idx = PyList_Size(list); idx > 0; idx--) { - py_ptr = PyWeakref_GetObject(PyList_GetItem(list, idx-1)); - if (py_ptr == Py_None) + if (PyWeakref_GetRef(PyList_GetItem(list, idx-1), &py_ptr) == 1) + Py_DECREF(py_ptr); + else goto forget; if (purge_only) continue; diff --git a/src/swig-0_28_7/image_wrap.cxx b/src/swig-0_28_7/image_wrap.cxx index a46c19ee..d4b2de6f 100644 --- a/src/swig-0_28_7/image_wrap.cxx +++ b/src/swig-0_28_7/image_wrap.cxx @@ -5040,6 +5040,19 @@ static int private_store_del(PyObject* py_self, const char* name) { }; +#if PY_VERSION_HEX < 0x030d0000 +static int PyWeakref_GetRef(PyObject *ref, PyObject **pobj) { + *pobj = PyWeakref_GetObject(ref); + if (*pobj == Py_None) { + *pobj = NULL; + return 0; + } + Py_INCREF(*pobj); + return 1; +}; +#endif + + static int store_view(PyObject* py_self, PyObject* view) { PyObject* view_list = private_store_get(py_self, "view_list"); if (!view_list) { @@ -5070,9 +5083,10 @@ static int release_views(PyObject* py_self) { PyObject* view = NULL; for (Py_ssize_t idx = PyList_Size(view_list); idx > 0; idx--) { view_ref = PyList_GetItem(view_list, idx - 1); - view = PyWeakref_GetObject(view_ref); - if (view != Py_None) + if (PyWeakref_GetRef(view_ref, &view) == 1) { Py_XDECREF(PyObject_CallMethod(view, "release", NULL)); + Py_DECREF(view); + } PyList_SetSlice(view_list, idx - 1, idx, NULL); } return 0; diff --git a/src/swig-0_28_7/iptc_wrap.cxx b/src/swig-0_28_7/iptc_wrap.cxx index cf4f9dcf..bf666508 100644 --- a/src/swig-0_28_7/iptc_wrap.cxx +++ b/src/swig-0_28_7/iptc_wrap.cxx @@ -5785,14 +5785,28 @@ static PyObject* set_value_from_py(Exiv2::Iptcdatum* datum, }; +#if PY_VERSION_HEX < 0x030d0000 +static int PyWeakref_GetRef(PyObject *ref, PyObject **pobj) { + *pobj = PyWeakref_GetObject(ref); + if (*pobj == Py_None) { + *pobj = NULL; + return 0; + } + Py_INCREF(*pobj); + return 1; +}; +#endif + + static void _process_list(PyObject* list, bool purge_only, Exiv2::IptcData::iterator* beg, Exiv2::IptcData::iterator* end) { PyObject* py_ptr = NULL; Iptcdatum_pointer* cpp_ptr = NULL; for (Py_ssize_t idx = PyList_Size(list); idx > 0; idx--) { - py_ptr = PyWeakref_GetObject(PyList_GetItem(list, idx-1)); - if (py_ptr == Py_None) + if (PyWeakref_GetRef(PyList_GetItem(list, idx-1), &py_ptr) == 1) + Py_DECREF(py_ptr); + else goto forget; if (purge_only) continue; diff --git a/src/swig-0_28_7/preview_wrap.cxx b/src/swig-0_28_7/preview_wrap.cxx index a31ea62c..a1046f0a 100644 --- a/src/swig-0_28_7/preview_wrap.cxx +++ b/src/swig-0_28_7/preview_wrap.cxx @@ -5983,6 +5983,19 @@ static int private_store_del(PyObject* py_self, const char* name) { }; +#if PY_VERSION_HEX < 0x030d0000 +static int PyWeakref_GetRef(PyObject *ref, PyObject **pobj) { + *pobj = PyWeakref_GetObject(ref); + if (*pobj == Py_None) { + *pobj = NULL; + return 0; + } + Py_INCREF(*pobj); + return 1; +}; +#endif + + static int store_view(PyObject* py_self, PyObject* view) { PyObject* view_list = private_store_get(py_self, "view_list"); if (!view_list) { @@ -6013,9 +6026,10 @@ static int release_views(PyObject* py_self) { PyObject* view = NULL; for (Py_ssize_t idx = PyList_Size(view_list); idx > 0; idx--) { view_ref = PyList_GetItem(view_list, idx - 1); - view = PyWeakref_GetObject(view_ref); - if (view != Py_None) + if (PyWeakref_GetRef(view_ref, &view) == 1) { Py_XDECREF(PyObject_CallMethod(view, "release", NULL)); + Py_DECREF(view); + } PyList_SetSlice(view_list, idx - 1, idx, NULL); } return 0; diff --git a/src/swig-0_28_7/types_wrap.cxx b/src/swig-0_28_7/types_wrap.cxx index c9eb2fc3..2f9061af 100644 --- a/src/swig-0_28_7/types_wrap.cxx +++ b/src/swig-0_28_7/types_wrap.cxx @@ -5278,6 +5278,19 @@ static int private_store_del(PyObject* py_self, const char* name) { }; +#if PY_VERSION_HEX < 0x030d0000 +static int PyWeakref_GetRef(PyObject *ref, PyObject **pobj) { + *pobj = PyWeakref_GetObject(ref); + if (*pobj == Py_None) { + *pobj = NULL; + return 0; + } + Py_INCREF(*pobj); + return 1; +}; +#endif + + static int store_view(PyObject* py_self, PyObject* view) { PyObject* view_list = private_store_get(py_self, "view_list"); if (!view_list) { @@ -5308,9 +5321,10 @@ static int release_views(PyObject* py_self) { PyObject* view = NULL; for (Py_ssize_t idx = PyList_Size(view_list); idx > 0; idx--) { view_ref = PyList_GetItem(view_list, idx - 1); - view = PyWeakref_GetObject(view_ref); - if (view != Py_None) + if (PyWeakref_GetRef(view_ref, &view) == 1) { Py_XDECREF(PyObject_CallMethod(view, "release", NULL)); + Py_DECREF(view); + } PyList_SetSlice(view_list, idx - 1, idx, NULL); } return 0; diff --git a/src/swig-0_28_7/value_wrap.cxx b/src/swig-0_28_7/value_wrap.cxx index 5f62815d..4387a531 100644 --- a/src/swig-0_28_7/value_wrap.cxx +++ b/src/swig-0_28_7/value_wrap.cxx @@ -6711,6 +6711,19 @@ static int private_store_del(PyObject* py_self, const char* name) { }; +#if PY_VERSION_HEX < 0x030d0000 +static int PyWeakref_GetRef(PyObject *ref, PyObject **pobj) { + *pobj = PyWeakref_GetObject(ref); + if (*pobj == Py_None) { + *pobj = NULL; + return 0; + } + Py_INCREF(*pobj); + return 1; +}; +#endif + + static int store_view(PyObject* py_self, PyObject* view) { PyObject* view_list = private_store_get(py_self, "view_list"); if (!view_list) { @@ -6741,9 +6754,10 @@ static int release_views(PyObject* py_self) { PyObject* view = NULL; for (Py_ssize_t idx = PyList_Size(view_list); idx > 0; idx--) { view_ref = PyList_GetItem(view_list, idx - 1); - view = PyWeakref_GetObject(view_ref); - if (view != Py_None) + if (PyWeakref_GetRef(view_ref, &view) == 1) { Py_XDECREF(PyObject_CallMethod(view, "release", NULL)); + Py_DECREF(view); + } PyList_SetSlice(view_list, idx - 1, idx, NULL); } return 0; diff --git a/src/swig-0_28_7/xmp_wrap.cxx b/src/swig-0_28_7/xmp_wrap.cxx index afa6c52f..438fc178 100644 --- a/src/swig-0_28_7/xmp_wrap.cxx +++ b/src/swig-0_28_7/xmp_wrap.cxx @@ -5788,14 +5788,28 @@ static PyObject* set_value_from_py(Exiv2::Xmpdatum* datum, }; +#if PY_VERSION_HEX < 0x030d0000 +static int PyWeakref_GetRef(PyObject *ref, PyObject **pobj) { + *pobj = PyWeakref_GetObject(ref); + if (*pobj == Py_None) { + *pobj = NULL; + return 0; + } + Py_INCREF(*pobj); + return 1; +}; +#endif + + static void _process_list(PyObject* list, bool purge_only, Exiv2::XmpData::iterator* beg, Exiv2::XmpData::iterator* end) { PyObject* py_ptr = NULL; Xmpdatum_pointer* cpp_ptr = NULL; for (Py_ssize_t idx = PyList_Size(list); idx > 0; idx--) { - py_ptr = PyWeakref_GetObject(PyList_GetItem(list, idx-1)); - if (py_ptr == Py_None) + if (PyWeakref_GetRef(PyList_GetItem(list, idx-1), &py_ptr) == 1) + Py_DECREF(py_ptr); + else goto forget; if (purge_only) continue; diff --git a/src/swig-0_28_8/basicio_wrap.cxx b/src/swig-0_28_8/basicio_wrap.cxx index 2b95ee76..61214318 100644 --- a/src/swig-0_28_8/basicio_wrap.cxx +++ b/src/swig-0_28_8/basicio_wrap.cxx @@ -4834,6 +4834,19 @@ static int private_store_del(PyObject* py_self, const char* name) { }; +#if PY_VERSION_HEX < 0x030d0000 +static int PyWeakref_GetRef(PyObject *ref, PyObject **pobj) { + *pobj = PyWeakref_GetObject(ref); + if (*pobj == Py_None) { + *pobj = NULL; + return 0; + } + Py_INCREF(*pobj); + return 1; +}; +#endif + + static int store_view(PyObject* py_self, PyObject* view) { PyObject* view_list = private_store_get(py_self, "view_list"); if (!view_list) { @@ -4864,9 +4877,10 @@ static int release_views(PyObject* py_self) { PyObject* view = NULL; for (Py_ssize_t idx = PyList_Size(view_list); idx > 0; idx--) { view_ref = PyList_GetItem(view_list, idx - 1); - view = PyWeakref_GetObject(view_ref); - if (view != Py_None) + if (PyWeakref_GetRef(view_ref, &view) == 1) { Py_XDECREF(PyObject_CallMethod(view, "release", NULL)); + Py_DECREF(view); + } PyList_SetSlice(view_list, idx - 1, idx, NULL); } return 0; diff --git a/src/swig-0_28_8/exif_wrap.cxx b/src/swig-0_28_8/exif_wrap.cxx index cce1eb3d..c51ce0a0 100644 --- a/src/swig-0_28_8/exif_wrap.cxx +++ b/src/swig-0_28_8/exif_wrap.cxx @@ -5793,14 +5793,28 @@ static PyObject* set_value_from_py(Exiv2::Exifdatum* datum, }; +#if PY_VERSION_HEX < 0x030d0000 +static int PyWeakref_GetRef(PyObject *ref, PyObject **pobj) { + *pobj = PyWeakref_GetObject(ref); + if (*pobj == Py_None) { + *pobj = NULL; + return 0; + } + Py_INCREF(*pobj); + return 1; +}; +#endif + + static void _process_list(PyObject* list, bool purge_only, Exiv2::ExifData::iterator* beg, Exiv2::ExifData::iterator* end) { PyObject* py_ptr = NULL; Exifdatum_pointer* cpp_ptr = NULL; for (Py_ssize_t idx = PyList_Size(list); idx > 0; idx--) { - py_ptr = PyWeakref_GetObject(PyList_GetItem(list, idx-1)); - if (py_ptr == Py_None) + if (PyWeakref_GetRef(PyList_GetItem(list, idx-1), &py_ptr) == 1) + Py_DECREF(py_ptr); + else goto forget; if (purge_only) continue; diff --git a/src/swig-0_28_8/image_wrap.cxx b/src/swig-0_28_8/image_wrap.cxx index a46c19ee..d4b2de6f 100644 --- a/src/swig-0_28_8/image_wrap.cxx +++ b/src/swig-0_28_8/image_wrap.cxx @@ -5040,6 +5040,19 @@ static int private_store_del(PyObject* py_self, const char* name) { }; +#if PY_VERSION_HEX < 0x030d0000 +static int PyWeakref_GetRef(PyObject *ref, PyObject **pobj) { + *pobj = PyWeakref_GetObject(ref); + if (*pobj == Py_None) { + *pobj = NULL; + return 0; + } + Py_INCREF(*pobj); + return 1; +}; +#endif + + static int store_view(PyObject* py_self, PyObject* view) { PyObject* view_list = private_store_get(py_self, "view_list"); if (!view_list) { @@ -5070,9 +5083,10 @@ static int release_views(PyObject* py_self) { PyObject* view = NULL; for (Py_ssize_t idx = PyList_Size(view_list); idx > 0; idx--) { view_ref = PyList_GetItem(view_list, idx - 1); - view = PyWeakref_GetObject(view_ref); - if (view != Py_None) + if (PyWeakref_GetRef(view_ref, &view) == 1) { Py_XDECREF(PyObject_CallMethod(view, "release", NULL)); + Py_DECREF(view); + } PyList_SetSlice(view_list, idx - 1, idx, NULL); } return 0; diff --git a/src/swig-0_28_8/iptc_wrap.cxx b/src/swig-0_28_8/iptc_wrap.cxx index cf4f9dcf..bf666508 100644 --- a/src/swig-0_28_8/iptc_wrap.cxx +++ b/src/swig-0_28_8/iptc_wrap.cxx @@ -5785,14 +5785,28 @@ static PyObject* set_value_from_py(Exiv2::Iptcdatum* datum, }; +#if PY_VERSION_HEX < 0x030d0000 +static int PyWeakref_GetRef(PyObject *ref, PyObject **pobj) { + *pobj = PyWeakref_GetObject(ref); + if (*pobj == Py_None) { + *pobj = NULL; + return 0; + } + Py_INCREF(*pobj); + return 1; +}; +#endif + + static void _process_list(PyObject* list, bool purge_only, Exiv2::IptcData::iterator* beg, Exiv2::IptcData::iterator* end) { PyObject* py_ptr = NULL; Iptcdatum_pointer* cpp_ptr = NULL; for (Py_ssize_t idx = PyList_Size(list); idx > 0; idx--) { - py_ptr = PyWeakref_GetObject(PyList_GetItem(list, idx-1)); - if (py_ptr == Py_None) + if (PyWeakref_GetRef(PyList_GetItem(list, idx-1), &py_ptr) == 1) + Py_DECREF(py_ptr); + else goto forget; if (purge_only) continue; diff --git a/src/swig-0_28_8/preview_wrap.cxx b/src/swig-0_28_8/preview_wrap.cxx index a31ea62c..a1046f0a 100644 --- a/src/swig-0_28_8/preview_wrap.cxx +++ b/src/swig-0_28_8/preview_wrap.cxx @@ -5983,6 +5983,19 @@ static int private_store_del(PyObject* py_self, const char* name) { }; +#if PY_VERSION_HEX < 0x030d0000 +static int PyWeakref_GetRef(PyObject *ref, PyObject **pobj) { + *pobj = PyWeakref_GetObject(ref); + if (*pobj == Py_None) { + *pobj = NULL; + return 0; + } + Py_INCREF(*pobj); + return 1; +}; +#endif + + static int store_view(PyObject* py_self, PyObject* view) { PyObject* view_list = private_store_get(py_self, "view_list"); if (!view_list) { @@ -6013,9 +6026,10 @@ static int release_views(PyObject* py_self) { PyObject* view = NULL; for (Py_ssize_t idx = PyList_Size(view_list); idx > 0; idx--) { view_ref = PyList_GetItem(view_list, idx - 1); - view = PyWeakref_GetObject(view_ref); - if (view != Py_None) + if (PyWeakref_GetRef(view_ref, &view) == 1) { Py_XDECREF(PyObject_CallMethod(view, "release", NULL)); + Py_DECREF(view); + } PyList_SetSlice(view_list, idx - 1, idx, NULL); } return 0; diff --git a/src/swig-0_28_8/types_wrap.cxx b/src/swig-0_28_8/types_wrap.cxx index c9eb2fc3..2f9061af 100644 --- a/src/swig-0_28_8/types_wrap.cxx +++ b/src/swig-0_28_8/types_wrap.cxx @@ -5278,6 +5278,19 @@ static int private_store_del(PyObject* py_self, const char* name) { }; +#if PY_VERSION_HEX < 0x030d0000 +static int PyWeakref_GetRef(PyObject *ref, PyObject **pobj) { + *pobj = PyWeakref_GetObject(ref); + if (*pobj == Py_None) { + *pobj = NULL; + return 0; + } + Py_INCREF(*pobj); + return 1; +}; +#endif + + static int store_view(PyObject* py_self, PyObject* view) { PyObject* view_list = private_store_get(py_self, "view_list"); if (!view_list) { @@ -5308,9 +5321,10 @@ static int release_views(PyObject* py_self) { PyObject* view = NULL; for (Py_ssize_t idx = PyList_Size(view_list); idx > 0; idx--) { view_ref = PyList_GetItem(view_list, idx - 1); - view = PyWeakref_GetObject(view_ref); - if (view != Py_None) + if (PyWeakref_GetRef(view_ref, &view) == 1) { Py_XDECREF(PyObject_CallMethod(view, "release", NULL)); + Py_DECREF(view); + } PyList_SetSlice(view_list, idx - 1, idx, NULL); } return 0; diff --git a/src/swig-0_28_8/value_wrap.cxx b/src/swig-0_28_8/value_wrap.cxx index b19e620b..bea23668 100644 --- a/src/swig-0_28_8/value_wrap.cxx +++ b/src/swig-0_28_8/value_wrap.cxx @@ -6697,6 +6697,19 @@ static int private_store_del(PyObject* py_self, const char* name) { }; +#if PY_VERSION_HEX < 0x030d0000 +static int PyWeakref_GetRef(PyObject *ref, PyObject **pobj) { + *pobj = PyWeakref_GetObject(ref); + if (*pobj == Py_None) { + *pobj = NULL; + return 0; + } + Py_INCREF(*pobj); + return 1; +}; +#endif + + static int store_view(PyObject* py_self, PyObject* view) { PyObject* view_list = private_store_get(py_self, "view_list"); if (!view_list) { @@ -6727,9 +6740,10 @@ static int release_views(PyObject* py_self) { PyObject* view = NULL; for (Py_ssize_t idx = PyList_Size(view_list); idx > 0; idx--) { view_ref = PyList_GetItem(view_list, idx - 1); - view = PyWeakref_GetObject(view_ref); - if (view != Py_None) + if (PyWeakref_GetRef(view_ref, &view) == 1) { Py_XDECREF(PyObject_CallMethod(view, "release", NULL)); + Py_DECREF(view); + } PyList_SetSlice(view_list, idx - 1, idx, NULL); } return 0; diff --git a/src/swig-0_28_8/xmp_wrap.cxx b/src/swig-0_28_8/xmp_wrap.cxx index afa6c52f..438fc178 100644 --- a/src/swig-0_28_8/xmp_wrap.cxx +++ b/src/swig-0_28_8/xmp_wrap.cxx @@ -5788,14 +5788,28 @@ static PyObject* set_value_from_py(Exiv2::Xmpdatum* datum, }; +#if PY_VERSION_HEX < 0x030d0000 +static int PyWeakref_GetRef(PyObject *ref, PyObject **pobj) { + *pobj = PyWeakref_GetObject(ref); + if (*pobj == Py_None) { + *pobj = NULL; + return 0; + } + Py_INCREF(*pobj); + return 1; +}; +#endif + + static void _process_list(PyObject* list, bool purge_only, Exiv2::XmpData::iterator* beg, Exiv2::XmpData::iterator* end) { PyObject* py_ptr = NULL; Xmpdatum_pointer* cpp_ptr = NULL; for (Py_ssize_t idx = PyList_Size(list); idx > 0; idx--) { - py_ptr = PyWeakref_GetObject(PyList_GetItem(list, idx-1)); - if (py_ptr == Py_None) + if (PyWeakref_GetRef(PyList_GetItem(list, idx-1), &py_ptr) == 1) + Py_DECREF(py_ptr); + else goto forget; if (purge_only) continue; From c26c37fb5b8e813aaf84982d632bfe039b0870cb Mon Sep 17 00:00:00 2001 From: Jim Easterbrook Date: Mon, 22 Jun 2026 11:57:31 +0100 Subject: [PATCH 05/13] Check result of release_views() calls This calls PyWeakref_GetRef, which since Python 3.13 can set an exception if there is an error. --- src/interface/basicio.i | 6 +- src/interface/image.i | 6 +- src/interface/shared/private_data.i | 4 +- src/interface/types.i | 12 ++- src/interface/value.i | 7 +- src/swig-0_27_7/basicio_wrap.cxx | 92 ++++++++++++---- src/swig-0_27_7/image_wrap.cxx | 160 +++++++++++++++++++++------- src/swig-0_27_7/preview_wrap.cxx | 4 +- src/swig-0_27_7/types_wrap.cxx | 19 +++- src/swig-0_27_7/value_wrap.cxx | 24 ++++- src/swig-0_28_7/basicio_wrap.cxx | 100 ++++++++++++----- src/swig-0_28_7/image_wrap.cxx | 160 +++++++++++++++++++++------- src/swig-0_28_7/preview_wrap.cxx | 4 +- src/swig-0_28_7/types_wrap.cxx | 19 +++- src/swig-0_28_7/value_wrap.cxx | 24 ++++- src/swig-0_28_8/basicio_wrap.cxx | 100 ++++++++++++----- src/swig-0_28_8/image_wrap.cxx | 160 +++++++++++++++++++++------- src/swig-0_28_8/preview_wrap.cxx | 4 +- src/swig-0_28_8/types_wrap.cxx | 19 +++- src/swig-0_28_8/value_wrap.cxx | 34 ++++-- 20 files changed, 723 insertions(+), 235 deletions(-) diff --git a/src/interface/basicio.i b/src/interface/basicio.i index 66ae1c61..337fd93c 100644 --- a/src/interface/basicio.i +++ b/src/interface/basicio.i @@ -1,6 +1,6 @@ // python-exiv2 - Python interface to libexiv2 // http://github.com/jim-easterbrook/python-exiv2 -// Copyright (C) 2022-25 Jim Easterbrook jim@jim-easterbrook.me.uk +// Copyright (C) 2022-26 Jim Easterbrook jim@jim-easterbrook.me.uk // // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by @@ -166,7 +166,9 @@ RETURN_VIEW(Exiv2::byte* mmap, $1 ? arg1->size() : 0, %} %typemap(check, fragment="memoryview_funcs") Exiv2::BasicIo* self { %#ifdef RELEASE_VIEWS_$symname - release_views(self); + if (release_views(self) < 0) { + SWIG_fail; + } %#endif } diff --git a/src/interface/image.i b/src/interface/image.i index ebd13ad3..c7e796dc 100644 --- a/src/interface/image.i +++ b/src/interface/image.i @@ -1,6 +1,6 @@ // python-exiv2 - Python interface to libexiv2 // http://github.com/jim-easterbrook/python-exiv2 -// Copyright (C) 2021-25 Jim Easterbrook jim@jim-easterbrook.me.uk +// Copyright (C) 2021-26 Jim Easterbrook jim@jim-easterbrook.me.uk // // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by @@ -108,7 +108,9 @@ DEFINE_VIEW_CALLBACK(Exiv2::Image, release_ptr(&self->io());) %} %typemap(check, fragment="memoryview_funcs") Exiv2::Image* self { %#ifdef RELEASE_VIEWS_$symname - release_views(self); + if (release_views(self) < 0) { + SWIG_fail; + } %#endif } diff --git a/src/interface/shared/private_data.i b/src/interface/shared/private_data.i index 54c934f1..50696934 100644 --- a/src/interface/shared/private_data.i +++ b/src/interface/shared/private_data.i @@ -108,7 +108,9 @@ static int release_views(PyObject* py_self) { PyObject* view = NULL; for (Py_ssize_t idx = PyList_Size(view_list); idx > 0; idx--) { view_ref = PyList_GetItem(view_list, idx - 1); - if (PyWeakref_GetRef(view_ref, &view) == 1) { + if (PyWeakref_GetRef(view_ref, &view) < 0) + return -1; + if (view) { Py_XDECREF(PyObject_CallMethod(view, "release", NULL)); Py_DECREF(view); } diff --git a/src/interface/types.i b/src/interface/types.i index 739afb58..92826c2d 100644 --- a/src/interface/types.i +++ b/src/interface/types.i @@ -1,6 +1,6 @@ // python-exiv2 - Python interface to libexiv2 // http://github.com/jim-easterbrook/python-exiv2 -// Copyright (C) 2021-25 Jim Easterbrook jim@jim-easterbrook.me.uk +// Copyright (C) 2021-26 Jim Easterbrook jim@jim-easterbrook.me.uk // // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by @@ -177,12 +177,18 @@ DEFINE_VIEW_CALLBACK(Exiv2::DataBuf,) // Release memoryview when other functions are called %typemap(ret, fragment="memoryview_funcs") (void alloc), (void reset), (void resize) %{ - release_views(self); + if (release_views(self) < 0) { + Py_DECREF($result); + SWIG_fail; + } %} #if EXIV2_VERSION_HEX < 0x001c0000 %typemap(ret, fragment="memoryview_funcs") (void free) %{ - release_views(self); + if (release_views(self) < 0) { + Py_DECREF($result); + SWIG_fail; + } %} #endif diff --git a/src/interface/value.i b/src/interface/value.i index 2b86c680..4ba8027c 100644 --- a/src/interface/value.i +++ b/src/interface/value.i @@ -1,6 +1,6 @@ // python-exiv2 - Python interface to libexiv2 // http://github.com/jim-easterbrook/python-exiv2 -// Copyright (C) 2021-25 Jim Easterbrook jim@jim-easterbrook.me.uk +// Copyright (C) 2021-26 Jim Easterbrook jim@jim-easterbrook.me.uk // // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by @@ -446,7 +446,10 @@ RETURN_VIEW(const char* data, arg1->value_.size(), PyBUF_READ, class##::data) DEFINE_VIEW_CALLBACK(class,) // Release memoryviews when new data is read %typemap(ret, fragment="memoryview_funcs") (int class::read) %{ - release_views(self); + if (release_views(self) < 0) { + Py_DECREF($result); + SWIG_fail; + } %} %enddef // RAW_STRING_DATA RAW_STRING_DATA(Exiv2::StringValueBase) diff --git a/src/swig-0_27_7/basicio_wrap.cxx b/src/swig-0_27_7/basicio_wrap.cxx index cfd7f2f6..0b34a26a 100644 --- a/src/swig-0_27_7/basicio_wrap.cxx +++ b/src/swig-0_27_7/basicio_wrap.cxx @@ -4878,7 +4878,9 @@ static int release_views(PyObject* py_self) { PyObject* view = NULL; for (Py_ssize_t idx = PyList_Size(view_list); idx > 0; idx--) { view_ref = PyList_GetItem(view_list, idx - 1); - if (PyWeakref_GetRef(view_ref, &view) == 1) { + if (PyWeakref_GetRef(view_ref, &view) < 0) + return -1; + if (view) { Py_XDECREF(PyObject_CallMethod(view, "release", NULL)); Py_DECREF(view); } @@ -5227,7 +5229,9 @@ SWIGINTERN PyObject *_wrap_delete_BasicIo(PyObject *self, PyObject *args) { arg1 = reinterpret_cast< Exiv2::BasicIo * >(argp1); { #ifdef RELEASE_VIEWS_delete_BasicIo - release_views(self); + if (release_views(self) < 0) { + SWIG_fail; + } #endif } { @@ -5261,7 +5265,9 @@ SWIGINTERN PyObject *_wrap_BasicIo_open(PyObject *self, PyObject *args) { arg1 = reinterpret_cast< Exiv2::BasicIo * >(argp1); { #ifdef RELEASE_VIEWS_BasicIo_open - release_views(self); + if (release_views(self) < 0) { + SWIG_fail; + } #endif } { @@ -5299,7 +5305,9 @@ SWIGINTERN PyObject *_wrap_BasicIo_close(PyObject *self, PyObject *args) { arg1 = reinterpret_cast< Exiv2::BasicIo * >(argp1); { #ifdef RELEASE_VIEWS_BasicIo_close - release_views(self); + if (release_views(self) < 0) { + SWIG_fail; + } #endif } { @@ -5355,7 +5363,9 @@ SWIGINTERN PyObject *_wrap_BasicIo_write__SWIG_0(PyObject *self, Py_ssize_t nobj } { #ifdef RELEASE_VIEWS_BasicIo_write - release_views(self); + if (release_views(self) < 0) { + SWIG_fail; + } #endif } { @@ -5411,7 +5421,9 @@ SWIGINTERN PyObject *_wrap_BasicIo_write__SWIG_1(PyObject *self, Py_ssize_t nobj arg2 = reinterpret_cast< Exiv2::BasicIo * >(argp2); { #ifdef RELEASE_VIEWS_BasicIo_write - release_views(self); + if (release_views(self) < 0) { + SWIG_fail; + } #endif } { @@ -5496,7 +5508,9 @@ SWIGINTERN PyObject *_wrap_BasicIo_putb(PyObject *self, PyObject *args) { arg2 = static_cast< Exiv2::byte >(val2); { #ifdef RELEASE_VIEWS_BasicIo_putb - release_views(self); + if (release_views(self) < 0) { + SWIG_fail; + } #endif } { @@ -5539,7 +5553,9 @@ SWIGINTERN PyObject *_wrap_BasicIo_read__SWIG_0(PyObject *self, Py_ssize_t nobjs arg2 = static_cast< long >(val2); { #ifdef RELEASE_VIEWS_BasicIo_read - release_views(self); + if (release_views(self) < 0) { + SWIG_fail; + } #endif } { @@ -5595,7 +5611,9 @@ SWIGINTERN PyObject *_wrap_BasicIo_read__SWIG_1(PyObject *self, Py_ssize_t nobjs } { #ifdef RELEASE_VIEWS_BasicIo_read - release_views(self); + if (release_views(self) < 0) { + SWIG_fail; + } #endif } { @@ -5681,7 +5699,9 @@ SWIGINTERN PyObject *_wrap_BasicIo_getb(PyObject *self, PyObject *args) { arg1 = reinterpret_cast< Exiv2::BasicIo * >(argp1); { #ifdef RELEASE_VIEWS_BasicIo_getb - release_views(self); + if (release_views(self) < 0) { + SWIG_fail; + } #endif } { @@ -5728,7 +5748,9 @@ SWIGINTERN PyObject *_wrap_BasicIo_transfer(PyObject *self, PyObject *args) { arg2 = reinterpret_cast< Exiv2::BasicIo * >(argp2); { #ifdef RELEASE_VIEWS_BasicIo_transfer - release_views(self); + if (release_views(self) < 0) { + SWIG_fail; + } #endif } { @@ -5789,7 +5811,9 @@ SWIGINTERN PyObject *_wrap_BasicIo_seek(PyObject *self, PyObject *args) { } { #ifdef RELEASE_VIEWS_BasicIo_seek - release_views(self); + if (release_views(self) < 0) { + SWIG_fail; + } #endif } { @@ -5842,7 +5866,9 @@ SWIGINTERN PyObject *_wrap_BasicIo_mmap(PyObject *self, PyObject *args) { } { #ifdef RELEASE_VIEWS_BasicIo_mmap - release_views(self); + if (release_views(self) < 0) { + SWIG_fail; + } #endif } { @@ -5887,7 +5913,9 @@ SWIGINTERN PyObject *_wrap_BasicIo_munmap(PyObject *self, PyObject *args) { arg1 = reinterpret_cast< Exiv2::BasicIo * >(argp1); { #ifdef RELEASE_VIEWS_BasicIo_munmap - release_views(self); + if (release_views(self) < 0) { + SWIG_fail; + } #endif } { @@ -5925,7 +5953,9 @@ SWIGINTERN PyObject *_wrap_BasicIo_tell(PyObject *self, PyObject *args) { arg1 = reinterpret_cast< Exiv2::BasicIo * >(argp1); { #ifdef RELEASE_VIEWS_BasicIo_tell - release_views(self); + if (release_views(self) < 0) { + SWIG_fail; + } #endif } { @@ -5960,7 +5990,9 @@ SWIGINTERN PyObject *_wrap_BasicIo_size(PyObject *self, PyObject *args) { arg1 = reinterpret_cast< Exiv2::BasicIo * >(argp1); { #ifdef RELEASE_VIEWS_BasicIo_size - release_views(self); + if (release_views(self) < 0) { + SWIG_fail; + } #endif } { @@ -5994,7 +6026,9 @@ SWIGINTERN PyObject *_wrap_BasicIo_isopen(PyObject *self, PyObject *args) { arg1 = reinterpret_cast< Exiv2::BasicIo * >(argp1); { #ifdef RELEASE_VIEWS_BasicIo_isopen - release_views(self); + if (release_views(self) < 0) { + SWIG_fail; + } #endif } result = (bool)((Exiv2::BasicIo const *)arg1)->isopen(); @@ -6020,7 +6054,9 @@ SWIGINTERN PyObject *_wrap_BasicIo_error(PyObject *self, PyObject *args) { arg1 = reinterpret_cast< Exiv2::BasicIo * >(argp1); { #ifdef RELEASE_VIEWS_BasicIo_error - release_views(self); + if (release_views(self) < 0) { + SWIG_fail; + } #endif } result = (int)((Exiv2::BasicIo const *)arg1)->error(); @@ -6046,7 +6082,9 @@ SWIGINTERN PyObject *_wrap_BasicIo_eof(PyObject *self, PyObject *args) { arg1 = reinterpret_cast< Exiv2::BasicIo * >(argp1); { #ifdef RELEASE_VIEWS_BasicIo_eof - release_views(self); + if (release_views(self) < 0) { + SWIG_fail; + } #endif } { @@ -6081,7 +6119,9 @@ SWIGINTERN PyObject *_wrap_BasicIo_path(PyObject *self, PyObject *args) { arg1 = reinterpret_cast< Exiv2::BasicIo * >(argp1); { #ifdef RELEASE_VIEWS_BasicIo_path - release_views(self); + if (release_views(self) < 0) { + SWIG_fail; + } #endif } result = ((Exiv2::BasicIo const *)arg1)->path(); @@ -6116,7 +6156,9 @@ SWIGINTERN PyObject *_wrap_BasicIo_ioType(PyObject *self, PyObject *args) { arg1 = reinterpret_cast< Exiv2::BasicIo * >(argp1); { #ifdef RELEASE_VIEWS_BasicIo_ioType - release_views(self); + if (release_views(self) < 0) { + SWIG_fail; + } #endif } result = (char *)Exiv2_BasicIo_ioType(arg1); @@ -6156,7 +6198,9 @@ SWIGINTERN PyObject *_wrap_BasicIo_data(PyObject *self, PyObject *args) { } { #ifdef RELEASE_VIEWS_BasicIo_data - release_views(self); + if (release_views(self) < 0) { + SWIG_fail; + } #endif } { @@ -6204,7 +6248,9 @@ SWIGINTERN PyObject *_wrap_BasicIo__view_deleted_cb(PyObject *self, PyObject *ar arg2 = swig_obj[0]; { #ifdef RELEASE_VIEWS_BasicIo__view_deleted_cb - release_views(self); + if (release_views(self) < 0) { + SWIG_fail; + } #endif } { diff --git a/src/swig-0_27_7/image_wrap.cxx b/src/swig-0_27_7/image_wrap.cxx index 11311050..5029898e 100644 --- a/src/swig-0_27_7/image_wrap.cxx +++ b/src/swig-0_27_7/image_wrap.cxx @@ -5096,7 +5096,9 @@ static int release_views(PyObject* py_self) { PyObject* view = NULL; for (Py_ssize_t idx = PyList_Size(view_list); idx > 0; idx--) { view_ref = PyList_GetItem(view_list, idx - 1); - if (PyWeakref_GetRef(view_ref, &view) == 1) { + if (PyWeakref_GetRef(view_ref, &view) < 0) + return -1; + if (view) { Py_XDECREF(PyObject_CallMethod(view, "release", NULL)); Py_DECREF(view); } @@ -5395,7 +5397,9 @@ SWIGINTERN PyObject *_wrap_delete_Image(PyObject *self, PyObject *args) { arg1 = reinterpret_cast< Exiv2::Image * >(argp1); { #ifdef RELEASE_VIEWS_delete_Image - release_views(self); + if (release_views(self) < 0) { + SWIG_fail; + } #endif } { @@ -5428,7 +5432,9 @@ SWIGINTERN PyObject *_wrap_Image_readMetadata(PyObject *self, PyObject *args) { arg1 = reinterpret_cast< Exiv2::Image * >(argp1); { #ifdef RELEASE_VIEWS_Image_readMetadata - release_views(self); + if (release_views(self) < 0) { + SWIG_fail; + } #endif } { @@ -5465,7 +5471,9 @@ SWIGINTERN PyObject *_wrap_Image_writeMetadata(PyObject *self, PyObject *args) { arg1 = reinterpret_cast< Exiv2::Image * >(argp1); { #ifdef RELEASE_VIEWS_Image_writeMetadata - release_views(self); + if (release_views(self) < 0) { + SWIG_fail; + } #endif } { @@ -5518,7 +5526,9 @@ SWIGINTERN PyObject *_wrap_Image_setExifData(PyObject *self, PyObject *args) { arg2 = reinterpret_cast< Exiv2::ExifData * >(argp2); { #ifdef RELEASE_VIEWS_Image_setExifData - release_views(self); + if (release_views(self) < 0) { + SWIG_fail; + } #endif } { @@ -5551,7 +5561,9 @@ SWIGINTERN PyObject *_wrap_Image_clearExifData(PyObject *self, PyObject *args) { arg1 = reinterpret_cast< Exiv2::Image * >(argp1); { #ifdef RELEASE_VIEWS_Image_clearExifData - release_views(self); + if (release_views(self) < 0) { + SWIG_fail; + } #endif } { @@ -5597,7 +5609,9 @@ SWIGINTERN PyObject *_wrap_Image_setIptcData(PyObject *self, PyObject *args) { arg2 = reinterpret_cast< Exiv2::IptcData * >(argp2); { #ifdef RELEASE_VIEWS_Image_setIptcData - release_views(self); + if (release_views(self) < 0) { + SWIG_fail; + } #endif } { @@ -5630,7 +5644,9 @@ SWIGINTERN PyObject *_wrap_Image_clearIptcData(PyObject *self, PyObject *args) { arg1 = reinterpret_cast< Exiv2::Image * >(argp1); { #ifdef RELEASE_VIEWS_Image_clearIptcData - release_views(self); + if (release_views(self) < 0) { + SWIG_fail; + } #endif } { @@ -5678,7 +5694,9 @@ SWIGINTERN PyObject *_wrap_Image_setXmpPacket(PyObject *self, PyObject *args) { } { #ifdef RELEASE_VIEWS_Image_setXmpPacket - release_views(self); + if (release_views(self) < 0) { + SWIG_fail; + } #endif } { @@ -5713,7 +5731,9 @@ SWIGINTERN PyObject *_wrap_Image_clearXmpPacket(PyObject *self, PyObject *args) arg1 = reinterpret_cast< Exiv2::Image * >(argp1); { #ifdef RELEASE_VIEWS_Image_clearXmpPacket - release_views(self); + if (release_views(self) < 0) { + SWIG_fail; + } #endif } { @@ -5759,7 +5779,9 @@ SWIGINTERN PyObject *_wrap_Image_setXmpData(PyObject *self, PyObject *args) { arg2 = reinterpret_cast< Exiv2::XmpData * >(argp2); { #ifdef RELEASE_VIEWS_Image_setXmpData - release_views(self); + if (release_views(self) < 0) { + SWIG_fail; + } #endif } { @@ -5792,7 +5814,9 @@ SWIGINTERN PyObject *_wrap_Image_clearXmpData(PyObject *self, PyObject *args) { arg1 = reinterpret_cast< Exiv2::Image * >(argp1); { #ifdef RELEASE_VIEWS_Image_clearXmpData - release_views(self); + if (release_views(self) < 0) { + SWIG_fail; + } #endif } { @@ -5840,7 +5864,9 @@ SWIGINTERN PyObject *_wrap_Image_setComment(PyObject *self, PyObject *args) { } { #ifdef RELEASE_VIEWS_Image_setComment - release_views(self); + if (release_views(self) < 0) { + SWIG_fail; + } #endif } { @@ -5875,7 +5901,9 @@ SWIGINTERN PyObject *_wrap_Image_clearComment(PyObject *self, PyObject *args) { arg1 = reinterpret_cast< Exiv2::Image * >(argp1); { #ifdef RELEASE_VIEWS_Image_clearComment - release_views(self); + if (release_views(self) < 0) { + SWIG_fail; + } #endif } { @@ -5933,7 +5961,9 @@ SWIGINTERN PyObject *_wrap_Image_setIccProfile(PyObject *self, PyObject *args) { } { #ifdef RELEASE_VIEWS_Image_setIccProfile - release_views(self); + if (release_views(self) < 0) { + SWIG_fail; + } #endif } { @@ -5966,7 +5996,9 @@ SWIGINTERN PyObject *_wrap_Image_clearIccProfile(PyObject *self, PyObject *args) arg1 = reinterpret_cast< Exiv2::Image * >(argp1); { #ifdef RELEASE_VIEWS_Image_clearIccProfile - release_views(self); + if (release_views(self) < 0) { + SWIG_fail; + } #endif } { @@ -6000,7 +6032,9 @@ SWIGINTERN PyObject *_wrap_Image_iccProfileDefined(PyObject *self, PyObject *arg arg1 = reinterpret_cast< Exiv2::Image * >(argp1); { #ifdef RELEASE_VIEWS_Image_iccProfileDefined - release_views(self); + if (release_views(self) < 0) { + SWIG_fail; + } #endif } { @@ -6034,7 +6068,9 @@ SWIGINTERN PyObject *_wrap_Image_iccProfile(PyObject *self, PyObject *args) { arg1 = reinterpret_cast< Exiv2::Image * >(argp1); { #ifdef RELEASE_VIEWS_Image_iccProfile - release_views(self); + if (release_views(self) < 0) { + SWIG_fail; + } #endif } { @@ -6086,7 +6122,9 @@ SWIGINTERN PyObject *_wrap_Image_setMetadata(PyObject *self, PyObject *args) { arg2 = reinterpret_cast< Exiv2::Image * >(argp2); { #ifdef RELEASE_VIEWS_Image_setMetadata - release_views(self); + if (release_views(self) < 0) { + SWIG_fail; + } #endif } { @@ -6119,7 +6157,9 @@ SWIGINTERN PyObject *_wrap_Image_clearMetadata(PyObject *self, PyObject *args) { arg1 = reinterpret_cast< Exiv2::Image * >(argp1); { #ifdef RELEASE_VIEWS_Image_clearMetadata - release_views(self); + if (release_views(self) < 0) { + SWIG_fail; + } #endif } { @@ -6153,7 +6193,9 @@ SWIGINTERN PyObject *_wrap_Image_exifData(PyObject *self, PyObject *args) { arg1 = reinterpret_cast< Exiv2::Image * >(argp1); { #ifdef RELEASE_VIEWS_Image_exifData - release_views(self); + if (release_views(self) < 0) { + SWIG_fail; + } #endif } { @@ -6193,7 +6235,9 @@ SWIGINTERN PyObject *_wrap_Image_iptcData(PyObject *self, PyObject *args) { arg1 = reinterpret_cast< Exiv2::Image * >(argp1); { #ifdef RELEASE_VIEWS_Image_iptcData - release_views(self); + if (release_views(self) < 0) { + SWIG_fail; + } #endif } { @@ -6233,7 +6277,9 @@ SWIGINTERN PyObject *_wrap_Image_xmpData(PyObject *self, PyObject *args) { arg1 = reinterpret_cast< Exiv2::Image * >(argp1); { #ifdef RELEASE_VIEWS_Image_xmpData - release_views(self); + if (release_views(self) < 0) { + SWIG_fail; + } #endif } { @@ -6273,7 +6319,9 @@ SWIGINTERN PyObject *_wrap_Image_xmpPacket(PyObject *self, PyObject *args) { arg1 = reinterpret_cast< Exiv2::Image * >(argp1); { #ifdef RELEASE_VIEWS_Image_xmpPacket - release_views(self); + if (release_views(self) < 0) { + SWIG_fail; + } #endif } { @@ -6314,7 +6362,9 @@ SWIGINTERN PyObject *_wrap_Image_writeXmpFromPacket__SWIG_0(PyObject *self, Py_s arg2 = static_cast< bool >(val2); { #ifdef RELEASE_VIEWS_Image_writeXmpFromPacket - release_views(self); + if (release_views(self) < 0) { + SWIG_fail; + } #endif } { @@ -6362,7 +6412,9 @@ SWIGINTERN PyObject *_wrap_Image_setByteOrder(PyObject *self, PyObject *args) { } { #ifdef RELEASE_VIEWS_Image_setByteOrder - release_views(self); + if (release_views(self) < 0) { + SWIG_fail; + } #endif } { @@ -6396,7 +6448,9 @@ SWIGINTERN PyObject *_wrap_Image_byteOrder(PyObject *self, PyObject *args) { arg1 = reinterpret_cast< Exiv2::Image * >(argp1); { #ifdef RELEASE_VIEWS_Image_byteOrder - release_views(self); + if (release_views(self) < 0) { + SWIG_fail; + } #endif } { @@ -6434,7 +6488,9 @@ SWIGINTERN PyObject *_wrap_Image_good(PyObject *self, PyObject *args) { arg1 = reinterpret_cast< Exiv2::Image * >(argp1); { #ifdef RELEASE_VIEWS_Image_good - release_views(self); + if (release_views(self) < 0) { + SWIG_fail; + } #endif } { @@ -6468,7 +6524,9 @@ SWIGINTERN PyObject *_wrap_Image_mimeType(PyObject *self, PyObject *args) { arg1 = reinterpret_cast< Exiv2::Image * >(argp1); { #ifdef RELEASE_VIEWS_Image_mimeType - release_views(self); + if (release_views(self) < 0) { + SWIG_fail; + } #endif } { @@ -6502,7 +6560,9 @@ SWIGINTERN PyObject *_wrap_Image_pixelWidth(PyObject *self, PyObject *args) { arg1 = reinterpret_cast< Exiv2::Image * >(argp1); { #ifdef RELEASE_VIEWS_Image_pixelWidth - release_views(self); + if (release_views(self) < 0) { + SWIG_fail; + } #endif } { @@ -6536,7 +6596,9 @@ SWIGINTERN PyObject *_wrap_Image_pixelHeight(PyObject *self, PyObject *args) { arg1 = reinterpret_cast< Exiv2::Image * >(argp1); { #ifdef RELEASE_VIEWS_Image_pixelHeight - release_views(self); + if (release_views(self) < 0) { + SWIG_fail; + } #endif } { @@ -6570,7 +6632,9 @@ SWIGINTERN PyObject *_wrap_Image_comment(PyObject *self, PyObject *args) { arg1 = reinterpret_cast< Exiv2::Image * >(argp1); { #ifdef RELEASE_VIEWS_Image_comment - release_views(self); + if (release_views(self) < 0) { + SWIG_fail; + } #endif } { @@ -6604,7 +6668,9 @@ SWIGINTERN PyObject *_wrap_Image_io(PyObject *self, PyObject *args) { arg1 = reinterpret_cast< Exiv2::Image * >(argp1); { #ifdef RELEASE_VIEWS_Image_io - release_views(self); + if (release_views(self) < 0) { + SWIG_fail; + } #endif } { @@ -6659,7 +6725,9 @@ SWIGINTERN PyObject *_wrap_Image_checkMode(PyObject *self, PyObject *args) { } { #ifdef RELEASE_VIEWS_Image_checkMode - release_views(self); + if (release_views(self) < 0) { + SWIG_fail; + } #endif } { @@ -6712,7 +6780,9 @@ SWIGINTERN PyObject *_wrap_Image_supportsMetadata(PyObject *self, PyObject *args } { #ifdef RELEASE_VIEWS_Image_supportsMetadata - release_views(self); + if (release_views(self) < 0) { + SWIG_fail; + } #endif } { @@ -6747,7 +6817,9 @@ SWIGINTERN PyObject *_wrap_Image_writeXmpFromPacket__SWIG_1(PyObject *self, Py_s arg1 = reinterpret_cast< Exiv2::Image * >(argp1); { #ifdef RELEASE_VIEWS_Image_writeXmpFromPacket - release_views(self); + if (release_views(self) < 0) { + SWIG_fail; + } #endif } { @@ -6831,7 +6903,9 @@ SWIGINTERN PyObject *_wrap_Image_setTypeSupported(PyObject *self, PyObject *args arg3 = static_cast< uint16_t >(val3); { #ifdef RELEASE_VIEWS_Image_setTypeSupported - release_views(self); + if (release_views(self) < 0) { + SWIG_fail; + } #endif } { @@ -6865,7 +6939,9 @@ SWIGINTERN PyObject *_wrap_Image_imageType(PyObject *self, PyObject *args) { arg1 = reinterpret_cast< Exiv2::Image * >(argp1); { #ifdef RELEASE_VIEWS_Image_imageType - release_views(self); + if (release_views(self) < 0) { + SWIG_fail; + } #endif } { @@ -6907,7 +6983,9 @@ SWIGINTERN PyObject *_wrap_Image_data(PyObject *self, PyObject *args) { arg1 = reinterpret_cast< Exiv2::Image * >(argp1); { #ifdef RELEASE_VIEWS_Image_data - release_views(self); + if (release_views(self) < 0) { + SWIG_fail; + } #endif } { @@ -6945,7 +7023,9 @@ SWIGINTERN PyObject *_wrap_Image__view_deleted_cb(PyObject *self, PyObject *args arg2 = swig_obj[0]; { #ifdef RELEASE_VIEWS_Image__view_deleted_cb - release_views(self); + if (release_views(self) < 0) { + SWIG_fail; + } #endif } { diff --git a/src/swig-0_27_7/preview_wrap.cxx b/src/swig-0_27_7/preview_wrap.cxx index d40692e7..ddc89fda 100644 --- a/src/swig-0_27_7/preview_wrap.cxx +++ b/src/swig-0_27_7/preview_wrap.cxx @@ -5983,7 +5983,9 @@ static int release_views(PyObject* py_self) { PyObject* view = NULL; for (Py_ssize_t idx = PyList_Size(view_list); idx > 0; idx--) { view_ref = PyList_GetItem(view_list, idx - 1); - if (PyWeakref_GetRef(view_ref, &view) == 1) { + if (PyWeakref_GetRef(view_ref, &view) < 0) + return -1; + if (view) { Py_XDECREF(PyObject_CallMethod(view, "release", NULL)); Py_DECREF(view); } diff --git a/src/swig-0_27_7/types_wrap.cxx b/src/swig-0_27_7/types_wrap.cxx index 9914d1d1..bcc06d96 100644 --- a/src/swig-0_27_7/types_wrap.cxx +++ b/src/swig-0_27_7/types_wrap.cxx @@ -5206,7 +5206,9 @@ static int release_views(PyObject* py_self) { PyObject* view = NULL; for (Py_ssize_t idx = PyList_Size(view_list); idx > 0; idx--) { view_ref = PyList_GetItem(view_list, idx - 1); - if (PyWeakref_GetRef(view_ref, &view) == 1) { + if (PyWeakref_GetRef(view_ref, &view) < 0) + return -1; + if (view) { Py_XDECREF(PyObject_CallMethod(view, "release", NULL)); Py_DECREF(view); } @@ -6299,7 +6301,10 @@ SWIGINTERN PyObject *_wrap_DataBuf_alloc(PyObject *self, PyObject *args) { } resultobj = SWIG_Py_Void(); - release_views(self); + if (release_views(self) < 0) { + Py_DECREF(resultobj); + SWIG_fail; + } return resultobj; fail: @@ -6322,7 +6327,10 @@ SWIGINTERN PyObject *_wrap_DataBuf_free(PyObject *self, PyObject *args) { (arg1)->free(); resultobj = SWIG_Py_Void(); - release_views(self); + if (release_views(self) < 0) { + Py_DECREF(resultobj); + SWIG_fail; + } return resultobj; fail: @@ -6345,7 +6353,10 @@ SWIGINTERN PyObject *_wrap_DataBuf_reset(PyObject *self, PyObject *args) { (arg1)->reset(); resultobj = SWIG_Py_Void(); - release_views(self); + if (release_views(self) < 0) { + Py_DECREF(resultobj); + SWIG_fail; + } return resultobj; fail: diff --git a/src/swig-0_27_7/value_wrap.cxx b/src/swig-0_27_7/value_wrap.cxx index a2170677..bf34c509 100644 --- a/src/swig-0_27_7/value_wrap.cxx +++ b/src/swig-0_27_7/value_wrap.cxx @@ -6584,7 +6584,9 @@ static int release_views(PyObject* py_self) { PyObject* view = NULL; for (Py_ssize_t idx = PyList_Size(view_list); idx > 0; idx--) { view_ref = PyList_GetItem(view_list, idx - 1); - if (PyWeakref_GetRef(view_ref, &view) == 1) { + if (PyWeakref_GetRef(view_ref, &view) < 0) + return -1; + if (view) { Py_XDECREF(PyObject_CallMethod(view, "release", NULL)); Py_DECREF(view); } @@ -9696,7 +9698,10 @@ SWIGINTERN PyObject *_wrap_StringValueBase_read__SWIG_0(PyObject *self, Py_ssize resultobj = SWIG_From_int(static_cast< int >(result)); if (SWIG_IsNewObj(res2)) delete arg2; - release_views(self); + if (release_views(self) < 0) { + Py_DECREF(resultobj); + SWIG_fail; + } return resultobj; fail: @@ -9769,7 +9774,10 @@ SWIGINTERN PyObject *_wrap_StringValueBase_read__SWIG_1(PyObject *self, Py_ssize Py_XDECREF(_global_view); - release_views(self); + if (release_views(self) < 0) { + Py_DECREF(resultobj); + SWIG_fail; + } return resultobj; fail: @@ -11907,7 +11915,10 @@ SWIGINTERN PyObject *_wrap_XmpTextValue_read__SWIG_0(PyObject *self, Py_ssize_t Py_XDECREF(_global_view); - release_views(self); + if (release_views(self) < 0) { + Py_DECREF(resultobj); + SWIG_fail; + } return resultobj; fail: @@ -11956,7 +11967,10 @@ SWIGINTERN PyObject *_wrap_XmpTextValue_read__SWIG_1(PyObject *self, Py_ssize_t resultobj = SWIG_From_int(static_cast< int >(result)); if (SWIG_IsNewObj(res2)) delete arg2; - release_views(self); + if (release_views(self) < 0) { + Py_DECREF(resultobj); + SWIG_fail; + } return resultobj; fail: diff --git a/src/swig-0_28_7/basicio_wrap.cxx b/src/swig-0_28_7/basicio_wrap.cxx index 61214318..7e44d76f 100644 --- a/src/swig-0_28_7/basicio_wrap.cxx +++ b/src/swig-0_28_7/basicio_wrap.cxx @@ -4877,7 +4877,9 @@ static int release_views(PyObject* py_self) { PyObject* view = NULL; for (Py_ssize_t idx = PyList_Size(view_list); idx > 0; idx--) { view_ref = PyList_GetItem(view_list, idx - 1); - if (PyWeakref_GetRef(view_ref, &view) == 1) { + if (PyWeakref_GetRef(view_ref, &view) < 0) + return -1; + if (view) { Py_XDECREF(PyObject_CallMethod(view, "release", NULL)); Py_DECREF(view); } @@ -5330,7 +5332,9 @@ SWIGINTERN PyObject *_wrap_delete_BasicIo(PyObject *self, PyObject *args) { arg1 = reinterpret_cast< Exiv2::BasicIo * >(argp1); { #ifdef RELEASE_VIEWS_delete_BasicIo - release_views(self); + if (release_views(self) < 0) { + SWIG_fail; + } #endif } { @@ -5364,7 +5368,9 @@ SWIGINTERN PyObject *_wrap_BasicIo_open(PyObject *self, PyObject *args) { arg1 = reinterpret_cast< Exiv2::BasicIo * >(argp1); { #ifdef RELEASE_VIEWS_BasicIo_open - release_views(self); + if (release_views(self) < 0) { + SWIG_fail; + } #endif } { @@ -5402,7 +5408,9 @@ SWIGINTERN PyObject *_wrap_BasicIo_close(PyObject *self, PyObject *args) { arg1 = reinterpret_cast< Exiv2::BasicIo * >(argp1); { #ifdef RELEASE_VIEWS_BasicIo_close - release_views(self); + if (release_views(self) < 0) { + SWIG_fail; + } #endif } { @@ -5458,7 +5466,9 @@ SWIGINTERN PyObject *_wrap_BasicIo_write__SWIG_0(PyObject *self, Py_ssize_t nobj } { #ifdef RELEASE_VIEWS_BasicIo_write - release_views(self); + if (release_views(self) < 0) { + SWIG_fail; + } #endif } { @@ -5514,7 +5524,9 @@ SWIGINTERN PyObject *_wrap_BasicIo_write__SWIG_1(PyObject *self, Py_ssize_t nobj arg2 = reinterpret_cast< Exiv2::BasicIo * >(argp2); { #ifdef RELEASE_VIEWS_BasicIo_write - release_views(self); + if (release_views(self) < 0) { + SWIG_fail; + } #endif } { @@ -5599,7 +5611,9 @@ SWIGINTERN PyObject *_wrap_BasicIo_putb(PyObject *self, PyObject *args) { arg2 = static_cast< Exiv2::byte >(val2); { #ifdef RELEASE_VIEWS_BasicIo_putb - release_views(self); + if (release_views(self) < 0) { + SWIG_fail; + } #endif } { @@ -5642,7 +5656,9 @@ SWIGINTERN PyObject *_wrap_BasicIo_read__SWIG_0(PyObject *self, Py_ssize_t nobjs arg2 = static_cast< size_t >(val2); { #ifdef RELEASE_VIEWS_BasicIo_read - release_views(self); + if (release_views(self) < 0) { + SWIG_fail; + } #endif } { @@ -5698,7 +5714,9 @@ SWIGINTERN PyObject *_wrap_BasicIo_read__SWIG_1(PyObject *self, Py_ssize_t nobjs } { #ifdef RELEASE_VIEWS_BasicIo_read - release_views(self); + if (release_views(self) < 0) { + SWIG_fail; + } #endif } { @@ -5819,7 +5837,9 @@ SWIGINTERN PyObject *_wrap_BasicIo_readOrThrow(PyObject *self, PyObject *args) { } { #ifdef RELEASE_VIEWS_BasicIo_readOrThrow - release_views(self); + if (release_views(self) < 0) { + SWIG_fail; + } #endif } { @@ -5864,7 +5884,9 @@ SWIGINTERN PyObject *_wrap_BasicIo_getb(PyObject *self, PyObject *args) { arg1 = reinterpret_cast< Exiv2::BasicIo * >(argp1); { #ifdef RELEASE_VIEWS_BasicIo_getb - release_views(self); + if (release_views(self) < 0) { + SWIG_fail; + } #endif } { @@ -5911,7 +5933,9 @@ SWIGINTERN PyObject *_wrap_BasicIo_transfer(PyObject *self, PyObject *args) { arg2 = reinterpret_cast< Exiv2::BasicIo * >(argp2); { #ifdef RELEASE_VIEWS_BasicIo_transfer - release_views(self); + if (release_views(self) < 0) { + SWIG_fail; + } #endif } { @@ -5972,7 +5996,9 @@ SWIGINTERN PyObject *_wrap_BasicIo_seek(PyObject *self, PyObject *args) { } { #ifdef RELEASE_VIEWS_BasicIo_seek - release_views(self); + if (release_views(self) < 0) { + SWIG_fail; + } #endif } { @@ -6053,7 +6079,9 @@ SWIGINTERN PyObject *_wrap_BasicIo_seekOrThrow(PyObject *self, PyObject *args) { } { #ifdef RELEASE_VIEWS_BasicIo_seekOrThrow - release_views(self); + if (release_views(self) < 0) { + SWIG_fail; + } #endif } { @@ -6102,7 +6130,9 @@ SWIGINTERN PyObject *_wrap_BasicIo_mmap(PyObject *self, PyObject *args) { } { #ifdef RELEASE_VIEWS_BasicIo_mmap - release_views(self); + if (release_views(self) < 0) { + SWIG_fail; + } #endif } { @@ -6147,7 +6177,9 @@ SWIGINTERN PyObject *_wrap_BasicIo_munmap(PyObject *self, PyObject *args) { arg1 = reinterpret_cast< Exiv2::BasicIo * >(argp1); { #ifdef RELEASE_VIEWS_BasicIo_munmap - release_views(self); + if (release_views(self) < 0) { + SWIG_fail; + } #endif } { @@ -6185,7 +6217,9 @@ SWIGINTERN PyObject *_wrap_BasicIo_tell(PyObject *self, PyObject *args) { arg1 = reinterpret_cast< Exiv2::BasicIo * >(argp1); { #ifdef RELEASE_VIEWS_BasicIo_tell - release_views(self); + if (release_views(self) < 0) { + SWIG_fail; + } #endif } { @@ -6220,7 +6254,9 @@ SWIGINTERN PyObject *_wrap_BasicIo_size(PyObject *self, PyObject *args) { arg1 = reinterpret_cast< Exiv2::BasicIo * >(argp1); { #ifdef RELEASE_VIEWS_BasicIo_size - release_views(self); + if (release_views(self) < 0) { + SWIG_fail; + } #endif } { @@ -6254,7 +6290,9 @@ SWIGINTERN PyObject *_wrap_BasicIo_isopen(PyObject *self, PyObject *args) { arg1 = reinterpret_cast< Exiv2::BasicIo * >(argp1); { #ifdef RELEASE_VIEWS_BasicIo_isopen - release_views(self); + if (release_views(self) < 0) { + SWIG_fail; + } #endif } result = (bool)((Exiv2::BasicIo const *)arg1)->isopen(); @@ -6280,7 +6318,9 @@ SWIGINTERN PyObject *_wrap_BasicIo_error(PyObject *self, PyObject *args) { arg1 = reinterpret_cast< Exiv2::BasicIo * >(argp1); { #ifdef RELEASE_VIEWS_BasicIo_error - release_views(self); + if (release_views(self) < 0) { + SWIG_fail; + } #endif } result = (int)((Exiv2::BasicIo const *)arg1)->error(); @@ -6306,7 +6346,9 @@ SWIGINTERN PyObject *_wrap_BasicIo_eof(PyObject *self, PyObject *args) { arg1 = reinterpret_cast< Exiv2::BasicIo * >(argp1); { #ifdef RELEASE_VIEWS_BasicIo_eof - release_views(self); + if (release_views(self) < 0) { + SWIG_fail; + } #endif } { @@ -6341,7 +6383,9 @@ SWIGINTERN PyObject *_wrap_BasicIo_path(PyObject *self, PyObject *args) { arg1 = reinterpret_cast< Exiv2::BasicIo * >(argp1); { #ifdef RELEASE_VIEWS_BasicIo_path - release_views(self); + if (release_views(self) < 0) { + SWIG_fail; + } #endif } result = (std::string *) &((Exiv2::BasicIo const *)arg1)->path(); @@ -6378,7 +6422,9 @@ SWIGINTERN PyObject *_wrap_BasicIo_ioType(PyObject *self, PyObject *args) { arg1 = reinterpret_cast< Exiv2::BasicIo * >(argp1); { #ifdef RELEASE_VIEWS_BasicIo_ioType - release_views(self); + if (release_views(self) < 0) { + SWIG_fail; + } #endif } result = (char *)Exiv2_BasicIo_ioType(arg1); @@ -6418,7 +6464,9 @@ SWIGINTERN PyObject *_wrap_BasicIo_data(PyObject *self, PyObject *args) { } { #ifdef RELEASE_VIEWS_BasicIo_data - release_views(self); + if (release_views(self) < 0) { + SWIG_fail; + } #endif } { @@ -6466,7 +6514,9 @@ SWIGINTERN PyObject *_wrap_BasicIo__view_deleted_cb(PyObject *self, PyObject *ar arg2 = swig_obj[0]; { #ifdef RELEASE_VIEWS_BasicIo__view_deleted_cb - release_views(self); + if (release_views(self) < 0) { + SWIG_fail; + } #endif } { diff --git a/src/swig-0_28_7/image_wrap.cxx b/src/swig-0_28_7/image_wrap.cxx index d4b2de6f..678ebbc9 100644 --- a/src/swig-0_28_7/image_wrap.cxx +++ b/src/swig-0_28_7/image_wrap.cxx @@ -5083,7 +5083,9 @@ static int release_views(PyObject* py_self) { PyObject* view = NULL; for (Py_ssize_t idx = PyList_Size(view_list); idx > 0; idx--) { view_ref = PyList_GetItem(view_list, idx - 1); - if (PyWeakref_GetRef(view_ref, &view) == 1) { + if (PyWeakref_GetRef(view_ref, &view) < 0) + return -1; + if (view) { Py_XDECREF(PyObject_CallMethod(view, "release", NULL)); Py_DECREF(view); } @@ -5449,7 +5451,9 @@ SWIGINTERN PyObject *_wrap_delete_Image(PyObject *self, PyObject *args) { arg1 = reinterpret_cast< Exiv2::Image * >(argp1); { #ifdef RELEASE_VIEWS_delete_Image - release_views(self); + if (release_views(self) < 0) { + SWIG_fail; + } #endif } { @@ -5482,7 +5486,9 @@ SWIGINTERN PyObject *_wrap_Image_readMetadata(PyObject *self, PyObject *args) { arg1 = reinterpret_cast< Exiv2::Image * >(argp1); { #ifdef RELEASE_VIEWS_Image_readMetadata - release_views(self); + if (release_views(self) < 0) { + SWIG_fail; + } #endif } { @@ -5519,7 +5525,9 @@ SWIGINTERN PyObject *_wrap_Image_writeMetadata(PyObject *self, PyObject *args) { arg1 = reinterpret_cast< Exiv2::Image * >(argp1); { #ifdef RELEASE_VIEWS_Image_writeMetadata - release_views(self); + if (release_views(self) < 0) { + SWIG_fail; + } #endif } { @@ -5572,7 +5580,9 @@ SWIGINTERN PyObject *_wrap_Image_setExifData(PyObject *self, PyObject *args) { arg2 = reinterpret_cast< Exiv2::ExifData * >(argp2); { #ifdef RELEASE_VIEWS_Image_setExifData - release_views(self); + if (release_views(self) < 0) { + SWIG_fail; + } #endif } { @@ -5605,7 +5615,9 @@ SWIGINTERN PyObject *_wrap_Image_clearExifData(PyObject *self, PyObject *args) { arg1 = reinterpret_cast< Exiv2::Image * >(argp1); { #ifdef RELEASE_VIEWS_Image_clearExifData - release_views(self); + if (release_views(self) < 0) { + SWIG_fail; + } #endif } { @@ -5651,7 +5663,9 @@ SWIGINTERN PyObject *_wrap_Image_setIptcData(PyObject *self, PyObject *args) { arg2 = reinterpret_cast< Exiv2::IptcData * >(argp2); { #ifdef RELEASE_VIEWS_Image_setIptcData - release_views(self); + if (release_views(self) < 0) { + SWIG_fail; + } #endif } { @@ -5684,7 +5698,9 @@ SWIGINTERN PyObject *_wrap_Image_clearIptcData(PyObject *self, PyObject *args) { arg1 = reinterpret_cast< Exiv2::Image * >(argp1); { #ifdef RELEASE_VIEWS_Image_clearIptcData - release_views(self); + if (release_views(self) < 0) { + SWIG_fail; + } #endif } { @@ -5732,7 +5748,9 @@ SWIGINTERN PyObject *_wrap_Image_setXmpPacket(PyObject *self, PyObject *args) { } { #ifdef RELEASE_VIEWS_Image_setXmpPacket - release_views(self); + if (release_views(self) < 0) { + SWIG_fail; + } #endif } { @@ -5767,7 +5785,9 @@ SWIGINTERN PyObject *_wrap_Image_clearXmpPacket(PyObject *self, PyObject *args) arg1 = reinterpret_cast< Exiv2::Image * >(argp1); { #ifdef RELEASE_VIEWS_Image_clearXmpPacket - release_views(self); + if (release_views(self) < 0) { + SWIG_fail; + } #endif } { @@ -5813,7 +5833,9 @@ SWIGINTERN PyObject *_wrap_Image_setXmpData(PyObject *self, PyObject *args) { arg2 = reinterpret_cast< Exiv2::XmpData * >(argp2); { #ifdef RELEASE_VIEWS_Image_setXmpData - release_views(self); + if (release_views(self) < 0) { + SWIG_fail; + } #endif } { @@ -5846,7 +5868,9 @@ SWIGINTERN PyObject *_wrap_Image_clearXmpData(PyObject *self, PyObject *args) { arg1 = reinterpret_cast< Exiv2::Image * >(argp1); { #ifdef RELEASE_VIEWS_Image_clearXmpData - release_views(self); + if (release_views(self) < 0) { + SWIG_fail; + } #endif } { @@ -5894,7 +5918,9 @@ SWIGINTERN PyObject *_wrap_Image_setComment(PyObject *self, PyObject *args) { } { #ifdef RELEASE_VIEWS_Image_setComment - release_views(self); + if (release_views(self) < 0) { + SWIG_fail; + } #endif } { @@ -5929,7 +5955,9 @@ SWIGINTERN PyObject *_wrap_Image_clearComment(PyObject *self, PyObject *args) { arg1 = reinterpret_cast< Exiv2::Image * >(argp1); { #ifdef RELEASE_VIEWS_Image_clearComment - release_views(self); + if (release_views(self) < 0) { + SWIG_fail; + } #endif } { @@ -5987,7 +6015,9 @@ SWIGINTERN PyObject *_wrap_Image_setIccProfile(PyObject *self, PyObject *args) { } { #ifdef RELEASE_VIEWS_Image_setIccProfile - release_views(self); + if (release_views(self) < 0) { + SWIG_fail; + } #endif } { @@ -6020,7 +6050,9 @@ SWIGINTERN PyObject *_wrap_Image_clearIccProfile(PyObject *self, PyObject *args) arg1 = reinterpret_cast< Exiv2::Image * >(argp1); { #ifdef RELEASE_VIEWS_Image_clearIccProfile - release_views(self); + if (release_views(self) < 0) { + SWIG_fail; + } #endif } { @@ -6054,7 +6086,9 @@ SWIGINTERN PyObject *_wrap_Image_iccProfileDefined(PyObject *self, PyObject *arg arg1 = reinterpret_cast< Exiv2::Image * >(argp1); { #ifdef RELEASE_VIEWS_Image_iccProfileDefined - release_views(self); + if (release_views(self) < 0) { + SWIG_fail; + } #endif } { @@ -6088,7 +6122,9 @@ SWIGINTERN PyObject *_wrap_Image_iccProfile(PyObject *self, PyObject *args) { arg1 = reinterpret_cast< Exiv2::Image * >(argp1); { #ifdef RELEASE_VIEWS_Image_iccProfile - release_views(self); + if (release_views(self) < 0) { + SWIG_fail; + } #endif } { @@ -6140,7 +6176,9 @@ SWIGINTERN PyObject *_wrap_Image_setMetadata(PyObject *self, PyObject *args) { arg2 = reinterpret_cast< Exiv2::Image * >(argp2); { #ifdef RELEASE_VIEWS_Image_setMetadata - release_views(self); + if (release_views(self) < 0) { + SWIG_fail; + } #endif } { @@ -6173,7 +6211,9 @@ SWIGINTERN PyObject *_wrap_Image_clearMetadata(PyObject *self, PyObject *args) { arg1 = reinterpret_cast< Exiv2::Image * >(argp1); { #ifdef RELEASE_VIEWS_Image_clearMetadata - release_views(self); + if (release_views(self) < 0) { + SWIG_fail; + } #endif } { @@ -6207,7 +6247,9 @@ SWIGINTERN PyObject *_wrap_Image_exifData(PyObject *self, PyObject *args) { arg1 = reinterpret_cast< Exiv2::Image * >(argp1); { #ifdef RELEASE_VIEWS_Image_exifData - release_views(self); + if (release_views(self) < 0) { + SWIG_fail; + } #endif } { @@ -6247,7 +6289,9 @@ SWIGINTERN PyObject *_wrap_Image_iptcData(PyObject *self, PyObject *args) { arg1 = reinterpret_cast< Exiv2::Image * >(argp1); { #ifdef RELEASE_VIEWS_Image_iptcData - release_views(self); + if (release_views(self) < 0) { + SWIG_fail; + } #endif } { @@ -6287,7 +6331,9 @@ SWIGINTERN PyObject *_wrap_Image_xmpData(PyObject *self, PyObject *args) { arg1 = reinterpret_cast< Exiv2::Image * >(argp1); { #ifdef RELEASE_VIEWS_Image_xmpData - release_views(self); + if (release_views(self) < 0) { + SWIG_fail; + } #endif } { @@ -6327,7 +6373,9 @@ SWIGINTERN PyObject *_wrap_Image_xmpPacket(PyObject *self, PyObject *args) { arg1 = reinterpret_cast< Exiv2::Image * >(argp1); { #ifdef RELEASE_VIEWS_Image_xmpPacket - release_views(self); + if (release_views(self) < 0) { + SWIG_fail; + } #endif } { @@ -6368,7 +6416,9 @@ SWIGINTERN PyObject *_wrap_Image_writeXmpFromPacket__SWIG_0(PyObject *self, Py_s arg2 = static_cast< bool >(val2); { #ifdef RELEASE_VIEWS_Image_writeXmpFromPacket - release_views(self); + if (release_views(self) < 0) { + SWIG_fail; + } #endif } { @@ -6416,7 +6466,9 @@ SWIGINTERN PyObject *_wrap_Image_setByteOrder(PyObject *self, PyObject *args) { } { #ifdef RELEASE_VIEWS_Image_setByteOrder - release_views(self); + if (release_views(self) < 0) { + SWIG_fail; + } #endif } { @@ -6450,7 +6502,9 @@ SWIGINTERN PyObject *_wrap_Image_byteOrder(PyObject *self, PyObject *args) { arg1 = reinterpret_cast< Exiv2::Image * >(argp1); { #ifdef RELEASE_VIEWS_Image_byteOrder - release_views(self); + if (release_views(self) < 0) { + SWIG_fail; + } #endif } { @@ -6488,7 +6542,9 @@ SWIGINTERN PyObject *_wrap_Image_good(PyObject *self, PyObject *args) { arg1 = reinterpret_cast< Exiv2::Image * >(argp1); { #ifdef RELEASE_VIEWS_Image_good - release_views(self); + if (release_views(self) < 0) { + SWIG_fail; + } #endif } { @@ -6522,7 +6578,9 @@ SWIGINTERN PyObject *_wrap_Image_mimeType(PyObject *self, PyObject *args) { arg1 = reinterpret_cast< Exiv2::Image * >(argp1); { #ifdef RELEASE_VIEWS_Image_mimeType - release_views(self); + if (release_views(self) < 0) { + SWIG_fail; + } #endif } { @@ -6556,7 +6614,9 @@ SWIGINTERN PyObject *_wrap_Image_pixelWidth(PyObject *self, PyObject *args) { arg1 = reinterpret_cast< Exiv2::Image * >(argp1); { #ifdef RELEASE_VIEWS_Image_pixelWidth - release_views(self); + if (release_views(self) < 0) { + SWIG_fail; + } #endif } { @@ -6590,7 +6650,9 @@ SWIGINTERN PyObject *_wrap_Image_pixelHeight(PyObject *self, PyObject *args) { arg1 = reinterpret_cast< Exiv2::Image * >(argp1); { #ifdef RELEASE_VIEWS_Image_pixelHeight - release_views(self); + if (release_views(self) < 0) { + SWIG_fail; + } #endif } { @@ -6624,7 +6686,9 @@ SWIGINTERN PyObject *_wrap_Image_comment(PyObject *self, PyObject *args) { arg1 = reinterpret_cast< Exiv2::Image * >(argp1); { #ifdef RELEASE_VIEWS_Image_comment - release_views(self); + if (release_views(self) < 0) { + SWIG_fail; + } #endif } { @@ -6658,7 +6722,9 @@ SWIGINTERN PyObject *_wrap_Image_io(PyObject *self, PyObject *args) { arg1 = reinterpret_cast< Exiv2::Image * >(argp1); { #ifdef RELEASE_VIEWS_Image_io - release_views(self); + if (release_views(self) < 0) { + SWIG_fail; + } #endif } { @@ -6713,7 +6779,9 @@ SWIGINTERN PyObject *_wrap_Image_checkMode(PyObject *self, PyObject *args) { } { #ifdef RELEASE_VIEWS_Image_checkMode - release_views(self); + if (release_views(self) < 0) { + SWIG_fail; + } #endif } { @@ -6766,7 +6834,9 @@ SWIGINTERN PyObject *_wrap_Image_supportsMetadata(PyObject *self, PyObject *args } { #ifdef RELEASE_VIEWS_Image_supportsMetadata - release_views(self); + if (release_views(self) < 0) { + SWIG_fail; + } #endif } { @@ -6801,7 +6871,9 @@ SWIGINTERN PyObject *_wrap_Image_writeXmpFromPacket__SWIG_1(PyObject *self, Py_s arg1 = reinterpret_cast< Exiv2::Image * >(argp1); { #ifdef RELEASE_VIEWS_Image_writeXmpFromPacket - release_views(self); + if (release_views(self) < 0) { + SWIG_fail; + } #endif } { @@ -6885,7 +6957,9 @@ SWIGINTERN PyObject *_wrap_Image_setTypeSupported(PyObject *self, PyObject *args arg3 = static_cast< uint16_t >(val3); { #ifdef RELEASE_VIEWS_Image_setTypeSupported - release_views(self); + if (release_views(self) < 0) { + SWIG_fail; + } #endif } { @@ -6919,7 +6993,9 @@ SWIGINTERN PyObject *_wrap_Image_imageType(PyObject *self, PyObject *args) { arg1 = reinterpret_cast< Exiv2::Image * >(argp1); { #ifdef RELEASE_VIEWS_Image_imageType - release_views(self); + if (release_views(self) < 0) { + SWIG_fail; + } #endif } { @@ -6961,7 +7037,9 @@ SWIGINTERN PyObject *_wrap_Image_data(PyObject *self, PyObject *args) { arg1 = reinterpret_cast< Exiv2::Image * >(argp1); { #ifdef RELEASE_VIEWS_Image_data - release_views(self); + if (release_views(self) < 0) { + SWIG_fail; + } #endif } { @@ -6999,7 +7077,9 @@ SWIGINTERN PyObject *_wrap_Image__view_deleted_cb(PyObject *self, PyObject *args arg2 = swig_obj[0]; { #ifdef RELEASE_VIEWS_Image__view_deleted_cb - release_views(self); + if (release_views(self) < 0) { + SWIG_fail; + } #endif } { diff --git a/src/swig-0_28_7/preview_wrap.cxx b/src/swig-0_28_7/preview_wrap.cxx index a1046f0a..cda753c4 100644 --- a/src/swig-0_28_7/preview_wrap.cxx +++ b/src/swig-0_28_7/preview_wrap.cxx @@ -6026,7 +6026,9 @@ static int release_views(PyObject* py_self) { PyObject* view = NULL; for (Py_ssize_t idx = PyList_Size(view_list); idx > 0; idx--) { view_ref = PyList_GetItem(view_list, idx - 1); - if (PyWeakref_GetRef(view_ref, &view) == 1) { + if (PyWeakref_GetRef(view_ref, &view) < 0) + return -1; + if (view) { Py_XDECREF(PyObject_CallMethod(view, "release", NULL)); Py_DECREF(view); } diff --git a/src/swig-0_28_7/types_wrap.cxx b/src/swig-0_28_7/types_wrap.cxx index 2f9061af..d25a78d4 100644 --- a/src/swig-0_28_7/types_wrap.cxx +++ b/src/swig-0_28_7/types_wrap.cxx @@ -5321,7 +5321,9 @@ static int release_views(PyObject* py_self) { PyObject* view = NULL; for (Py_ssize_t idx = PyList_Size(view_list); idx > 0; idx--) { view_ref = PyList_GetItem(view_list, idx - 1); - if (PyWeakref_GetRef(view_ref, &view) == 1) { + if (PyWeakref_GetRef(view_ref, &view) < 0) + return -1; + if (view) { Py_XDECREF(PyObject_CallMethod(view, "release", NULL)); Py_DECREF(view); } @@ -6308,7 +6310,10 @@ SWIGINTERN PyObject *_wrap_DataBuf_alloc(PyObject *self, PyObject *args) { } resultobj = SWIG_Py_Void(); - release_views(self); + if (release_views(self) < 0) { + Py_DECREF(resultobj); + SWIG_fail; + } return resultobj; fail: @@ -6349,7 +6354,10 @@ SWIGINTERN PyObject *_wrap_DataBuf_resize(PyObject *self, PyObject *args) { } resultobj = SWIG_Py_Void(); - release_views(self); + if (release_views(self) < 0) { + Py_DECREF(resultobj); + SWIG_fail; + } return resultobj; fail: @@ -6372,7 +6380,10 @@ SWIGINTERN PyObject *_wrap_DataBuf_reset(PyObject *self, PyObject *args) { (arg1)->reset(); resultobj = SWIG_Py_Void(); - release_views(self); + if (release_views(self) < 0) { + Py_DECREF(resultobj); + SWIG_fail; + } return resultobj; fail: diff --git a/src/swig-0_28_7/value_wrap.cxx b/src/swig-0_28_7/value_wrap.cxx index 4387a531..617102d5 100644 --- a/src/swig-0_28_7/value_wrap.cxx +++ b/src/swig-0_28_7/value_wrap.cxx @@ -6754,7 +6754,9 @@ static int release_views(PyObject* py_self) { PyObject* view = NULL; for (Py_ssize_t idx = PyList_Size(view_list); idx > 0; idx--) { view_ref = PyList_GetItem(view_list, idx - 1); - if (PyWeakref_GetRef(view_ref, &view) == 1) { + if (PyWeakref_GetRef(view_ref, &view) < 0) + return -1; + if (view) { Py_XDECREF(PyObject_CallMethod(view, "release", NULL)); Py_DECREF(view); } @@ -9770,7 +9772,10 @@ SWIGINTERN PyObject *_wrap_StringValueBase_read__SWIG_0(PyObject *self, Py_ssize resultobj = SWIG_From_int(static_cast< int >(result)); if (SWIG_IsNewObj(res2)) delete arg2; - release_views(self); + if (release_views(self) < 0) { + Py_DECREF(resultobj); + SWIG_fail; + } return resultobj; fail: @@ -9843,7 +9848,10 @@ SWIGINTERN PyObject *_wrap_StringValueBase_read__SWIG_1(PyObject *self, Py_ssize Py_XDECREF(_global_view); - release_views(self); + if (release_views(self) < 0) { + Py_DECREF(resultobj); + SWIG_fail; + } return resultobj; fail: @@ -12006,7 +12014,10 @@ SWIGINTERN PyObject *_wrap_XmpTextValue_read__SWIG_0(PyObject *self, Py_ssize_t Py_XDECREF(_global_view); - release_views(self); + if (release_views(self) < 0) { + Py_DECREF(resultobj); + SWIG_fail; + } return resultobj; fail: @@ -12055,7 +12066,10 @@ SWIGINTERN PyObject *_wrap_XmpTextValue_read__SWIG_1(PyObject *self, Py_ssize_t resultobj = SWIG_From_int(static_cast< int >(result)); if (SWIG_IsNewObj(res2)) delete arg2; - release_views(self); + if (release_views(self) < 0) { + Py_DECREF(resultobj); + SWIG_fail; + } return resultobj; fail: diff --git a/src/swig-0_28_8/basicio_wrap.cxx b/src/swig-0_28_8/basicio_wrap.cxx index 61214318..7e44d76f 100644 --- a/src/swig-0_28_8/basicio_wrap.cxx +++ b/src/swig-0_28_8/basicio_wrap.cxx @@ -4877,7 +4877,9 @@ static int release_views(PyObject* py_self) { PyObject* view = NULL; for (Py_ssize_t idx = PyList_Size(view_list); idx > 0; idx--) { view_ref = PyList_GetItem(view_list, idx - 1); - if (PyWeakref_GetRef(view_ref, &view) == 1) { + if (PyWeakref_GetRef(view_ref, &view) < 0) + return -1; + if (view) { Py_XDECREF(PyObject_CallMethod(view, "release", NULL)); Py_DECREF(view); } @@ -5330,7 +5332,9 @@ SWIGINTERN PyObject *_wrap_delete_BasicIo(PyObject *self, PyObject *args) { arg1 = reinterpret_cast< Exiv2::BasicIo * >(argp1); { #ifdef RELEASE_VIEWS_delete_BasicIo - release_views(self); + if (release_views(self) < 0) { + SWIG_fail; + } #endif } { @@ -5364,7 +5368,9 @@ SWIGINTERN PyObject *_wrap_BasicIo_open(PyObject *self, PyObject *args) { arg1 = reinterpret_cast< Exiv2::BasicIo * >(argp1); { #ifdef RELEASE_VIEWS_BasicIo_open - release_views(self); + if (release_views(self) < 0) { + SWIG_fail; + } #endif } { @@ -5402,7 +5408,9 @@ SWIGINTERN PyObject *_wrap_BasicIo_close(PyObject *self, PyObject *args) { arg1 = reinterpret_cast< Exiv2::BasicIo * >(argp1); { #ifdef RELEASE_VIEWS_BasicIo_close - release_views(self); + if (release_views(self) < 0) { + SWIG_fail; + } #endif } { @@ -5458,7 +5466,9 @@ SWIGINTERN PyObject *_wrap_BasicIo_write__SWIG_0(PyObject *self, Py_ssize_t nobj } { #ifdef RELEASE_VIEWS_BasicIo_write - release_views(self); + if (release_views(self) < 0) { + SWIG_fail; + } #endif } { @@ -5514,7 +5524,9 @@ SWIGINTERN PyObject *_wrap_BasicIo_write__SWIG_1(PyObject *self, Py_ssize_t nobj arg2 = reinterpret_cast< Exiv2::BasicIo * >(argp2); { #ifdef RELEASE_VIEWS_BasicIo_write - release_views(self); + if (release_views(self) < 0) { + SWIG_fail; + } #endif } { @@ -5599,7 +5611,9 @@ SWIGINTERN PyObject *_wrap_BasicIo_putb(PyObject *self, PyObject *args) { arg2 = static_cast< Exiv2::byte >(val2); { #ifdef RELEASE_VIEWS_BasicIo_putb - release_views(self); + if (release_views(self) < 0) { + SWIG_fail; + } #endif } { @@ -5642,7 +5656,9 @@ SWIGINTERN PyObject *_wrap_BasicIo_read__SWIG_0(PyObject *self, Py_ssize_t nobjs arg2 = static_cast< size_t >(val2); { #ifdef RELEASE_VIEWS_BasicIo_read - release_views(self); + if (release_views(self) < 0) { + SWIG_fail; + } #endif } { @@ -5698,7 +5714,9 @@ SWIGINTERN PyObject *_wrap_BasicIo_read__SWIG_1(PyObject *self, Py_ssize_t nobjs } { #ifdef RELEASE_VIEWS_BasicIo_read - release_views(self); + if (release_views(self) < 0) { + SWIG_fail; + } #endif } { @@ -5819,7 +5837,9 @@ SWIGINTERN PyObject *_wrap_BasicIo_readOrThrow(PyObject *self, PyObject *args) { } { #ifdef RELEASE_VIEWS_BasicIo_readOrThrow - release_views(self); + if (release_views(self) < 0) { + SWIG_fail; + } #endif } { @@ -5864,7 +5884,9 @@ SWIGINTERN PyObject *_wrap_BasicIo_getb(PyObject *self, PyObject *args) { arg1 = reinterpret_cast< Exiv2::BasicIo * >(argp1); { #ifdef RELEASE_VIEWS_BasicIo_getb - release_views(self); + if (release_views(self) < 0) { + SWIG_fail; + } #endif } { @@ -5911,7 +5933,9 @@ SWIGINTERN PyObject *_wrap_BasicIo_transfer(PyObject *self, PyObject *args) { arg2 = reinterpret_cast< Exiv2::BasicIo * >(argp2); { #ifdef RELEASE_VIEWS_BasicIo_transfer - release_views(self); + if (release_views(self) < 0) { + SWIG_fail; + } #endif } { @@ -5972,7 +5996,9 @@ SWIGINTERN PyObject *_wrap_BasicIo_seek(PyObject *self, PyObject *args) { } { #ifdef RELEASE_VIEWS_BasicIo_seek - release_views(self); + if (release_views(self) < 0) { + SWIG_fail; + } #endif } { @@ -6053,7 +6079,9 @@ SWIGINTERN PyObject *_wrap_BasicIo_seekOrThrow(PyObject *self, PyObject *args) { } { #ifdef RELEASE_VIEWS_BasicIo_seekOrThrow - release_views(self); + if (release_views(self) < 0) { + SWIG_fail; + } #endif } { @@ -6102,7 +6130,9 @@ SWIGINTERN PyObject *_wrap_BasicIo_mmap(PyObject *self, PyObject *args) { } { #ifdef RELEASE_VIEWS_BasicIo_mmap - release_views(self); + if (release_views(self) < 0) { + SWIG_fail; + } #endif } { @@ -6147,7 +6177,9 @@ SWIGINTERN PyObject *_wrap_BasicIo_munmap(PyObject *self, PyObject *args) { arg1 = reinterpret_cast< Exiv2::BasicIo * >(argp1); { #ifdef RELEASE_VIEWS_BasicIo_munmap - release_views(self); + if (release_views(self) < 0) { + SWIG_fail; + } #endif } { @@ -6185,7 +6217,9 @@ SWIGINTERN PyObject *_wrap_BasicIo_tell(PyObject *self, PyObject *args) { arg1 = reinterpret_cast< Exiv2::BasicIo * >(argp1); { #ifdef RELEASE_VIEWS_BasicIo_tell - release_views(self); + if (release_views(self) < 0) { + SWIG_fail; + } #endif } { @@ -6220,7 +6254,9 @@ SWIGINTERN PyObject *_wrap_BasicIo_size(PyObject *self, PyObject *args) { arg1 = reinterpret_cast< Exiv2::BasicIo * >(argp1); { #ifdef RELEASE_VIEWS_BasicIo_size - release_views(self); + if (release_views(self) < 0) { + SWIG_fail; + } #endif } { @@ -6254,7 +6290,9 @@ SWIGINTERN PyObject *_wrap_BasicIo_isopen(PyObject *self, PyObject *args) { arg1 = reinterpret_cast< Exiv2::BasicIo * >(argp1); { #ifdef RELEASE_VIEWS_BasicIo_isopen - release_views(self); + if (release_views(self) < 0) { + SWIG_fail; + } #endif } result = (bool)((Exiv2::BasicIo const *)arg1)->isopen(); @@ -6280,7 +6318,9 @@ SWIGINTERN PyObject *_wrap_BasicIo_error(PyObject *self, PyObject *args) { arg1 = reinterpret_cast< Exiv2::BasicIo * >(argp1); { #ifdef RELEASE_VIEWS_BasicIo_error - release_views(self); + if (release_views(self) < 0) { + SWIG_fail; + } #endif } result = (int)((Exiv2::BasicIo const *)arg1)->error(); @@ -6306,7 +6346,9 @@ SWIGINTERN PyObject *_wrap_BasicIo_eof(PyObject *self, PyObject *args) { arg1 = reinterpret_cast< Exiv2::BasicIo * >(argp1); { #ifdef RELEASE_VIEWS_BasicIo_eof - release_views(self); + if (release_views(self) < 0) { + SWIG_fail; + } #endif } { @@ -6341,7 +6383,9 @@ SWIGINTERN PyObject *_wrap_BasicIo_path(PyObject *self, PyObject *args) { arg1 = reinterpret_cast< Exiv2::BasicIo * >(argp1); { #ifdef RELEASE_VIEWS_BasicIo_path - release_views(self); + if (release_views(self) < 0) { + SWIG_fail; + } #endif } result = (std::string *) &((Exiv2::BasicIo const *)arg1)->path(); @@ -6378,7 +6422,9 @@ SWIGINTERN PyObject *_wrap_BasicIo_ioType(PyObject *self, PyObject *args) { arg1 = reinterpret_cast< Exiv2::BasicIo * >(argp1); { #ifdef RELEASE_VIEWS_BasicIo_ioType - release_views(self); + if (release_views(self) < 0) { + SWIG_fail; + } #endif } result = (char *)Exiv2_BasicIo_ioType(arg1); @@ -6418,7 +6464,9 @@ SWIGINTERN PyObject *_wrap_BasicIo_data(PyObject *self, PyObject *args) { } { #ifdef RELEASE_VIEWS_BasicIo_data - release_views(self); + if (release_views(self) < 0) { + SWIG_fail; + } #endif } { @@ -6466,7 +6514,9 @@ SWIGINTERN PyObject *_wrap_BasicIo__view_deleted_cb(PyObject *self, PyObject *ar arg2 = swig_obj[0]; { #ifdef RELEASE_VIEWS_BasicIo__view_deleted_cb - release_views(self); + if (release_views(self) < 0) { + SWIG_fail; + } #endif } { diff --git a/src/swig-0_28_8/image_wrap.cxx b/src/swig-0_28_8/image_wrap.cxx index d4b2de6f..678ebbc9 100644 --- a/src/swig-0_28_8/image_wrap.cxx +++ b/src/swig-0_28_8/image_wrap.cxx @@ -5083,7 +5083,9 @@ static int release_views(PyObject* py_self) { PyObject* view = NULL; for (Py_ssize_t idx = PyList_Size(view_list); idx > 0; idx--) { view_ref = PyList_GetItem(view_list, idx - 1); - if (PyWeakref_GetRef(view_ref, &view) == 1) { + if (PyWeakref_GetRef(view_ref, &view) < 0) + return -1; + if (view) { Py_XDECREF(PyObject_CallMethod(view, "release", NULL)); Py_DECREF(view); } @@ -5449,7 +5451,9 @@ SWIGINTERN PyObject *_wrap_delete_Image(PyObject *self, PyObject *args) { arg1 = reinterpret_cast< Exiv2::Image * >(argp1); { #ifdef RELEASE_VIEWS_delete_Image - release_views(self); + if (release_views(self) < 0) { + SWIG_fail; + } #endif } { @@ -5482,7 +5486,9 @@ SWIGINTERN PyObject *_wrap_Image_readMetadata(PyObject *self, PyObject *args) { arg1 = reinterpret_cast< Exiv2::Image * >(argp1); { #ifdef RELEASE_VIEWS_Image_readMetadata - release_views(self); + if (release_views(self) < 0) { + SWIG_fail; + } #endif } { @@ -5519,7 +5525,9 @@ SWIGINTERN PyObject *_wrap_Image_writeMetadata(PyObject *self, PyObject *args) { arg1 = reinterpret_cast< Exiv2::Image * >(argp1); { #ifdef RELEASE_VIEWS_Image_writeMetadata - release_views(self); + if (release_views(self) < 0) { + SWIG_fail; + } #endif } { @@ -5572,7 +5580,9 @@ SWIGINTERN PyObject *_wrap_Image_setExifData(PyObject *self, PyObject *args) { arg2 = reinterpret_cast< Exiv2::ExifData * >(argp2); { #ifdef RELEASE_VIEWS_Image_setExifData - release_views(self); + if (release_views(self) < 0) { + SWIG_fail; + } #endif } { @@ -5605,7 +5615,9 @@ SWIGINTERN PyObject *_wrap_Image_clearExifData(PyObject *self, PyObject *args) { arg1 = reinterpret_cast< Exiv2::Image * >(argp1); { #ifdef RELEASE_VIEWS_Image_clearExifData - release_views(self); + if (release_views(self) < 0) { + SWIG_fail; + } #endif } { @@ -5651,7 +5663,9 @@ SWIGINTERN PyObject *_wrap_Image_setIptcData(PyObject *self, PyObject *args) { arg2 = reinterpret_cast< Exiv2::IptcData * >(argp2); { #ifdef RELEASE_VIEWS_Image_setIptcData - release_views(self); + if (release_views(self) < 0) { + SWIG_fail; + } #endif } { @@ -5684,7 +5698,9 @@ SWIGINTERN PyObject *_wrap_Image_clearIptcData(PyObject *self, PyObject *args) { arg1 = reinterpret_cast< Exiv2::Image * >(argp1); { #ifdef RELEASE_VIEWS_Image_clearIptcData - release_views(self); + if (release_views(self) < 0) { + SWIG_fail; + } #endif } { @@ -5732,7 +5748,9 @@ SWIGINTERN PyObject *_wrap_Image_setXmpPacket(PyObject *self, PyObject *args) { } { #ifdef RELEASE_VIEWS_Image_setXmpPacket - release_views(self); + if (release_views(self) < 0) { + SWIG_fail; + } #endif } { @@ -5767,7 +5785,9 @@ SWIGINTERN PyObject *_wrap_Image_clearXmpPacket(PyObject *self, PyObject *args) arg1 = reinterpret_cast< Exiv2::Image * >(argp1); { #ifdef RELEASE_VIEWS_Image_clearXmpPacket - release_views(self); + if (release_views(self) < 0) { + SWIG_fail; + } #endif } { @@ -5813,7 +5833,9 @@ SWIGINTERN PyObject *_wrap_Image_setXmpData(PyObject *self, PyObject *args) { arg2 = reinterpret_cast< Exiv2::XmpData * >(argp2); { #ifdef RELEASE_VIEWS_Image_setXmpData - release_views(self); + if (release_views(self) < 0) { + SWIG_fail; + } #endif } { @@ -5846,7 +5868,9 @@ SWIGINTERN PyObject *_wrap_Image_clearXmpData(PyObject *self, PyObject *args) { arg1 = reinterpret_cast< Exiv2::Image * >(argp1); { #ifdef RELEASE_VIEWS_Image_clearXmpData - release_views(self); + if (release_views(self) < 0) { + SWIG_fail; + } #endif } { @@ -5894,7 +5918,9 @@ SWIGINTERN PyObject *_wrap_Image_setComment(PyObject *self, PyObject *args) { } { #ifdef RELEASE_VIEWS_Image_setComment - release_views(self); + if (release_views(self) < 0) { + SWIG_fail; + } #endif } { @@ -5929,7 +5955,9 @@ SWIGINTERN PyObject *_wrap_Image_clearComment(PyObject *self, PyObject *args) { arg1 = reinterpret_cast< Exiv2::Image * >(argp1); { #ifdef RELEASE_VIEWS_Image_clearComment - release_views(self); + if (release_views(self) < 0) { + SWIG_fail; + } #endif } { @@ -5987,7 +6015,9 @@ SWIGINTERN PyObject *_wrap_Image_setIccProfile(PyObject *self, PyObject *args) { } { #ifdef RELEASE_VIEWS_Image_setIccProfile - release_views(self); + if (release_views(self) < 0) { + SWIG_fail; + } #endif } { @@ -6020,7 +6050,9 @@ SWIGINTERN PyObject *_wrap_Image_clearIccProfile(PyObject *self, PyObject *args) arg1 = reinterpret_cast< Exiv2::Image * >(argp1); { #ifdef RELEASE_VIEWS_Image_clearIccProfile - release_views(self); + if (release_views(self) < 0) { + SWIG_fail; + } #endif } { @@ -6054,7 +6086,9 @@ SWIGINTERN PyObject *_wrap_Image_iccProfileDefined(PyObject *self, PyObject *arg arg1 = reinterpret_cast< Exiv2::Image * >(argp1); { #ifdef RELEASE_VIEWS_Image_iccProfileDefined - release_views(self); + if (release_views(self) < 0) { + SWIG_fail; + } #endif } { @@ -6088,7 +6122,9 @@ SWIGINTERN PyObject *_wrap_Image_iccProfile(PyObject *self, PyObject *args) { arg1 = reinterpret_cast< Exiv2::Image * >(argp1); { #ifdef RELEASE_VIEWS_Image_iccProfile - release_views(self); + if (release_views(self) < 0) { + SWIG_fail; + } #endif } { @@ -6140,7 +6176,9 @@ SWIGINTERN PyObject *_wrap_Image_setMetadata(PyObject *self, PyObject *args) { arg2 = reinterpret_cast< Exiv2::Image * >(argp2); { #ifdef RELEASE_VIEWS_Image_setMetadata - release_views(self); + if (release_views(self) < 0) { + SWIG_fail; + } #endif } { @@ -6173,7 +6211,9 @@ SWIGINTERN PyObject *_wrap_Image_clearMetadata(PyObject *self, PyObject *args) { arg1 = reinterpret_cast< Exiv2::Image * >(argp1); { #ifdef RELEASE_VIEWS_Image_clearMetadata - release_views(self); + if (release_views(self) < 0) { + SWIG_fail; + } #endif } { @@ -6207,7 +6247,9 @@ SWIGINTERN PyObject *_wrap_Image_exifData(PyObject *self, PyObject *args) { arg1 = reinterpret_cast< Exiv2::Image * >(argp1); { #ifdef RELEASE_VIEWS_Image_exifData - release_views(self); + if (release_views(self) < 0) { + SWIG_fail; + } #endif } { @@ -6247,7 +6289,9 @@ SWIGINTERN PyObject *_wrap_Image_iptcData(PyObject *self, PyObject *args) { arg1 = reinterpret_cast< Exiv2::Image * >(argp1); { #ifdef RELEASE_VIEWS_Image_iptcData - release_views(self); + if (release_views(self) < 0) { + SWIG_fail; + } #endif } { @@ -6287,7 +6331,9 @@ SWIGINTERN PyObject *_wrap_Image_xmpData(PyObject *self, PyObject *args) { arg1 = reinterpret_cast< Exiv2::Image * >(argp1); { #ifdef RELEASE_VIEWS_Image_xmpData - release_views(self); + if (release_views(self) < 0) { + SWIG_fail; + } #endif } { @@ -6327,7 +6373,9 @@ SWIGINTERN PyObject *_wrap_Image_xmpPacket(PyObject *self, PyObject *args) { arg1 = reinterpret_cast< Exiv2::Image * >(argp1); { #ifdef RELEASE_VIEWS_Image_xmpPacket - release_views(self); + if (release_views(self) < 0) { + SWIG_fail; + } #endif } { @@ -6368,7 +6416,9 @@ SWIGINTERN PyObject *_wrap_Image_writeXmpFromPacket__SWIG_0(PyObject *self, Py_s arg2 = static_cast< bool >(val2); { #ifdef RELEASE_VIEWS_Image_writeXmpFromPacket - release_views(self); + if (release_views(self) < 0) { + SWIG_fail; + } #endif } { @@ -6416,7 +6466,9 @@ SWIGINTERN PyObject *_wrap_Image_setByteOrder(PyObject *self, PyObject *args) { } { #ifdef RELEASE_VIEWS_Image_setByteOrder - release_views(self); + if (release_views(self) < 0) { + SWIG_fail; + } #endif } { @@ -6450,7 +6502,9 @@ SWIGINTERN PyObject *_wrap_Image_byteOrder(PyObject *self, PyObject *args) { arg1 = reinterpret_cast< Exiv2::Image * >(argp1); { #ifdef RELEASE_VIEWS_Image_byteOrder - release_views(self); + if (release_views(self) < 0) { + SWIG_fail; + } #endif } { @@ -6488,7 +6542,9 @@ SWIGINTERN PyObject *_wrap_Image_good(PyObject *self, PyObject *args) { arg1 = reinterpret_cast< Exiv2::Image * >(argp1); { #ifdef RELEASE_VIEWS_Image_good - release_views(self); + if (release_views(self) < 0) { + SWIG_fail; + } #endif } { @@ -6522,7 +6578,9 @@ SWIGINTERN PyObject *_wrap_Image_mimeType(PyObject *self, PyObject *args) { arg1 = reinterpret_cast< Exiv2::Image * >(argp1); { #ifdef RELEASE_VIEWS_Image_mimeType - release_views(self); + if (release_views(self) < 0) { + SWIG_fail; + } #endif } { @@ -6556,7 +6614,9 @@ SWIGINTERN PyObject *_wrap_Image_pixelWidth(PyObject *self, PyObject *args) { arg1 = reinterpret_cast< Exiv2::Image * >(argp1); { #ifdef RELEASE_VIEWS_Image_pixelWidth - release_views(self); + if (release_views(self) < 0) { + SWIG_fail; + } #endif } { @@ -6590,7 +6650,9 @@ SWIGINTERN PyObject *_wrap_Image_pixelHeight(PyObject *self, PyObject *args) { arg1 = reinterpret_cast< Exiv2::Image * >(argp1); { #ifdef RELEASE_VIEWS_Image_pixelHeight - release_views(self); + if (release_views(self) < 0) { + SWIG_fail; + } #endif } { @@ -6624,7 +6686,9 @@ SWIGINTERN PyObject *_wrap_Image_comment(PyObject *self, PyObject *args) { arg1 = reinterpret_cast< Exiv2::Image * >(argp1); { #ifdef RELEASE_VIEWS_Image_comment - release_views(self); + if (release_views(self) < 0) { + SWIG_fail; + } #endif } { @@ -6658,7 +6722,9 @@ SWIGINTERN PyObject *_wrap_Image_io(PyObject *self, PyObject *args) { arg1 = reinterpret_cast< Exiv2::Image * >(argp1); { #ifdef RELEASE_VIEWS_Image_io - release_views(self); + if (release_views(self) < 0) { + SWIG_fail; + } #endif } { @@ -6713,7 +6779,9 @@ SWIGINTERN PyObject *_wrap_Image_checkMode(PyObject *self, PyObject *args) { } { #ifdef RELEASE_VIEWS_Image_checkMode - release_views(self); + if (release_views(self) < 0) { + SWIG_fail; + } #endif } { @@ -6766,7 +6834,9 @@ SWIGINTERN PyObject *_wrap_Image_supportsMetadata(PyObject *self, PyObject *args } { #ifdef RELEASE_VIEWS_Image_supportsMetadata - release_views(self); + if (release_views(self) < 0) { + SWIG_fail; + } #endif } { @@ -6801,7 +6871,9 @@ SWIGINTERN PyObject *_wrap_Image_writeXmpFromPacket__SWIG_1(PyObject *self, Py_s arg1 = reinterpret_cast< Exiv2::Image * >(argp1); { #ifdef RELEASE_VIEWS_Image_writeXmpFromPacket - release_views(self); + if (release_views(self) < 0) { + SWIG_fail; + } #endif } { @@ -6885,7 +6957,9 @@ SWIGINTERN PyObject *_wrap_Image_setTypeSupported(PyObject *self, PyObject *args arg3 = static_cast< uint16_t >(val3); { #ifdef RELEASE_VIEWS_Image_setTypeSupported - release_views(self); + if (release_views(self) < 0) { + SWIG_fail; + } #endif } { @@ -6919,7 +6993,9 @@ SWIGINTERN PyObject *_wrap_Image_imageType(PyObject *self, PyObject *args) { arg1 = reinterpret_cast< Exiv2::Image * >(argp1); { #ifdef RELEASE_VIEWS_Image_imageType - release_views(self); + if (release_views(self) < 0) { + SWIG_fail; + } #endif } { @@ -6961,7 +7037,9 @@ SWIGINTERN PyObject *_wrap_Image_data(PyObject *self, PyObject *args) { arg1 = reinterpret_cast< Exiv2::Image * >(argp1); { #ifdef RELEASE_VIEWS_Image_data - release_views(self); + if (release_views(self) < 0) { + SWIG_fail; + } #endif } { @@ -6999,7 +7077,9 @@ SWIGINTERN PyObject *_wrap_Image__view_deleted_cb(PyObject *self, PyObject *args arg2 = swig_obj[0]; { #ifdef RELEASE_VIEWS_Image__view_deleted_cb - release_views(self); + if (release_views(self) < 0) { + SWIG_fail; + } #endif } { diff --git a/src/swig-0_28_8/preview_wrap.cxx b/src/swig-0_28_8/preview_wrap.cxx index a1046f0a..cda753c4 100644 --- a/src/swig-0_28_8/preview_wrap.cxx +++ b/src/swig-0_28_8/preview_wrap.cxx @@ -6026,7 +6026,9 @@ static int release_views(PyObject* py_self) { PyObject* view = NULL; for (Py_ssize_t idx = PyList_Size(view_list); idx > 0; idx--) { view_ref = PyList_GetItem(view_list, idx - 1); - if (PyWeakref_GetRef(view_ref, &view) == 1) { + if (PyWeakref_GetRef(view_ref, &view) < 0) + return -1; + if (view) { Py_XDECREF(PyObject_CallMethod(view, "release", NULL)); Py_DECREF(view); } diff --git a/src/swig-0_28_8/types_wrap.cxx b/src/swig-0_28_8/types_wrap.cxx index 2f9061af..d25a78d4 100644 --- a/src/swig-0_28_8/types_wrap.cxx +++ b/src/swig-0_28_8/types_wrap.cxx @@ -5321,7 +5321,9 @@ static int release_views(PyObject* py_self) { PyObject* view = NULL; for (Py_ssize_t idx = PyList_Size(view_list); idx > 0; idx--) { view_ref = PyList_GetItem(view_list, idx - 1); - if (PyWeakref_GetRef(view_ref, &view) == 1) { + if (PyWeakref_GetRef(view_ref, &view) < 0) + return -1; + if (view) { Py_XDECREF(PyObject_CallMethod(view, "release", NULL)); Py_DECREF(view); } @@ -6308,7 +6310,10 @@ SWIGINTERN PyObject *_wrap_DataBuf_alloc(PyObject *self, PyObject *args) { } resultobj = SWIG_Py_Void(); - release_views(self); + if (release_views(self) < 0) { + Py_DECREF(resultobj); + SWIG_fail; + } return resultobj; fail: @@ -6349,7 +6354,10 @@ SWIGINTERN PyObject *_wrap_DataBuf_resize(PyObject *self, PyObject *args) { } resultobj = SWIG_Py_Void(); - release_views(self); + if (release_views(self) < 0) { + Py_DECREF(resultobj); + SWIG_fail; + } return resultobj; fail: @@ -6372,7 +6380,10 @@ SWIGINTERN PyObject *_wrap_DataBuf_reset(PyObject *self, PyObject *args) { (arg1)->reset(); resultobj = SWIG_Py_Void(); - release_views(self); + if (release_views(self) < 0) { + Py_DECREF(resultobj); + SWIG_fail; + } return resultobj; fail: diff --git a/src/swig-0_28_8/value_wrap.cxx b/src/swig-0_28_8/value_wrap.cxx index bea23668..b136b74c 100644 --- a/src/swig-0_28_8/value_wrap.cxx +++ b/src/swig-0_28_8/value_wrap.cxx @@ -6740,7 +6740,9 @@ static int release_views(PyObject* py_self) { PyObject* view = NULL; for (Py_ssize_t idx = PyList_Size(view_list); idx > 0; idx--) { view_ref = PyList_GetItem(view_list, idx - 1); - if (PyWeakref_GetRef(view_ref, &view) == 1) { + if (PyWeakref_GetRef(view_ref, &view) < 0) + return -1; + if (view) { Py_XDECREF(PyObject_CallMethod(view, "release", NULL)); Py_DECREF(view); } @@ -9170,7 +9172,10 @@ SWIGINTERN PyObject *_wrap_DataValue_read__SWIG_0(PyObject *self, Py_ssize_t nob Py_XDECREF(_global_view); - release_views(self); + if (release_views(self) < 0) { + Py_DECREF(resultobj); + SWIG_fail; + } return resultobj; fail: @@ -9219,7 +9224,10 @@ SWIGINTERN PyObject *_wrap_DataValue_read__SWIG_1(PyObject *self, Py_ssize_t nob resultobj = SWIG_From_int(static_cast< int >(result)); if (SWIG_IsNewObj(res2)) delete arg2; - release_views(self); + if (release_views(self) < 0) { + Py_DECREF(resultobj); + SWIG_fail; + } return resultobj; fail: @@ -9788,7 +9796,10 @@ SWIGINTERN PyObject *_wrap_StringValueBase_read__SWIG_0(PyObject *self, Py_ssize resultobj = SWIG_From_int(static_cast< int >(result)); if (SWIG_IsNewObj(res2)) delete arg2; - release_views(self); + if (release_views(self) < 0) { + Py_DECREF(resultobj); + SWIG_fail; + } return resultobj; fail: @@ -9861,7 +9872,10 @@ SWIGINTERN PyObject *_wrap_StringValueBase_read__SWIG_1(PyObject *self, Py_ssize Py_XDECREF(_global_view); - release_views(self); + if (release_views(self) < 0) { + Py_DECREF(resultobj); + SWIG_fail; + } return resultobj; fail: @@ -12024,7 +12038,10 @@ SWIGINTERN PyObject *_wrap_XmpTextValue_read__SWIG_0(PyObject *self, Py_ssize_t Py_XDECREF(_global_view); - release_views(self); + if (release_views(self) < 0) { + Py_DECREF(resultobj); + SWIG_fail; + } return resultobj; fail: @@ -12073,7 +12090,10 @@ SWIGINTERN PyObject *_wrap_XmpTextValue_read__SWIG_1(PyObject *self, Py_ssize_t resultobj = SWIG_From_int(static_cast< int >(result)); if (SWIG_IsNewObj(res2)) delete arg2; - release_views(self); + if (release_views(self) < 0) { + Py_DECREF(resultobj); + SWIG_fail; + } return resultobj; fail: From ae5cfa62681c53efad2fb7ebf1f596cd7065f9a8 Mon Sep 17 00:00:00 2001 From: Jim Easterbrook Date: Mon, 22 Jun 2026 13:22:16 +0100 Subject: [PATCH 06/13] Add error checking to other PyWeakref_GetRef calls --- src/interface/shared/containers.i | 5 ++- src/interface/shared/pointer_store.i | 59 ++++++++++++++++++---------- src/swig-0_27_7/exif_wrap.cxx | 58 +++++++++++++++++---------- src/swig-0_27_7/iptc_wrap.cxx | 54 +++++++++++++++---------- src/swig-0_27_7/xmp_wrap.cxx | 58 +++++++++++++++++---------- src/swig-0_28_7/exif_wrap.cxx | 58 +++++++++++++++++---------- src/swig-0_28_7/iptc_wrap.cxx | 54 +++++++++++++++---------- src/swig-0_28_7/xmp_wrap.cxx | 58 +++++++++++++++++---------- src/swig-0_28_8/exif_wrap.cxx | 58 +++++++++++++++++---------- src/swig-0_28_8/iptc_wrap.cxx | 54 +++++++++++++++---------- src/swig-0_28_8/xmp_wrap.cxx | 58 +++++++++++++++++---------- 11 files changed, 365 insertions(+), 209 deletions(-) diff --git a/src/interface/shared/containers.i b/src/interface/shared/containers.i index 72522c98..5a353ece 100644 --- a/src/interface/shared/containers.i +++ b/src/interface/shared/containers.i @@ -1,6 +1,6 @@ // python-exiv2 - Python interface to libexiv2 // http://github.com/jim-easterbrook/python-exiv2 -// Copyright (C) 2023-25 Jim Easterbrook jim@jim-easterbrook.me.uk +// Copyright (C) 2023-26 Jim Easterbrook jim@jim-easterbrook.me.uk // // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by @@ -102,7 +102,8 @@ MP_ASS_SUBSCRIPT(Exiv2::base_class, PyObject*, if (pos == self->end()) return PyErr_Format(PyExc_KeyError, "'%s'", key); #if SWIG_VERSION >= 0x040400 - invalidate_pointers(py_self, pos); + if (invalidate_pointers(py_self, pos) < 0) + return NULL; #endif self->erase(pos), false) SQ_CONTAINS( diff --git a/src/interface/shared/pointer_store.i b/src/interface/shared/pointer_store.i index 0b6c5631..fbf61ada 100644 --- a/src/interface/shared/pointer_store.i +++ b/src/interface/shared/pointer_store.i @@ -27,13 +27,15 @@ // Functions to store weak references to pointers (swig >= v4.4) %fragment("pointer_store", "header", fragment="private_data", fragment="weakref_getref") { -static void _process_list(PyObject* list, bool purge_only, - Exiv2::container_type::iterator* beg, - Exiv2::container_type::iterator* end) { +static int _process_list(PyObject* list, bool purge_only, + Exiv2::container_type::iterator* beg, + Exiv2::container_type::iterator* end) { PyObject* py_ptr = NULL; datum_type##_pointer* cpp_ptr = NULL; for (Py_ssize_t idx = PyList_Size(list); idx > 0; idx--) { - if (PyWeakref_GetRef(PyList_GetItem(list, idx-1), &py_ptr) == 1) + if (PyWeakref_GetRef(PyList_GetItem(list, idx-1), &py_ptr) < 0) + return -1; + if (py_ptr) Py_DECREF(py_ptr); else goto forget; @@ -54,35 +56,41 @@ forget: PyList_SetSlice(list, idx-1, idx, NULL); continue; } + return 0; }; -static void purge_pointers(PyObject* list) { - _process_list(list, true, NULL, NULL); +static int purge_pointers(PyObject* list) { + return _process_list(list, true, NULL, NULL); }; -static void invalidate_pointers(PyObject* py_self) { +static int invalidate_pointers(PyObject* py_self) { PyObject* list = private_store_get(py_self, "pointers"); if (list) - _process_list(list, false, NULL, NULL); + return _process_list(list, false, NULL, NULL); + return 0; }; -static void invalidate_pointers(PyObject* py_self, - Exiv2::container_type::iterator pos) { +static int invalidate_pointers(PyObject* py_self, + Exiv2::container_type::iterator pos) { PyObject* list = private_store_get(py_self, "pointers"); if (list) { Exiv2::container_type::iterator end = pos; end++; - _process_list(list, false, &pos, &end); + return _process_list(list, false, &pos, &end); } + return 0; }; -static void invalidate_pointers(PyObject* py_self, - Exiv2::container_type::iterator beg, - Exiv2::container_type::iterator end) { +static int invalidate_pointers(PyObject* py_self, + Exiv2::container_type::iterator beg, + Exiv2::container_type::iterator end) { PyObject* list = private_store_get(py_self, "pointers"); if (list) - _process_list(list, false, &beg, &end); + return _process_list(list, false, &beg, &end); + return 0; }; static int store_pointer(PyObject* py_self, PyObject* py_ptr) { PyObject* list = private_store_get(py_self, "pointers"); - if (list) - purge_pointers(list); + if (list) { + if (purge_pointers(list) < 0) + return -1; + } else { list = PyList_New(0); if (!list) @@ -116,21 +124,30 @@ static int store_pointer(PyObject* py_self, PyObject* py_ptr) { #if SWIG_VERSION >= 0x040400 // clear() invalidates all pointers %typemap(ret, fragment="pointer_store") void clear { - invalidate_pointers(self); + if (invalidate_pointers(self) < 0) { + Py_DECREF($result); + SWIG_fail; + } } // erase() and eraseFamily() invalidate some pointers %typemap(check, fragment="pointer_store") Exiv2::container_type::iterator pos { - invalidate_pointers(self, $1); + if (invalidate_pointers(self, $1) < 0) { + SWIG_fail; + } } %typemap(check, fragment="pointer_store") (Exiv2::container_type::iterator beg, Exiv2::container_type::iterator end) { - invalidate_pointers(self, $1, $2); + if (invalidate_pointers(self, $1, $2) < 0) { + SWIG_fail; + } } %typemap(check, fragment="pointer_store") Exiv2::container_type::iterator& pos { - invalidate_pointers(self, *$1, arg1->end()); + if (invalidate_pointers(self, *$1, arg1->end()) < 0) { + SWIG_fail; + } } #endif // SWIG_VERSION diff --git a/src/swig-0_27_7/exif_wrap.cxx b/src/swig-0_27_7/exif_wrap.cxx index fb03c35d..d8514780 100644 --- a/src/swig-0_27_7/exif_wrap.cxx +++ b/src/swig-0_27_7/exif_wrap.cxx @@ -5644,13 +5644,15 @@ static int PyWeakref_GetRef(PyObject *ref, PyObject **pobj) { #endif -static void _process_list(PyObject* list, bool purge_only, - Exiv2::ExifData::iterator* beg, - Exiv2::ExifData::iterator* end) { +static int _process_list(PyObject* list, bool purge_only, + Exiv2::ExifData::iterator* beg, + Exiv2::ExifData::iterator* end) { PyObject* py_ptr = NULL; Exifdatum_pointer* cpp_ptr = NULL; for (Py_ssize_t idx = PyList_Size(list); idx > 0; idx--) { - if (PyWeakref_GetRef(PyList_GetItem(list, idx-1), &py_ptr) == 1) + if (PyWeakref_GetRef(PyList_GetItem(list, idx-1), &py_ptr) < 0) + return -1; + if (py_ptr) Py_DECREF(py_ptr); else goto forget; @@ -5671,35 +5673,41 @@ static void _process_list(PyObject* list, bool purge_only, PyList_SetSlice(list, idx-1, idx, NULL); continue; } + return 0; }; -static void purge_pointers(PyObject* list) { - _process_list(list, true, NULL, NULL); +static int purge_pointers(PyObject* list) { + return _process_list(list, true, NULL, NULL); }; -static void invalidate_pointers(PyObject* py_self) { +static int invalidate_pointers(PyObject* py_self) { PyObject* list = private_store_get(py_self, "pointers"); if (list) - _process_list(list, false, NULL, NULL); + return _process_list(list, false, NULL, NULL); + return 0; }; -static void invalidate_pointers(PyObject* py_self, - Exiv2::ExifData::iterator pos) { +static int invalidate_pointers(PyObject* py_self, + Exiv2::ExifData::iterator pos) { PyObject* list = private_store_get(py_self, "pointers"); if (list) { Exiv2::ExifData::iterator end = pos; end++; - _process_list(list, false, &pos, &end); + return _process_list(list, false, &pos, &end); } + return 0; }; -static void invalidate_pointers(PyObject* py_self, - Exiv2::ExifData::iterator beg, - Exiv2::ExifData::iterator end) { +static int invalidate_pointers(PyObject* py_self, + Exiv2::ExifData::iterator beg, + Exiv2::ExifData::iterator end) { PyObject* list = private_store_get(py_self, "pointers"); if (list) - _process_list(list, false, &beg, &end); + return _process_list(list, false, &beg, &end); + return 0; }; static int store_pointer(PyObject* py_self, PyObject* py_ptr) { PyObject* list = private_store_get(py_self, "pointers"); - if (list) - purge_pointers(list); + if (list) { + if (purge_pointers(list) < 0) + return -1; + } else { list = PyList_New(0); if (!list) @@ -5729,7 +5737,8 @@ static PyObject* _delitem_Exiv2_ExifData( if (pos == self->end()) return PyErr_Format(PyExc_KeyError, "'%s'", key); #if 0x040401 >= 0x040400 - invalidate_pointers(py_self, pos); + if (invalidate_pointers(py_self, pos) < 0) + return NULL; #endif self->erase(pos); return SWIG_Py_Void(); @@ -9851,7 +9860,9 @@ SWIGINTERN PyObject *_wrap_ExifData_erase__SWIG_0(PyObject *self, Py_ssize_t nob arg2 = argp2->_ptr(); { - invalidate_pointers(self, arg2); + if (invalidate_pointers(self, arg2) < 0) { + SWIG_fail; + } } { try { @@ -9939,7 +9950,9 @@ SWIGINTERN PyObject *_wrap_ExifData_erase__SWIG_1(PyObject *self, Py_ssize_t nob arg3 = argp3->_ptr(); { - invalidate_pointers(self, arg2, arg3); + if (invalidate_pointers(self, arg2, arg3) < 0) { + SWIG_fail; + } } { try { @@ -10017,7 +10030,10 @@ SWIGINTERN PyObject *_wrap_ExifData_clear(PyObject *self, PyObject *args) { (arg1)->clear(); resultobj = SWIG_Py_Void(); { - invalidate_pointers(self); + if (invalidate_pointers(self) < 0) { + Py_DECREF(resultobj); + SWIG_fail; + } } return resultobj; fail: diff --git a/src/swig-0_27_7/iptc_wrap.cxx b/src/swig-0_27_7/iptc_wrap.cxx index f4101f36..9a7b7980 100644 --- a/src/swig-0_27_7/iptc_wrap.cxx +++ b/src/swig-0_27_7/iptc_wrap.cxx @@ -5636,13 +5636,15 @@ static int PyWeakref_GetRef(PyObject *ref, PyObject **pobj) { #endif -static void _process_list(PyObject* list, bool purge_only, - Exiv2::IptcData::iterator* beg, - Exiv2::IptcData::iterator* end) { +static int _process_list(PyObject* list, bool purge_only, + Exiv2::IptcData::iterator* beg, + Exiv2::IptcData::iterator* end) { PyObject* py_ptr = NULL; Iptcdatum_pointer* cpp_ptr = NULL; for (Py_ssize_t idx = PyList_Size(list); idx > 0; idx--) { - if (PyWeakref_GetRef(PyList_GetItem(list, idx-1), &py_ptr) == 1) + if (PyWeakref_GetRef(PyList_GetItem(list, idx-1), &py_ptr) < 0) + return -1; + if (py_ptr) Py_DECREF(py_ptr); else goto forget; @@ -5663,35 +5665,41 @@ static void _process_list(PyObject* list, bool purge_only, PyList_SetSlice(list, idx-1, idx, NULL); continue; } + return 0; }; -static void purge_pointers(PyObject* list) { - _process_list(list, true, NULL, NULL); +static int purge_pointers(PyObject* list) { + return _process_list(list, true, NULL, NULL); }; -static void invalidate_pointers(PyObject* py_self) { +static int invalidate_pointers(PyObject* py_self) { PyObject* list = private_store_get(py_self, "pointers"); if (list) - _process_list(list, false, NULL, NULL); + return _process_list(list, false, NULL, NULL); + return 0; }; -static void invalidate_pointers(PyObject* py_self, - Exiv2::IptcData::iterator pos) { +static int invalidate_pointers(PyObject* py_self, + Exiv2::IptcData::iterator pos) { PyObject* list = private_store_get(py_self, "pointers"); if (list) { Exiv2::IptcData::iterator end = pos; end++; - _process_list(list, false, &pos, &end); + return _process_list(list, false, &pos, &end); } + return 0; }; -static void invalidate_pointers(PyObject* py_self, - Exiv2::IptcData::iterator beg, - Exiv2::IptcData::iterator end) { +static int invalidate_pointers(PyObject* py_self, + Exiv2::IptcData::iterator beg, + Exiv2::IptcData::iterator end) { PyObject* list = private_store_get(py_self, "pointers"); if (list) - _process_list(list, false, &beg, &end); + return _process_list(list, false, &beg, &end); + return 0; }; static int store_pointer(PyObject* py_self, PyObject* py_ptr) { PyObject* list = private_store_get(py_self, "pointers"); - if (list) - purge_pointers(list); + if (list) { + if (purge_pointers(list) < 0) + return -1; + } else { list = PyList_New(0); if (!list) @@ -5721,7 +5729,8 @@ static PyObject* _delitem_Exiv2_IptcData( if (pos == self->end()) return PyErr_Format(PyExc_KeyError, "'%s'", key); #if 0x040401 >= 0x040400 - invalidate_pointers(py_self, pos); + if (invalidate_pointers(py_self, pos) < 0) + return NULL; #endif self->erase(pos); return SWIG_Py_Void(); @@ -8899,7 +8908,9 @@ SWIGINTERN PyObject *_wrap_IptcData_erase(PyObject *self, PyObject *args) { arg2 = argp2->_ptr(); { - invalidate_pointers(self, arg2); + if (invalidate_pointers(self, arg2) < 0) { + SWIG_fail; + } } { try { @@ -8948,7 +8959,10 @@ SWIGINTERN PyObject *_wrap_IptcData_clear(PyObject *self, PyObject *args) { (arg1)->clear(); resultobj = SWIG_Py_Void(); { - invalidate_pointers(self); + if (invalidate_pointers(self) < 0) { + Py_DECREF(resultobj); + SWIG_fail; + } } return resultobj; fail: diff --git a/src/swig-0_27_7/xmp_wrap.cxx b/src/swig-0_27_7/xmp_wrap.cxx index 965b7a35..10582db4 100644 --- a/src/swig-0_27_7/xmp_wrap.cxx +++ b/src/swig-0_27_7/xmp_wrap.cxx @@ -5639,13 +5639,15 @@ static int PyWeakref_GetRef(PyObject *ref, PyObject **pobj) { #endif -static void _process_list(PyObject* list, bool purge_only, - Exiv2::XmpData::iterator* beg, - Exiv2::XmpData::iterator* end) { +static int _process_list(PyObject* list, bool purge_only, + Exiv2::XmpData::iterator* beg, + Exiv2::XmpData::iterator* end) { PyObject* py_ptr = NULL; Xmpdatum_pointer* cpp_ptr = NULL; for (Py_ssize_t idx = PyList_Size(list); idx > 0; idx--) { - if (PyWeakref_GetRef(PyList_GetItem(list, idx-1), &py_ptr) == 1) + if (PyWeakref_GetRef(PyList_GetItem(list, idx-1), &py_ptr) < 0) + return -1; + if (py_ptr) Py_DECREF(py_ptr); else goto forget; @@ -5666,35 +5668,41 @@ static void _process_list(PyObject* list, bool purge_only, PyList_SetSlice(list, idx-1, idx, NULL); continue; } + return 0; }; -static void purge_pointers(PyObject* list) { - _process_list(list, true, NULL, NULL); +static int purge_pointers(PyObject* list) { + return _process_list(list, true, NULL, NULL); }; -static void invalidate_pointers(PyObject* py_self) { +static int invalidate_pointers(PyObject* py_self) { PyObject* list = private_store_get(py_self, "pointers"); if (list) - _process_list(list, false, NULL, NULL); + return _process_list(list, false, NULL, NULL); + return 0; }; -static void invalidate_pointers(PyObject* py_self, - Exiv2::XmpData::iterator pos) { +static int invalidate_pointers(PyObject* py_self, + Exiv2::XmpData::iterator pos) { PyObject* list = private_store_get(py_self, "pointers"); if (list) { Exiv2::XmpData::iterator end = pos; end++; - _process_list(list, false, &pos, &end); + return _process_list(list, false, &pos, &end); } + return 0; }; -static void invalidate_pointers(PyObject* py_self, - Exiv2::XmpData::iterator beg, - Exiv2::XmpData::iterator end) { +static int invalidate_pointers(PyObject* py_self, + Exiv2::XmpData::iterator beg, + Exiv2::XmpData::iterator end) { PyObject* list = private_store_get(py_self, "pointers"); if (list) - _process_list(list, false, &beg, &end); + return _process_list(list, false, &beg, &end); + return 0; }; static int store_pointer(PyObject* py_self, PyObject* py_ptr) { PyObject* list = private_store_get(py_self, "pointers"); - if (list) - purge_pointers(list); + if (list) { + if (purge_pointers(list) < 0) + return -1; + } else { list = PyList_New(0); if (!list) @@ -5724,7 +5732,8 @@ static PyObject* _delitem_Exiv2_XmpData( if (pos == self->end()) return PyErr_Format(PyExc_KeyError, "'%s'", key); #if 0x040401 >= 0x040400 - invalidate_pointers(py_self, pos); + if (invalidate_pointers(py_self, pos) < 0) + return NULL; #endif self->erase(pos); return SWIG_Py_Void(); @@ -8779,7 +8788,9 @@ SWIGINTERN PyObject *_wrap_XmpData_erase(PyObject *self, PyObject *args) { arg2 = argp2->_ptr(); { - invalidate_pointers(self, arg2); + if (invalidate_pointers(self, arg2) < 0) { + SWIG_fail; + } } { try { @@ -8850,7 +8861,9 @@ SWIGINTERN PyObject *_wrap_XmpData_eraseFamily(PyObject *self, PyObject *args) { arg2 = &it2; } { - invalidate_pointers(self, *arg2, arg1->end()); + if (invalidate_pointers(self, *arg2, arg1->end()) < 0) { + SWIG_fail; + } } { try { @@ -8883,7 +8896,10 @@ SWIGINTERN PyObject *_wrap_XmpData_clear(PyObject *self, PyObject *args) { (arg1)->clear(); resultobj = SWIG_Py_Void(); { - invalidate_pointers(self); + if (invalidate_pointers(self) < 0) { + Py_DECREF(resultobj); + SWIG_fail; + } } return resultobj; fail: diff --git a/src/swig-0_28_7/exif_wrap.cxx b/src/swig-0_28_7/exif_wrap.cxx index c51ce0a0..ea759dac 100644 --- a/src/swig-0_28_7/exif_wrap.cxx +++ b/src/swig-0_28_7/exif_wrap.cxx @@ -5806,13 +5806,15 @@ static int PyWeakref_GetRef(PyObject *ref, PyObject **pobj) { #endif -static void _process_list(PyObject* list, bool purge_only, - Exiv2::ExifData::iterator* beg, - Exiv2::ExifData::iterator* end) { +static int _process_list(PyObject* list, bool purge_only, + Exiv2::ExifData::iterator* beg, + Exiv2::ExifData::iterator* end) { PyObject* py_ptr = NULL; Exifdatum_pointer* cpp_ptr = NULL; for (Py_ssize_t idx = PyList_Size(list); idx > 0; idx--) { - if (PyWeakref_GetRef(PyList_GetItem(list, idx-1), &py_ptr) == 1) + if (PyWeakref_GetRef(PyList_GetItem(list, idx-1), &py_ptr) < 0) + return -1; + if (py_ptr) Py_DECREF(py_ptr); else goto forget; @@ -5833,35 +5835,41 @@ static void _process_list(PyObject* list, bool purge_only, PyList_SetSlice(list, idx-1, idx, NULL); continue; } + return 0; }; -static void purge_pointers(PyObject* list) { - _process_list(list, true, NULL, NULL); +static int purge_pointers(PyObject* list) { + return _process_list(list, true, NULL, NULL); }; -static void invalidate_pointers(PyObject* py_self) { +static int invalidate_pointers(PyObject* py_self) { PyObject* list = private_store_get(py_self, "pointers"); if (list) - _process_list(list, false, NULL, NULL); + return _process_list(list, false, NULL, NULL); + return 0; }; -static void invalidate_pointers(PyObject* py_self, - Exiv2::ExifData::iterator pos) { +static int invalidate_pointers(PyObject* py_self, + Exiv2::ExifData::iterator pos) { PyObject* list = private_store_get(py_self, "pointers"); if (list) { Exiv2::ExifData::iterator end = pos; end++; - _process_list(list, false, &pos, &end); + return _process_list(list, false, &pos, &end); } + return 0; }; -static void invalidate_pointers(PyObject* py_self, - Exiv2::ExifData::iterator beg, - Exiv2::ExifData::iterator end) { +static int invalidate_pointers(PyObject* py_self, + Exiv2::ExifData::iterator beg, + Exiv2::ExifData::iterator end) { PyObject* list = private_store_get(py_self, "pointers"); if (list) - _process_list(list, false, &beg, &end); + return _process_list(list, false, &beg, &end); + return 0; }; static int store_pointer(PyObject* py_self, PyObject* py_ptr) { PyObject* list = private_store_get(py_self, "pointers"); - if (list) - purge_pointers(list); + if (list) { + if (purge_pointers(list) < 0) + return -1; + } else { list = PyList_New(0); if (!list) @@ -5891,7 +5899,8 @@ static PyObject* _delitem_Exiv2_ExifData( if (pos == self->end()) return PyErr_Format(PyExc_KeyError, "'%s'", key); #if 0x040401 >= 0x040400 - invalidate_pointers(py_self, pos); + if (invalidate_pointers(py_self, pos) < 0) + return NULL; #endif self->erase(pos); return SWIG_Py_Void(); @@ -10019,7 +10028,9 @@ SWIGINTERN PyObject *_wrap_ExifData_erase__SWIG_0(PyObject *self, Py_ssize_t nob arg2 = argp2->_ptr(); { - invalidate_pointers(self, arg2); + if (invalidate_pointers(self, arg2) < 0) { + SWIG_fail; + } } { try { @@ -10107,7 +10118,9 @@ SWIGINTERN PyObject *_wrap_ExifData_erase__SWIG_1(PyObject *self, Py_ssize_t nob arg3 = argp3->_ptr(); { - invalidate_pointers(self, arg2, arg3); + if (invalidate_pointers(self, arg2, arg3) < 0) { + SWIG_fail; + } } { try { @@ -10185,7 +10198,10 @@ SWIGINTERN PyObject *_wrap_ExifData_clear(PyObject *self, PyObject *args) { (arg1)->clear(); resultobj = SWIG_Py_Void(); { - invalidate_pointers(self); + if (invalidate_pointers(self) < 0) { + Py_DECREF(resultobj); + SWIG_fail; + } } return resultobj; fail: diff --git a/src/swig-0_28_7/iptc_wrap.cxx b/src/swig-0_28_7/iptc_wrap.cxx index bf666508..4f85f3c8 100644 --- a/src/swig-0_28_7/iptc_wrap.cxx +++ b/src/swig-0_28_7/iptc_wrap.cxx @@ -5798,13 +5798,15 @@ static int PyWeakref_GetRef(PyObject *ref, PyObject **pobj) { #endif -static void _process_list(PyObject* list, bool purge_only, - Exiv2::IptcData::iterator* beg, - Exiv2::IptcData::iterator* end) { +static int _process_list(PyObject* list, bool purge_only, + Exiv2::IptcData::iterator* beg, + Exiv2::IptcData::iterator* end) { PyObject* py_ptr = NULL; Iptcdatum_pointer* cpp_ptr = NULL; for (Py_ssize_t idx = PyList_Size(list); idx > 0; idx--) { - if (PyWeakref_GetRef(PyList_GetItem(list, idx-1), &py_ptr) == 1) + if (PyWeakref_GetRef(PyList_GetItem(list, idx-1), &py_ptr) < 0) + return -1; + if (py_ptr) Py_DECREF(py_ptr); else goto forget; @@ -5825,35 +5827,41 @@ static void _process_list(PyObject* list, bool purge_only, PyList_SetSlice(list, idx-1, idx, NULL); continue; } + return 0; }; -static void purge_pointers(PyObject* list) { - _process_list(list, true, NULL, NULL); +static int purge_pointers(PyObject* list) { + return _process_list(list, true, NULL, NULL); }; -static void invalidate_pointers(PyObject* py_self) { +static int invalidate_pointers(PyObject* py_self) { PyObject* list = private_store_get(py_self, "pointers"); if (list) - _process_list(list, false, NULL, NULL); + return _process_list(list, false, NULL, NULL); + return 0; }; -static void invalidate_pointers(PyObject* py_self, - Exiv2::IptcData::iterator pos) { +static int invalidate_pointers(PyObject* py_self, + Exiv2::IptcData::iterator pos) { PyObject* list = private_store_get(py_self, "pointers"); if (list) { Exiv2::IptcData::iterator end = pos; end++; - _process_list(list, false, &pos, &end); + return _process_list(list, false, &pos, &end); } + return 0; }; -static void invalidate_pointers(PyObject* py_self, - Exiv2::IptcData::iterator beg, - Exiv2::IptcData::iterator end) { +static int invalidate_pointers(PyObject* py_self, + Exiv2::IptcData::iterator beg, + Exiv2::IptcData::iterator end) { PyObject* list = private_store_get(py_self, "pointers"); if (list) - _process_list(list, false, &beg, &end); + return _process_list(list, false, &beg, &end); + return 0; }; static int store_pointer(PyObject* py_self, PyObject* py_ptr) { PyObject* list = private_store_get(py_self, "pointers"); - if (list) - purge_pointers(list); + if (list) { + if (purge_pointers(list) < 0) + return -1; + } else { list = PyList_New(0); if (!list) @@ -5883,7 +5891,8 @@ static PyObject* _delitem_Exiv2_IptcData( if (pos == self->end()) return PyErr_Format(PyExc_KeyError, "'%s'", key); #if 0x040401 >= 0x040400 - invalidate_pointers(py_self, pos); + if (invalidate_pointers(py_self, pos) < 0) + return NULL; #endif self->erase(pos); return SWIG_Py_Void(); @@ -9074,7 +9083,9 @@ SWIGINTERN PyObject *_wrap_IptcData_erase(PyObject *self, PyObject *args) { arg2 = argp2->_ptr(); { - invalidate_pointers(self, arg2); + if (invalidate_pointers(self, arg2) < 0) { + SWIG_fail; + } } { try { @@ -9123,7 +9134,10 @@ SWIGINTERN PyObject *_wrap_IptcData_clear(PyObject *self, PyObject *args) { (arg1)->clear(); resultobj = SWIG_Py_Void(); { - invalidate_pointers(self); + if (invalidate_pointers(self) < 0) { + Py_DECREF(resultobj); + SWIG_fail; + } } return resultobj; fail: diff --git a/src/swig-0_28_7/xmp_wrap.cxx b/src/swig-0_28_7/xmp_wrap.cxx index 438fc178..2e76fcea 100644 --- a/src/swig-0_28_7/xmp_wrap.cxx +++ b/src/swig-0_28_7/xmp_wrap.cxx @@ -5801,13 +5801,15 @@ static int PyWeakref_GetRef(PyObject *ref, PyObject **pobj) { #endif -static void _process_list(PyObject* list, bool purge_only, - Exiv2::XmpData::iterator* beg, - Exiv2::XmpData::iterator* end) { +static int _process_list(PyObject* list, bool purge_only, + Exiv2::XmpData::iterator* beg, + Exiv2::XmpData::iterator* end) { PyObject* py_ptr = NULL; Xmpdatum_pointer* cpp_ptr = NULL; for (Py_ssize_t idx = PyList_Size(list); idx > 0; idx--) { - if (PyWeakref_GetRef(PyList_GetItem(list, idx-1), &py_ptr) == 1) + if (PyWeakref_GetRef(PyList_GetItem(list, idx-1), &py_ptr) < 0) + return -1; + if (py_ptr) Py_DECREF(py_ptr); else goto forget; @@ -5828,35 +5830,41 @@ static void _process_list(PyObject* list, bool purge_only, PyList_SetSlice(list, idx-1, idx, NULL); continue; } + return 0; }; -static void purge_pointers(PyObject* list) { - _process_list(list, true, NULL, NULL); +static int purge_pointers(PyObject* list) { + return _process_list(list, true, NULL, NULL); }; -static void invalidate_pointers(PyObject* py_self) { +static int invalidate_pointers(PyObject* py_self) { PyObject* list = private_store_get(py_self, "pointers"); if (list) - _process_list(list, false, NULL, NULL); + return _process_list(list, false, NULL, NULL); + return 0; }; -static void invalidate_pointers(PyObject* py_self, - Exiv2::XmpData::iterator pos) { +static int invalidate_pointers(PyObject* py_self, + Exiv2::XmpData::iterator pos) { PyObject* list = private_store_get(py_self, "pointers"); if (list) { Exiv2::XmpData::iterator end = pos; end++; - _process_list(list, false, &pos, &end); + return _process_list(list, false, &pos, &end); } + return 0; }; -static void invalidate_pointers(PyObject* py_self, - Exiv2::XmpData::iterator beg, - Exiv2::XmpData::iterator end) { +static int invalidate_pointers(PyObject* py_self, + Exiv2::XmpData::iterator beg, + Exiv2::XmpData::iterator end) { PyObject* list = private_store_get(py_self, "pointers"); if (list) - _process_list(list, false, &beg, &end); + return _process_list(list, false, &beg, &end); + return 0; }; static int store_pointer(PyObject* py_self, PyObject* py_ptr) { PyObject* list = private_store_get(py_self, "pointers"); - if (list) - purge_pointers(list); + if (list) { + if (purge_pointers(list) < 0) + return -1; + } else { list = PyList_New(0); if (!list) @@ -5886,7 +5894,8 @@ static PyObject* _delitem_Exiv2_XmpData( if (pos == self->end()) return PyErr_Format(PyExc_KeyError, "'%s'", key); #if 0x040401 >= 0x040400 - invalidate_pointers(py_self, pos); + if (invalidate_pointers(py_self, pos) < 0) + return NULL; #endif self->erase(pos); return SWIG_Py_Void(); @@ -9006,7 +9015,9 @@ SWIGINTERN PyObject *_wrap_XmpData_erase(PyObject *self, PyObject *args) { arg2 = argp2->_ptr(); { - invalidate_pointers(self, arg2); + if (invalidate_pointers(self, arg2) < 0) { + SWIG_fail; + } } { try { @@ -9077,7 +9088,9 @@ SWIGINTERN PyObject *_wrap_XmpData_eraseFamily(PyObject *self, PyObject *args) { arg2 = &it2; } { - invalidate_pointers(self, *arg2, arg1->end()); + if (invalidate_pointers(self, *arg2, arg1->end()) < 0) { + SWIG_fail; + } } { try { @@ -9110,7 +9123,10 @@ SWIGINTERN PyObject *_wrap_XmpData_clear(PyObject *self, PyObject *args) { (arg1)->clear(); resultobj = SWIG_Py_Void(); { - invalidate_pointers(self); + if (invalidate_pointers(self) < 0) { + Py_DECREF(resultobj); + SWIG_fail; + } } return resultobj; fail: diff --git a/src/swig-0_28_8/exif_wrap.cxx b/src/swig-0_28_8/exif_wrap.cxx index c51ce0a0..ea759dac 100644 --- a/src/swig-0_28_8/exif_wrap.cxx +++ b/src/swig-0_28_8/exif_wrap.cxx @@ -5806,13 +5806,15 @@ static int PyWeakref_GetRef(PyObject *ref, PyObject **pobj) { #endif -static void _process_list(PyObject* list, bool purge_only, - Exiv2::ExifData::iterator* beg, - Exiv2::ExifData::iterator* end) { +static int _process_list(PyObject* list, bool purge_only, + Exiv2::ExifData::iterator* beg, + Exiv2::ExifData::iterator* end) { PyObject* py_ptr = NULL; Exifdatum_pointer* cpp_ptr = NULL; for (Py_ssize_t idx = PyList_Size(list); idx > 0; idx--) { - if (PyWeakref_GetRef(PyList_GetItem(list, idx-1), &py_ptr) == 1) + if (PyWeakref_GetRef(PyList_GetItem(list, idx-1), &py_ptr) < 0) + return -1; + if (py_ptr) Py_DECREF(py_ptr); else goto forget; @@ -5833,35 +5835,41 @@ static void _process_list(PyObject* list, bool purge_only, PyList_SetSlice(list, idx-1, idx, NULL); continue; } + return 0; }; -static void purge_pointers(PyObject* list) { - _process_list(list, true, NULL, NULL); +static int purge_pointers(PyObject* list) { + return _process_list(list, true, NULL, NULL); }; -static void invalidate_pointers(PyObject* py_self) { +static int invalidate_pointers(PyObject* py_self) { PyObject* list = private_store_get(py_self, "pointers"); if (list) - _process_list(list, false, NULL, NULL); + return _process_list(list, false, NULL, NULL); + return 0; }; -static void invalidate_pointers(PyObject* py_self, - Exiv2::ExifData::iterator pos) { +static int invalidate_pointers(PyObject* py_self, + Exiv2::ExifData::iterator pos) { PyObject* list = private_store_get(py_self, "pointers"); if (list) { Exiv2::ExifData::iterator end = pos; end++; - _process_list(list, false, &pos, &end); + return _process_list(list, false, &pos, &end); } + return 0; }; -static void invalidate_pointers(PyObject* py_self, - Exiv2::ExifData::iterator beg, - Exiv2::ExifData::iterator end) { +static int invalidate_pointers(PyObject* py_self, + Exiv2::ExifData::iterator beg, + Exiv2::ExifData::iterator end) { PyObject* list = private_store_get(py_self, "pointers"); if (list) - _process_list(list, false, &beg, &end); + return _process_list(list, false, &beg, &end); + return 0; }; static int store_pointer(PyObject* py_self, PyObject* py_ptr) { PyObject* list = private_store_get(py_self, "pointers"); - if (list) - purge_pointers(list); + if (list) { + if (purge_pointers(list) < 0) + return -1; + } else { list = PyList_New(0); if (!list) @@ -5891,7 +5899,8 @@ static PyObject* _delitem_Exiv2_ExifData( if (pos == self->end()) return PyErr_Format(PyExc_KeyError, "'%s'", key); #if 0x040401 >= 0x040400 - invalidate_pointers(py_self, pos); + if (invalidate_pointers(py_self, pos) < 0) + return NULL; #endif self->erase(pos); return SWIG_Py_Void(); @@ -10019,7 +10028,9 @@ SWIGINTERN PyObject *_wrap_ExifData_erase__SWIG_0(PyObject *self, Py_ssize_t nob arg2 = argp2->_ptr(); { - invalidate_pointers(self, arg2); + if (invalidate_pointers(self, arg2) < 0) { + SWIG_fail; + } } { try { @@ -10107,7 +10118,9 @@ SWIGINTERN PyObject *_wrap_ExifData_erase__SWIG_1(PyObject *self, Py_ssize_t nob arg3 = argp3->_ptr(); { - invalidate_pointers(self, arg2, arg3); + if (invalidate_pointers(self, arg2, arg3) < 0) { + SWIG_fail; + } } { try { @@ -10185,7 +10198,10 @@ SWIGINTERN PyObject *_wrap_ExifData_clear(PyObject *self, PyObject *args) { (arg1)->clear(); resultobj = SWIG_Py_Void(); { - invalidate_pointers(self); + if (invalidate_pointers(self) < 0) { + Py_DECREF(resultobj); + SWIG_fail; + } } return resultobj; fail: diff --git a/src/swig-0_28_8/iptc_wrap.cxx b/src/swig-0_28_8/iptc_wrap.cxx index bf666508..4f85f3c8 100644 --- a/src/swig-0_28_8/iptc_wrap.cxx +++ b/src/swig-0_28_8/iptc_wrap.cxx @@ -5798,13 +5798,15 @@ static int PyWeakref_GetRef(PyObject *ref, PyObject **pobj) { #endif -static void _process_list(PyObject* list, bool purge_only, - Exiv2::IptcData::iterator* beg, - Exiv2::IptcData::iterator* end) { +static int _process_list(PyObject* list, bool purge_only, + Exiv2::IptcData::iterator* beg, + Exiv2::IptcData::iterator* end) { PyObject* py_ptr = NULL; Iptcdatum_pointer* cpp_ptr = NULL; for (Py_ssize_t idx = PyList_Size(list); idx > 0; idx--) { - if (PyWeakref_GetRef(PyList_GetItem(list, idx-1), &py_ptr) == 1) + if (PyWeakref_GetRef(PyList_GetItem(list, idx-1), &py_ptr) < 0) + return -1; + if (py_ptr) Py_DECREF(py_ptr); else goto forget; @@ -5825,35 +5827,41 @@ static void _process_list(PyObject* list, bool purge_only, PyList_SetSlice(list, idx-1, idx, NULL); continue; } + return 0; }; -static void purge_pointers(PyObject* list) { - _process_list(list, true, NULL, NULL); +static int purge_pointers(PyObject* list) { + return _process_list(list, true, NULL, NULL); }; -static void invalidate_pointers(PyObject* py_self) { +static int invalidate_pointers(PyObject* py_self) { PyObject* list = private_store_get(py_self, "pointers"); if (list) - _process_list(list, false, NULL, NULL); + return _process_list(list, false, NULL, NULL); + return 0; }; -static void invalidate_pointers(PyObject* py_self, - Exiv2::IptcData::iterator pos) { +static int invalidate_pointers(PyObject* py_self, + Exiv2::IptcData::iterator pos) { PyObject* list = private_store_get(py_self, "pointers"); if (list) { Exiv2::IptcData::iterator end = pos; end++; - _process_list(list, false, &pos, &end); + return _process_list(list, false, &pos, &end); } + return 0; }; -static void invalidate_pointers(PyObject* py_self, - Exiv2::IptcData::iterator beg, - Exiv2::IptcData::iterator end) { +static int invalidate_pointers(PyObject* py_self, + Exiv2::IptcData::iterator beg, + Exiv2::IptcData::iterator end) { PyObject* list = private_store_get(py_self, "pointers"); if (list) - _process_list(list, false, &beg, &end); + return _process_list(list, false, &beg, &end); + return 0; }; static int store_pointer(PyObject* py_self, PyObject* py_ptr) { PyObject* list = private_store_get(py_self, "pointers"); - if (list) - purge_pointers(list); + if (list) { + if (purge_pointers(list) < 0) + return -1; + } else { list = PyList_New(0); if (!list) @@ -5883,7 +5891,8 @@ static PyObject* _delitem_Exiv2_IptcData( if (pos == self->end()) return PyErr_Format(PyExc_KeyError, "'%s'", key); #if 0x040401 >= 0x040400 - invalidate_pointers(py_self, pos); + if (invalidate_pointers(py_self, pos) < 0) + return NULL; #endif self->erase(pos); return SWIG_Py_Void(); @@ -9074,7 +9083,9 @@ SWIGINTERN PyObject *_wrap_IptcData_erase(PyObject *self, PyObject *args) { arg2 = argp2->_ptr(); { - invalidate_pointers(self, arg2); + if (invalidate_pointers(self, arg2) < 0) { + SWIG_fail; + } } { try { @@ -9123,7 +9134,10 @@ SWIGINTERN PyObject *_wrap_IptcData_clear(PyObject *self, PyObject *args) { (arg1)->clear(); resultobj = SWIG_Py_Void(); { - invalidate_pointers(self); + if (invalidate_pointers(self) < 0) { + Py_DECREF(resultobj); + SWIG_fail; + } } return resultobj; fail: diff --git a/src/swig-0_28_8/xmp_wrap.cxx b/src/swig-0_28_8/xmp_wrap.cxx index 438fc178..2e76fcea 100644 --- a/src/swig-0_28_8/xmp_wrap.cxx +++ b/src/swig-0_28_8/xmp_wrap.cxx @@ -5801,13 +5801,15 @@ static int PyWeakref_GetRef(PyObject *ref, PyObject **pobj) { #endif -static void _process_list(PyObject* list, bool purge_only, - Exiv2::XmpData::iterator* beg, - Exiv2::XmpData::iterator* end) { +static int _process_list(PyObject* list, bool purge_only, + Exiv2::XmpData::iterator* beg, + Exiv2::XmpData::iterator* end) { PyObject* py_ptr = NULL; Xmpdatum_pointer* cpp_ptr = NULL; for (Py_ssize_t idx = PyList_Size(list); idx > 0; idx--) { - if (PyWeakref_GetRef(PyList_GetItem(list, idx-1), &py_ptr) == 1) + if (PyWeakref_GetRef(PyList_GetItem(list, idx-1), &py_ptr) < 0) + return -1; + if (py_ptr) Py_DECREF(py_ptr); else goto forget; @@ -5828,35 +5830,41 @@ static void _process_list(PyObject* list, bool purge_only, PyList_SetSlice(list, idx-1, idx, NULL); continue; } + return 0; }; -static void purge_pointers(PyObject* list) { - _process_list(list, true, NULL, NULL); +static int purge_pointers(PyObject* list) { + return _process_list(list, true, NULL, NULL); }; -static void invalidate_pointers(PyObject* py_self) { +static int invalidate_pointers(PyObject* py_self) { PyObject* list = private_store_get(py_self, "pointers"); if (list) - _process_list(list, false, NULL, NULL); + return _process_list(list, false, NULL, NULL); + return 0; }; -static void invalidate_pointers(PyObject* py_self, - Exiv2::XmpData::iterator pos) { +static int invalidate_pointers(PyObject* py_self, + Exiv2::XmpData::iterator pos) { PyObject* list = private_store_get(py_self, "pointers"); if (list) { Exiv2::XmpData::iterator end = pos; end++; - _process_list(list, false, &pos, &end); + return _process_list(list, false, &pos, &end); } + return 0; }; -static void invalidate_pointers(PyObject* py_self, - Exiv2::XmpData::iterator beg, - Exiv2::XmpData::iterator end) { +static int invalidate_pointers(PyObject* py_self, + Exiv2::XmpData::iterator beg, + Exiv2::XmpData::iterator end) { PyObject* list = private_store_get(py_self, "pointers"); if (list) - _process_list(list, false, &beg, &end); + return _process_list(list, false, &beg, &end); + return 0; }; static int store_pointer(PyObject* py_self, PyObject* py_ptr) { PyObject* list = private_store_get(py_self, "pointers"); - if (list) - purge_pointers(list); + if (list) { + if (purge_pointers(list) < 0) + return -1; + } else { list = PyList_New(0); if (!list) @@ -5886,7 +5894,8 @@ static PyObject* _delitem_Exiv2_XmpData( if (pos == self->end()) return PyErr_Format(PyExc_KeyError, "'%s'", key); #if 0x040401 >= 0x040400 - invalidate_pointers(py_self, pos); + if (invalidate_pointers(py_self, pos) < 0) + return NULL; #endif self->erase(pos); return SWIG_Py_Void(); @@ -9006,7 +9015,9 @@ SWIGINTERN PyObject *_wrap_XmpData_erase(PyObject *self, PyObject *args) { arg2 = argp2->_ptr(); { - invalidate_pointers(self, arg2); + if (invalidate_pointers(self, arg2) < 0) { + SWIG_fail; + } } { try { @@ -9077,7 +9088,9 @@ SWIGINTERN PyObject *_wrap_XmpData_eraseFamily(PyObject *self, PyObject *args) { arg2 = &it2; } { - invalidate_pointers(self, *arg2, arg1->end()); + if (invalidate_pointers(self, *arg2, arg1->end()) < 0) { + SWIG_fail; + } } { try { @@ -9110,7 +9123,10 @@ SWIGINTERN PyObject *_wrap_XmpData_clear(PyObject *self, PyObject *args) { (arg1)->clear(); resultobj = SWIG_Py_Void(); { - invalidate_pointers(self); + if (invalidate_pointers(self) < 0) { + Py_DECREF(resultobj); + SWIG_fail; + } } return resultobj; fail: From d02c7521d8eb9542a3624fd18c5ba4c0daa5de0b Mon Sep 17 00:00:00 2001 From: Jim Easterbrook Date: Mon, 22 Jun 2026 16:54:54 +0100 Subject: [PATCH 07/13] Fix potential memory leak This would only occur under error conditions which I've not seen happening. --- src/interface/shared/keep_reference.i | 3 ++- src/swig-0_27_7/exif_wrap.cxx | 12 ++++++++++++ src/swig-0_27_7/image_wrap.cxx | 5 +++++ src/swig-0_27_7/iptc_wrap.cxx | 12 ++++++++++++ src/swig-0_27_7/metadatum_wrap.cxx | 1 + src/swig-0_27_7/preview_wrap.cxx | 1 + src/swig-0_27_7/xmp_wrap.cxx | 10 ++++++++++ src/swig-0_28_7/exif_wrap.cxx | 12 ++++++++++++ src/swig-0_28_7/image_wrap.cxx | 5 +++++ src/swig-0_28_7/iptc_wrap.cxx | 12 ++++++++++++ src/swig-0_28_7/metadatum_wrap.cxx | 1 + src/swig-0_28_7/preview_wrap.cxx | 1 + src/swig-0_28_7/xmp_wrap.cxx | 10 ++++++++++ src/swig-0_28_8/exif_wrap.cxx | 12 ++++++++++++ src/swig-0_28_8/image_wrap.cxx | 5 +++++ src/swig-0_28_8/iptc_wrap.cxx | 12 ++++++++++++ src/swig-0_28_8/metadatum_wrap.cxx | 1 + src/swig-0_28_8/preview_wrap.cxx | 1 + src/swig-0_28_8/xmp_wrap.cxx | 10 ++++++++++ 19 files changed, 125 insertions(+), 1 deletion(-) diff --git a/src/interface/shared/keep_reference.i b/src/interface/shared/keep_reference.i index 943fc97d..229cc949 100644 --- a/src/interface/shared/keep_reference.i +++ b/src/interface/shared/keep_reference.i @@ -1,6 +1,6 @@ // python-exiv2 - Python interface to libexiv2 // http://github.com/jim-easterbrook/python-exiv2 -// Copyright (C) 2023-25 Jim Easterbrook jim@jim-easterbrook.me.uk +// Copyright (C) 2023-26 Jim Easterbrook jim@jim-easterbrook.me.uk // // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by @@ -23,6 +23,7 @@ %typemap(ret, fragment="private_data") return_type %{ if ($result != Py_None) if (private_store_set($result, "refers_to", target)) { + Py_DECREF($result); SWIG_fail; } %} diff --git a/src/swig-0_27_7/exif_wrap.cxx b/src/swig-0_27_7/exif_wrap.cxx index d8514780..1f9d31cc 100644 --- a/src/swig-0_27_7/exif_wrap.cxx +++ b/src/swig-0_27_7/exif_wrap.cxx @@ -6953,6 +6953,7 @@ SWIGINTERN PyObject *_wrap_Exifdatum_pointer_value__SWIG_0(PyObject *self, Py_ss if (resultobj != Py_None) if (private_store_set(resultobj, "refers_to", self)) { + Py_DECREF(resultobj); SWIG_fail; } @@ -7003,6 +7004,7 @@ SWIGINTERN PyObject *_wrap_Exifdatum_pointer_value__SWIG_1(PyObject *self, Py_ss if (resultobj != Py_None) if (private_store_set(resultobj, "refers_to", self)) { + Py_DECREF(resultobj); SWIG_fail; } @@ -7335,6 +7337,7 @@ SWIGINTERN PyObject *_wrap_ExifData_iterator___iter__(PyObject *self, PyObject * if (resultobj != Py_None) if (private_store_set(resultobj, "refers_to", self)) { + Py_DECREF(resultobj); SWIG_fail; } @@ -7482,6 +7485,7 @@ SWIGINTERN PyObject *_wrap__getitem_Exiv2_ExifData(PyObject *self, PyObject *arg if (resultobj != Py_None) if (private_store_set(resultobj, "refers_to", self)) { + Py_DECREF(resultobj); SWIG_fail; } @@ -8552,6 +8556,7 @@ SWIGINTERN PyObject *_wrap_Exifdatum_value__SWIG_0(PyObject *self, Py_ssize_t no if (resultobj != Py_None) if (private_store_set(resultobj, "refers_to", self)) { + Py_DECREF(resultobj); SWIG_fail; } @@ -8853,6 +8858,7 @@ SWIGINTERN PyObject *_wrap_Exifdatum_value__SWIG_1(PyObject *self, Py_ssize_t no if (resultobj != Py_None) if (private_store_set(resultobj, "refers_to", self)) { + Py_DECREF(resultobj); SWIG_fail; } @@ -9309,6 +9315,7 @@ SWIGINTERN int _wrap_new_ExifThumb(PyObject *self, PyObject *args, PyObject *kwa if (resultobj != Py_None) if (private_store_set(resultobj, "refers_to", args)) { + Py_DECREF(resultobj); SWIG_fail; } @@ -9887,6 +9894,7 @@ SWIGINTERN PyObject *_wrap_ExifData_erase__SWIG_0(PyObject *self, Py_ssize_t nob if (resultobj != Py_None) if (private_store_set(resultobj, "refers_to", self)) { + Py_DECREF(resultobj); SWIG_fail; } @@ -9977,6 +9985,7 @@ SWIGINTERN PyObject *_wrap_ExifData_erase__SWIG_1(PyObject *self, Py_ssize_t nob if (resultobj != Py_None) if (private_store_set(resultobj, "refers_to", self)) { + Py_DECREF(resultobj); SWIG_fail; } @@ -10125,6 +10134,7 @@ SWIGINTERN PyObject *_wrap_ExifData_begin(PyObject *self, PyObject *args) { if (resultobj != Py_None) if (private_store_set(resultobj, "refers_to", self)) { + Py_DECREF(resultobj); SWIG_fail; } @@ -10162,6 +10172,7 @@ SWIGINTERN PyObject *_wrap_ExifData_end(PyObject *self, PyObject *args) { if (resultobj != Py_None) if (private_store_set(resultobj, "refers_to", self)) { + Py_DECREF(resultobj); SWIG_fail; } @@ -10220,6 +10231,7 @@ SWIGINTERN PyObject *_wrap_ExifData_findKey(PyObject *self, PyObject *args) { if (resultobj != Py_None) if (private_store_set(resultobj, "refers_to", self)) { + Py_DECREF(resultobj); SWIG_fail; } diff --git a/src/swig-0_27_7/image_wrap.cxx b/src/swig-0_27_7/image_wrap.cxx index 5029898e..0d8d88e2 100644 --- a/src/swig-0_27_7/image_wrap.cxx +++ b/src/swig-0_27_7/image_wrap.cxx @@ -6086,6 +6086,7 @@ SWIGINTERN PyObject *_wrap_Image_iccProfile(PyObject *self, PyObject *args) { if (resultobj != Py_None) if (private_store_set(resultobj, "refers_to", self)) { + Py_DECREF(resultobj); SWIG_fail; } @@ -6211,6 +6212,7 @@ SWIGINTERN PyObject *_wrap_Image_exifData(PyObject *self, PyObject *args) { if (resultobj != Py_None) if (private_store_set(resultobj, "refers_to", self)) { + Py_DECREF(resultobj); SWIG_fail; } @@ -6253,6 +6255,7 @@ SWIGINTERN PyObject *_wrap_Image_iptcData(PyObject *self, PyObject *args) { if (resultobj != Py_None) if (private_store_set(resultobj, "refers_to", self)) { + Py_DECREF(resultobj); SWIG_fail; } @@ -6295,6 +6298,7 @@ SWIGINTERN PyObject *_wrap_Image_xmpData(PyObject *self, PyObject *args) { if (resultobj != Py_None) if (private_store_set(resultobj, "refers_to", self)) { + Py_DECREF(resultobj); SWIG_fail; } @@ -6686,6 +6690,7 @@ SWIGINTERN PyObject *_wrap_Image_io(PyObject *self, PyObject *args) { if (resultobj != Py_None) if (private_store_set(resultobj, "refers_to", self)) { + Py_DECREF(resultobj); SWIG_fail; } diff --git a/src/swig-0_27_7/iptc_wrap.cxx b/src/swig-0_27_7/iptc_wrap.cxx index 9a7b7980..e1cfc678 100644 --- a/src/swig-0_27_7/iptc_wrap.cxx +++ b/src/swig-0_27_7/iptc_wrap.cxx @@ -6811,6 +6811,7 @@ SWIGINTERN PyObject *_wrap_Iptcdatum_pointer_value__SWIG_0(PyObject *self, Py_ss if (resultobj != Py_None) if (private_store_set(resultobj, "refers_to", self)) { + Py_DECREF(resultobj); SWIG_fail; } @@ -6861,6 +6862,7 @@ SWIGINTERN PyObject *_wrap_Iptcdatum_pointer_value__SWIG_1(PyObject *self, Py_ss if (resultobj != Py_None) if (private_store_set(resultobj, "refers_to", self)) { + Py_DECREF(resultobj); SWIG_fail; } @@ -7132,6 +7134,7 @@ SWIGINTERN PyObject *_wrap_IptcData_iterator___iter__(PyObject *self, PyObject * if (resultobj != Py_None) if (private_store_set(resultobj, "refers_to", self)) { + Py_DECREF(resultobj); SWIG_fail; } @@ -7279,6 +7282,7 @@ SWIGINTERN PyObject *_wrap__getitem_Exiv2_IptcData(PyObject *self, PyObject *arg if (resultobj != Py_None) if (private_store_set(resultobj, "refers_to", self)) { + Py_DECREF(resultobj); SWIG_fail; } @@ -8295,6 +8299,7 @@ SWIGINTERN PyObject *_wrap_Iptcdatum_value__SWIG_0(PyObject *self, Py_ssize_t no if (resultobj != Py_None) if (private_store_set(resultobj, "refers_to", self)) { + Py_DECREF(resultobj); SWIG_fail; } @@ -8535,6 +8540,7 @@ SWIGINTERN PyObject *_wrap_Iptcdatum_value__SWIG_1(PyObject *self, Py_ssize_t no if (resultobj != Py_None) if (private_store_set(resultobj, "refers_to", self)) { + Py_DECREF(resultobj); SWIG_fail; } @@ -8935,6 +8941,7 @@ SWIGINTERN PyObject *_wrap_IptcData_erase(PyObject *self, PyObject *args) { if (resultobj != Py_None) if (private_store_set(resultobj, "refers_to", self)) { + Py_DECREF(resultobj); SWIG_fail; } @@ -9054,6 +9061,7 @@ SWIGINTERN PyObject *_wrap_IptcData_begin(PyObject *self, PyObject *args) { if (resultobj != Py_None) if (private_store_set(resultobj, "refers_to", self)) { + Py_DECREF(resultobj); SWIG_fail; } @@ -9091,6 +9099,7 @@ SWIGINTERN PyObject *_wrap_IptcData_end(PyObject *self, PyObject *args) { if (resultobj != Py_None) if (private_store_set(resultobj, "refers_to", self)) { + Py_DECREF(resultobj); SWIG_fail; } @@ -9149,6 +9158,7 @@ SWIGINTERN PyObject *_wrap_IptcData_findKey(PyObject *self, PyObject *args) { if (resultobj != Py_None) if (private_store_set(resultobj, "refers_to", self)) { + Py_DECREF(resultobj); SWIG_fail; } @@ -9210,6 +9220,7 @@ SWIGINTERN PyObject *_wrap_IptcData_findId__SWIG_0(PyObject *self, Py_ssize_t no if (resultobj != Py_None) if (private_store_set(resultobj, "refers_to", self)) { + Py_DECREF(resultobj); SWIG_fail; } @@ -9263,6 +9274,7 @@ SWIGINTERN PyObject *_wrap_IptcData_findId__SWIG_1(PyObject *self, Py_ssize_t no if (resultobj != Py_None) if (private_store_set(resultobj, "refers_to", self)) { + Py_DECREF(resultobj); SWIG_fail; } diff --git a/src/swig-0_27_7/metadatum_wrap.cxx b/src/swig-0_27_7/metadatum_wrap.cxx index ebc8c024..63bbf0b1 100644 --- a/src/swig-0_27_7/metadatum_wrap.cxx +++ b/src/swig-0_27_7/metadatum_wrap.cxx @@ -6665,6 +6665,7 @@ SWIGINTERN PyObject *_wrap_Metadatum_value(PyObject *self, PyObject *args) { if (resultobj != Py_None) if (private_store_set(resultobj, "refers_to", self)) { + Py_DECREF(resultobj); SWIG_fail; } diff --git a/src/swig-0_27_7/preview_wrap.cxx b/src/swig-0_27_7/preview_wrap.cxx index ddc89fda..2a3f0963 100644 --- a/src/swig-0_27_7/preview_wrap.cxx +++ b/src/swig-0_27_7/preview_wrap.cxx @@ -6929,6 +6929,7 @@ SWIGINTERN int _wrap_new_PreviewManager(PyObject *self, PyObject *args, PyObject if (resultobj != Py_None) if (private_store_set(resultobj, "refers_to", args)) { + Py_DECREF(resultobj); SWIG_fail; } diff --git a/src/swig-0_27_7/xmp_wrap.cxx b/src/swig-0_27_7/xmp_wrap.cxx index 10582db4..d5829028 100644 --- a/src/swig-0_27_7/xmp_wrap.cxx +++ b/src/swig-0_27_7/xmp_wrap.cxx @@ -6728,6 +6728,7 @@ SWIGINTERN PyObject *_wrap_Xmpdatum_pointer_value__SWIG_0(PyObject *self, Py_ssi if (resultobj != Py_None) if (private_store_set(resultobj, "refers_to", self)) { + Py_DECREF(resultobj); SWIG_fail; } @@ -6778,6 +6779,7 @@ SWIGINTERN PyObject *_wrap_Xmpdatum_pointer_value__SWIG_1(PyObject *self, Py_ssi if (resultobj != Py_None) if (private_store_set(resultobj, "refers_to", self)) { + Py_DECREF(resultobj); SWIG_fail; } @@ -7049,6 +7051,7 @@ SWIGINTERN PyObject *_wrap_XmpData_iterator___iter__(PyObject *self, PyObject *a if (resultobj != Py_None) if (private_store_set(resultobj, "refers_to", self)) { + Py_DECREF(resultobj); SWIG_fail; } @@ -7196,6 +7199,7 @@ SWIGINTERN PyObject *_wrap__getitem_Exiv2_XmpData(PyObject *self, PyObject *args if (resultobj != Py_None) if (private_store_set(resultobj, "refers_to", self)) { + Py_DECREF(resultobj); SWIG_fail; } @@ -8153,6 +8157,7 @@ SWIGINTERN PyObject *_wrap_Xmpdatum_value__SWIG_0(PyObject *self, Py_ssize_t nob if (resultobj != Py_None) if (private_store_set(resultobj, "refers_to", self)) { + Py_DECREF(resultobj); SWIG_fail; } @@ -8393,6 +8398,7 @@ SWIGINTERN PyObject *_wrap_Xmpdatum_value__SWIG_1(PyObject *self, Py_ssize_t nob if (resultobj != Py_None) if (private_store_set(resultobj, "refers_to", self)) { + Py_DECREF(resultobj); SWIG_fail; } @@ -8815,6 +8821,7 @@ SWIGINTERN PyObject *_wrap_XmpData_erase(PyObject *self, PyObject *args) { if (resultobj != Py_None) if (private_store_set(resultobj, "refers_to", self)) { + Py_DECREF(resultobj); SWIG_fail; } @@ -8963,6 +8970,7 @@ SWIGINTERN PyObject *_wrap_XmpData_begin(PyObject *self, PyObject *args) { if (resultobj != Py_None) if (private_store_set(resultobj, "refers_to", self)) { + Py_DECREF(resultobj); SWIG_fail; } @@ -9000,6 +9008,7 @@ SWIGINTERN PyObject *_wrap_XmpData_end(PyObject *self, PyObject *args) { if (resultobj != Py_None) if (private_store_set(resultobj, "refers_to", self)) { + Py_DECREF(resultobj); SWIG_fail; } @@ -9058,6 +9067,7 @@ SWIGINTERN PyObject *_wrap_XmpData_findKey(PyObject *self, PyObject *args) { if (resultobj != Py_None) if (private_store_set(resultobj, "refers_to", self)) { + Py_DECREF(resultobj); SWIG_fail; } diff --git a/src/swig-0_28_7/exif_wrap.cxx b/src/swig-0_28_7/exif_wrap.cxx index ea759dac..2974d9fa 100644 --- a/src/swig-0_28_7/exif_wrap.cxx +++ b/src/swig-0_28_7/exif_wrap.cxx @@ -7067,6 +7067,7 @@ SWIGINTERN PyObject *_wrap_Exifdatum_pointer_value__SWIG_0(PyObject *self, Py_ss if (resultobj != Py_None) if (private_store_set(resultobj, "refers_to", self)) { + Py_DECREF(resultobj); SWIG_fail; } @@ -7117,6 +7118,7 @@ SWIGINTERN PyObject *_wrap_Exifdatum_pointer_value__SWIG_1(PyObject *self, Py_ss if (resultobj != Py_None) if (private_store_set(resultobj, "refers_to", self)) { + Py_DECREF(resultobj); SWIG_fail; } @@ -7492,6 +7494,7 @@ SWIGINTERN PyObject *_wrap_ExifData_iterator___iter__(PyObject *self, PyObject * if (resultobj != Py_None) if (private_store_set(resultobj, "refers_to", self)) { + Py_DECREF(resultobj); SWIG_fail; } @@ -7639,6 +7642,7 @@ SWIGINTERN PyObject *_wrap__getitem_Exiv2_ExifData(PyObject *self, PyObject *arg if (resultobj != Py_None) if (private_store_set(resultobj, "refers_to", self)) { + Py_DECREF(resultobj); SWIG_fail; } @@ -8720,6 +8724,7 @@ SWIGINTERN PyObject *_wrap_Exifdatum_value__SWIG_0(PyObject *self, Py_ssize_t no if (resultobj != Py_None) if (private_store_set(resultobj, "refers_to", self)) { + Py_DECREF(resultobj); SWIG_fail; } @@ -9021,6 +9026,7 @@ SWIGINTERN PyObject *_wrap_Exifdatum_value__SWIG_1(PyObject *self, Py_ssize_t no if (resultobj != Py_None) if (private_store_set(resultobj, "refers_to", self)) { + Py_DECREF(resultobj); SWIG_fail; } @@ -9477,6 +9483,7 @@ SWIGINTERN int _wrap_new_ExifThumb(PyObject *self, PyObject *args, PyObject *kwa if (resultobj != Py_None) if (private_store_set(resultobj, "refers_to", args)) { + Py_DECREF(resultobj); SWIG_fail; } @@ -10055,6 +10062,7 @@ SWIGINTERN PyObject *_wrap_ExifData_erase__SWIG_0(PyObject *self, Py_ssize_t nob if (resultobj != Py_None) if (private_store_set(resultobj, "refers_to", self)) { + Py_DECREF(resultobj); SWIG_fail; } @@ -10145,6 +10153,7 @@ SWIGINTERN PyObject *_wrap_ExifData_erase__SWIG_1(PyObject *self, Py_ssize_t nob if (resultobj != Py_None) if (private_store_set(resultobj, "refers_to", self)) { + Py_DECREF(resultobj); SWIG_fail; } @@ -10293,6 +10302,7 @@ SWIGINTERN PyObject *_wrap_ExifData_begin(PyObject *self, PyObject *args) { if (resultobj != Py_None) if (private_store_set(resultobj, "refers_to", self)) { + Py_DECREF(resultobj); SWIG_fail; } @@ -10330,6 +10340,7 @@ SWIGINTERN PyObject *_wrap_ExifData_end(PyObject *self, PyObject *args) { if (resultobj != Py_None) if (private_store_set(resultobj, "refers_to", self)) { + Py_DECREF(resultobj); SWIG_fail; } @@ -10388,6 +10399,7 @@ SWIGINTERN PyObject *_wrap_ExifData_findKey(PyObject *self, PyObject *args) { if (resultobj != Py_None) if (private_store_set(resultobj, "refers_to", self)) { + Py_DECREF(resultobj); SWIG_fail; } diff --git a/src/swig-0_28_7/image_wrap.cxx b/src/swig-0_28_7/image_wrap.cxx index 678ebbc9..1b7a1c7c 100644 --- a/src/swig-0_28_7/image_wrap.cxx +++ b/src/swig-0_28_7/image_wrap.cxx @@ -6140,6 +6140,7 @@ SWIGINTERN PyObject *_wrap_Image_iccProfile(PyObject *self, PyObject *args) { if (resultobj != Py_None) if (private_store_set(resultobj, "refers_to", self)) { + Py_DECREF(resultobj); SWIG_fail; } @@ -6265,6 +6266,7 @@ SWIGINTERN PyObject *_wrap_Image_exifData(PyObject *self, PyObject *args) { if (resultobj != Py_None) if (private_store_set(resultobj, "refers_to", self)) { + Py_DECREF(resultobj); SWIG_fail; } @@ -6307,6 +6309,7 @@ SWIGINTERN PyObject *_wrap_Image_iptcData(PyObject *self, PyObject *args) { if (resultobj != Py_None) if (private_store_set(resultobj, "refers_to", self)) { + Py_DECREF(resultobj); SWIG_fail; } @@ -6349,6 +6352,7 @@ SWIGINTERN PyObject *_wrap_Image_xmpData(PyObject *self, PyObject *args) { if (resultobj != Py_None) if (private_store_set(resultobj, "refers_to", self)) { + Py_DECREF(resultobj); SWIG_fail; } @@ -6740,6 +6744,7 @@ SWIGINTERN PyObject *_wrap_Image_io(PyObject *self, PyObject *args) { if (resultobj != Py_None) if (private_store_set(resultobj, "refers_to", self)) { + Py_DECREF(resultobj); SWIG_fail; } diff --git a/src/swig-0_28_7/iptc_wrap.cxx b/src/swig-0_28_7/iptc_wrap.cxx index 4f85f3c8..ee9b6eee 100644 --- a/src/swig-0_28_7/iptc_wrap.cxx +++ b/src/swig-0_28_7/iptc_wrap.cxx @@ -6932,6 +6932,7 @@ SWIGINTERN PyObject *_wrap_Iptcdatum_pointer_value__SWIG_0(PyObject *self, Py_ss if (resultobj != Py_None) if (private_store_set(resultobj, "refers_to", self)) { + Py_DECREF(resultobj); SWIG_fail; } @@ -6982,6 +6983,7 @@ SWIGINTERN PyObject *_wrap_Iptcdatum_pointer_value__SWIG_1(PyObject *self, Py_ss if (resultobj != Py_None) if (private_store_set(resultobj, "refers_to", self)) { + Py_DECREF(resultobj); SWIG_fail; } @@ -7296,6 +7298,7 @@ SWIGINTERN PyObject *_wrap_IptcData_iterator___iter__(PyObject *self, PyObject * if (resultobj != Py_None) if (private_store_set(resultobj, "refers_to", self)) { + Py_DECREF(resultobj); SWIG_fail; } @@ -7443,6 +7446,7 @@ SWIGINTERN PyObject *_wrap__getitem_Exiv2_IptcData(PyObject *self, PyObject *arg if (resultobj != Py_None) if (private_store_set(resultobj, "refers_to", self)) { + Py_DECREF(resultobj); SWIG_fail; } @@ -8470,6 +8474,7 @@ SWIGINTERN PyObject *_wrap_Iptcdatum_value__SWIG_0(PyObject *self, Py_ssize_t no if (resultobj != Py_None) if (private_store_set(resultobj, "refers_to", self)) { + Py_DECREF(resultobj); SWIG_fail; } @@ -8710,6 +8715,7 @@ SWIGINTERN PyObject *_wrap_Iptcdatum_value__SWIG_1(PyObject *self, Py_ssize_t no if (resultobj != Py_None) if (private_store_set(resultobj, "refers_to", self)) { + Py_DECREF(resultobj); SWIG_fail; } @@ -9110,6 +9116,7 @@ SWIGINTERN PyObject *_wrap_IptcData_erase(PyObject *self, PyObject *args) { if (resultobj != Py_None) if (private_store_set(resultobj, "refers_to", self)) { + Py_DECREF(resultobj); SWIG_fail; } @@ -9229,6 +9236,7 @@ SWIGINTERN PyObject *_wrap_IptcData_begin(PyObject *self, PyObject *args) { if (resultobj != Py_None) if (private_store_set(resultobj, "refers_to", self)) { + Py_DECREF(resultobj); SWIG_fail; } @@ -9266,6 +9274,7 @@ SWIGINTERN PyObject *_wrap_IptcData_end(PyObject *self, PyObject *args) { if (resultobj != Py_None) if (private_store_set(resultobj, "refers_to", self)) { + Py_DECREF(resultobj); SWIG_fail; } @@ -9324,6 +9333,7 @@ SWIGINTERN PyObject *_wrap_IptcData_findKey(PyObject *self, PyObject *args) { if (resultobj != Py_None) if (private_store_set(resultobj, "refers_to", self)) { + Py_DECREF(resultobj); SWIG_fail; } @@ -9385,6 +9395,7 @@ SWIGINTERN PyObject *_wrap_IptcData_findId__SWIG_0(PyObject *self, Py_ssize_t no if (resultobj != Py_None) if (private_store_set(resultobj, "refers_to", self)) { + Py_DECREF(resultobj); SWIG_fail; } @@ -9438,6 +9449,7 @@ SWIGINTERN PyObject *_wrap_IptcData_findId__SWIG_1(PyObject *self, Py_ssize_t no if (resultobj != Py_None) if (private_store_set(resultobj, "refers_to", self)) { + Py_DECREF(resultobj); SWIG_fail; } diff --git a/src/swig-0_28_7/metadatum_wrap.cxx b/src/swig-0_28_7/metadatum_wrap.cxx index 4e1b3c51..b8f4bd58 100644 --- a/src/swig-0_28_7/metadatum_wrap.cxx +++ b/src/swig-0_28_7/metadatum_wrap.cxx @@ -6910,6 +6910,7 @@ SWIGINTERN PyObject *_wrap_Metadatum_value(PyObject *self, PyObject *args) { if (resultobj != Py_None) if (private_store_set(resultobj, "refers_to", self)) { + Py_DECREF(resultobj); SWIG_fail; } diff --git a/src/swig-0_28_7/preview_wrap.cxx b/src/swig-0_28_7/preview_wrap.cxx index cda753c4..84c743e5 100644 --- a/src/swig-0_28_7/preview_wrap.cxx +++ b/src/swig-0_28_7/preview_wrap.cxx @@ -6976,6 +6976,7 @@ SWIGINTERN int _wrap_new_PreviewManager(PyObject *self, PyObject *args, PyObject if (resultobj != Py_None) if (private_store_set(resultobj, "refers_to", args)) { + Py_DECREF(resultobj); SWIG_fail; } diff --git a/src/swig-0_28_7/xmp_wrap.cxx b/src/swig-0_28_7/xmp_wrap.cxx index 2e76fcea..62b9df9e 100644 --- a/src/swig-0_28_7/xmp_wrap.cxx +++ b/src/swig-0_28_7/xmp_wrap.cxx @@ -6901,6 +6901,7 @@ SWIGINTERN PyObject *_wrap_Xmpdatum_pointer_value__SWIG_0(PyObject *self, Py_ssi if (resultobj != Py_None) if (private_store_set(resultobj, "refers_to", self)) { + Py_DECREF(resultobj); SWIG_fail; } @@ -6951,6 +6952,7 @@ SWIGINTERN PyObject *_wrap_Xmpdatum_pointer_value__SWIG_1(PyObject *self, Py_ssi if (resultobj != Py_None) if (private_store_set(resultobj, "refers_to", self)) { + Py_DECREF(resultobj); SWIG_fail; } @@ -7265,6 +7267,7 @@ SWIGINTERN PyObject *_wrap_XmpData_iterator___iter__(PyObject *self, PyObject *a if (resultobj != Py_None) if (private_store_set(resultobj, "refers_to", self)) { + Py_DECREF(resultobj); SWIG_fail; } @@ -7412,6 +7415,7 @@ SWIGINTERN PyObject *_wrap__getitem_Exiv2_XmpData(PyObject *self, PyObject *args if (resultobj != Py_None) if (private_store_set(resultobj, "refers_to", self)) { + Py_DECREF(resultobj); SWIG_fail; } @@ -8380,6 +8384,7 @@ SWIGINTERN PyObject *_wrap_Xmpdatum_value__SWIG_0(PyObject *self, Py_ssize_t nob if (resultobj != Py_None) if (private_store_set(resultobj, "refers_to", self)) { + Py_DECREF(resultobj); SWIG_fail; } @@ -8620,6 +8625,7 @@ SWIGINTERN PyObject *_wrap_Xmpdatum_value__SWIG_1(PyObject *self, Py_ssize_t nob if (resultobj != Py_None) if (private_store_set(resultobj, "refers_to", self)) { + Py_DECREF(resultobj); SWIG_fail; } @@ -9042,6 +9048,7 @@ SWIGINTERN PyObject *_wrap_XmpData_erase(PyObject *self, PyObject *args) { if (resultobj != Py_None) if (private_store_set(resultobj, "refers_to", self)) { + Py_DECREF(resultobj); SWIG_fail; } @@ -9190,6 +9197,7 @@ SWIGINTERN PyObject *_wrap_XmpData_begin(PyObject *self, PyObject *args) { if (resultobj != Py_None) if (private_store_set(resultobj, "refers_to", self)) { + Py_DECREF(resultobj); SWIG_fail; } @@ -9227,6 +9235,7 @@ SWIGINTERN PyObject *_wrap_XmpData_end(PyObject *self, PyObject *args) { if (resultobj != Py_None) if (private_store_set(resultobj, "refers_to", self)) { + Py_DECREF(resultobj); SWIG_fail; } @@ -9285,6 +9294,7 @@ SWIGINTERN PyObject *_wrap_XmpData_findKey(PyObject *self, PyObject *args) { if (resultobj != Py_None) if (private_store_set(resultobj, "refers_to", self)) { + Py_DECREF(resultobj); SWIG_fail; } diff --git a/src/swig-0_28_8/exif_wrap.cxx b/src/swig-0_28_8/exif_wrap.cxx index ea759dac..2974d9fa 100644 --- a/src/swig-0_28_8/exif_wrap.cxx +++ b/src/swig-0_28_8/exif_wrap.cxx @@ -7067,6 +7067,7 @@ SWIGINTERN PyObject *_wrap_Exifdatum_pointer_value__SWIG_0(PyObject *self, Py_ss if (resultobj != Py_None) if (private_store_set(resultobj, "refers_to", self)) { + Py_DECREF(resultobj); SWIG_fail; } @@ -7117,6 +7118,7 @@ SWIGINTERN PyObject *_wrap_Exifdatum_pointer_value__SWIG_1(PyObject *self, Py_ss if (resultobj != Py_None) if (private_store_set(resultobj, "refers_to", self)) { + Py_DECREF(resultobj); SWIG_fail; } @@ -7492,6 +7494,7 @@ SWIGINTERN PyObject *_wrap_ExifData_iterator___iter__(PyObject *self, PyObject * if (resultobj != Py_None) if (private_store_set(resultobj, "refers_to", self)) { + Py_DECREF(resultobj); SWIG_fail; } @@ -7639,6 +7642,7 @@ SWIGINTERN PyObject *_wrap__getitem_Exiv2_ExifData(PyObject *self, PyObject *arg if (resultobj != Py_None) if (private_store_set(resultobj, "refers_to", self)) { + Py_DECREF(resultobj); SWIG_fail; } @@ -8720,6 +8724,7 @@ SWIGINTERN PyObject *_wrap_Exifdatum_value__SWIG_0(PyObject *self, Py_ssize_t no if (resultobj != Py_None) if (private_store_set(resultobj, "refers_to", self)) { + Py_DECREF(resultobj); SWIG_fail; } @@ -9021,6 +9026,7 @@ SWIGINTERN PyObject *_wrap_Exifdatum_value__SWIG_1(PyObject *self, Py_ssize_t no if (resultobj != Py_None) if (private_store_set(resultobj, "refers_to", self)) { + Py_DECREF(resultobj); SWIG_fail; } @@ -9477,6 +9483,7 @@ SWIGINTERN int _wrap_new_ExifThumb(PyObject *self, PyObject *args, PyObject *kwa if (resultobj != Py_None) if (private_store_set(resultobj, "refers_to", args)) { + Py_DECREF(resultobj); SWIG_fail; } @@ -10055,6 +10062,7 @@ SWIGINTERN PyObject *_wrap_ExifData_erase__SWIG_0(PyObject *self, Py_ssize_t nob if (resultobj != Py_None) if (private_store_set(resultobj, "refers_to", self)) { + Py_DECREF(resultobj); SWIG_fail; } @@ -10145,6 +10153,7 @@ SWIGINTERN PyObject *_wrap_ExifData_erase__SWIG_1(PyObject *self, Py_ssize_t nob if (resultobj != Py_None) if (private_store_set(resultobj, "refers_to", self)) { + Py_DECREF(resultobj); SWIG_fail; } @@ -10293,6 +10302,7 @@ SWIGINTERN PyObject *_wrap_ExifData_begin(PyObject *self, PyObject *args) { if (resultobj != Py_None) if (private_store_set(resultobj, "refers_to", self)) { + Py_DECREF(resultobj); SWIG_fail; } @@ -10330,6 +10340,7 @@ SWIGINTERN PyObject *_wrap_ExifData_end(PyObject *self, PyObject *args) { if (resultobj != Py_None) if (private_store_set(resultobj, "refers_to", self)) { + Py_DECREF(resultobj); SWIG_fail; } @@ -10388,6 +10399,7 @@ SWIGINTERN PyObject *_wrap_ExifData_findKey(PyObject *self, PyObject *args) { if (resultobj != Py_None) if (private_store_set(resultobj, "refers_to", self)) { + Py_DECREF(resultobj); SWIG_fail; } diff --git a/src/swig-0_28_8/image_wrap.cxx b/src/swig-0_28_8/image_wrap.cxx index 678ebbc9..1b7a1c7c 100644 --- a/src/swig-0_28_8/image_wrap.cxx +++ b/src/swig-0_28_8/image_wrap.cxx @@ -6140,6 +6140,7 @@ SWIGINTERN PyObject *_wrap_Image_iccProfile(PyObject *self, PyObject *args) { if (resultobj != Py_None) if (private_store_set(resultobj, "refers_to", self)) { + Py_DECREF(resultobj); SWIG_fail; } @@ -6265,6 +6266,7 @@ SWIGINTERN PyObject *_wrap_Image_exifData(PyObject *self, PyObject *args) { if (resultobj != Py_None) if (private_store_set(resultobj, "refers_to", self)) { + Py_DECREF(resultobj); SWIG_fail; } @@ -6307,6 +6309,7 @@ SWIGINTERN PyObject *_wrap_Image_iptcData(PyObject *self, PyObject *args) { if (resultobj != Py_None) if (private_store_set(resultobj, "refers_to", self)) { + Py_DECREF(resultobj); SWIG_fail; } @@ -6349,6 +6352,7 @@ SWIGINTERN PyObject *_wrap_Image_xmpData(PyObject *self, PyObject *args) { if (resultobj != Py_None) if (private_store_set(resultobj, "refers_to", self)) { + Py_DECREF(resultobj); SWIG_fail; } @@ -6740,6 +6744,7 @@ SWIGINTERN PyObject *_wrap_Image_io(PyObject *self, PyObject *args) { if (resultobj != Py_None) if (private_store_set(resultobj, "refers_to", self)) { + Py_DECREF(resultobj); SWIG_fail; } diff --git a/src/swig-0_28_8/iptc_wrap.cxx b/src/swig-0_28_8/iptc_wrap.cxx index 4f85f3c8..ee9b6eee 100644 --- a/src/swig-0_28_8/iptc_wrap.cxx +++ b/src/swig-0_28_8/iptc_wrap.cxx @@ -6932,6 +6932,7 @@ SWIGINTERN PyObject *_wrap_Iptcdatum_pointer_value__SWIG_0(PyObject *self, Py_ss if (resultobj != Py_None) if (private_store_set(resultobj, "refers_to", self)) { + Py_DECREF(resultobj); SWIG_fail; } @@ -6982,6 +6983,7 @@ SWIGINTERN PyObject *_wrap_Iptcdatum_pointer_value__SWIG_1(PyObject *self, Py_ss if (resultobj != Py_None) if (private_store_set(resultobj, "refers_to", self)) { + Py_DECREF(resultobj); SWIG_fail; } @@ -7296,6 +7298,7 @@ SWIGINTERN PyObject *_wrap_IptcData_iterator___iter__(PyObject *self, PyObject * if (resultobj != Py_None) if (private_store_set(resultobj, "refers_to", self)) { + Py_DECREF(resultobj); SWIG_fail; } @@ -7443,6 +7446,7 @@ SWIGINTERN PyObject *_wrap__getitem_Exiv2_IptcData(PyObject *self, PyObject *arg if (resultobj != Py_None) if (private_store_set(resultobj, "refers_to", self)) { + Py_DECREF(resultobj); SWIG_fail; } @@ -8470,6 +8474,7 @@ SWIGINTERN PyObject *_wrap_Iptcdatum_value__SWIG_0(PyObject *self, Py_ssize_t no if (resultobj != Py_None) if (private_store_set(resultobj, "refers_to", self)) { + Py_DECREF(resultobj); SWIG_fail; } @@ -8710,6 +8715,7 @@ SWIGINTERN PyObject *_wrap_Iptcdatum_value__SWIG_1(PyObject *self, Py_ssize_t no if (resultobj != Py_None) if (private_store_set(resultobj, "refers_to", self)) { + Py_DECREF(resultobj); SWIG_fail; } @@ -9110,6 +9116,7 @@ SWIGINTERN PyObject *_wrap_IptcData_erase(PyObject *self, PyObject *args) { if (resultobj != Py_None) if (private_store_set(resultobj, "refers_to", self)) { + Py_DECREF(resultobj); SWIG_fail; } @@ -9229,6 +9236,7 @@ SWIGINTERN PyObject *_wrap_IptcData_begin(PyObject *self, PyObject *args) { if (resultobj != Py_None) if (private_store_set(resultobj, "refers_to", self)) { + Py_DECREF(resultobj); SWIG_fail; } @@ -9266,6 +9274,7 @@ SWIGINTERN PyObject *_wrap_IptcData_end(PyObject *self, PyObject *args) { if (resultobj != Py_None) if (private_store_set(resultobj, "refers_to", self)) { + Py_DECREF(resultobj); SWIG_fail; } @@ -9324,6 +9333,7 @@ SWIGINTERN PyObject *_wrap_IptcData_findKey(PyObject *self, PyObject *args) { if (resultobj != Py_None) if (private_store_set(resultobj, "refers_to", self)) { + Py_DECREF(resultobj); SWIG_fail; } @@ -9385,6 +9395,7 @@ SWIGINTERN PyObject *_wrap_IptcData_findId__SWIG_0(PyObject *self, Py_ssize_t no if (resultobj != Py_None) if (private_store_set(resultobj, "refers_to", self)) { + Py_DECREF(resultobj); SWIG_fail; } @@ -9438,6 +9449,7 @@ SWIGINTERN PyObject *_wrap_IptcData_findId__SWIG_1(PyObject *self, Py_ssize_t no if (resultobj != Py_None) if (private_store_set(resultobj, "refers_to", self)) { + Py_DECREF(resultobj); SWIG_fail; } diff --git a/src/swig-0_28_8/metadatum_wrap.cxx b/src/swig-0_28_8/metadatum_wrap.cxx index 4e1b3c51..b8f4bd58 100644 --- a/src/swig-0_28_8/metadatum_wrap.cxx +++ b/src/swig-0_28_8/metadatum_wrap.cxx @@ -6910,6 +6910,7 @@ SWIGINTERN PyObject *_wrap_Metadatum_value(PyObject *self, PyObject *args) { if (resultobj != Py_None) if (private_store_set(resultobj, "refers_to", self)) { + Py_DECREF(resultobj); SWIG_fail; } diff --git a/src/swig-0_28_8/preview_wrap.cxx b/src/swig-0_28_8/preview_wrap.cxx index cda753c4..84c743e5 100644 --- a/src/swig-0_28_8/preview_wrap.cxx +++ b/src/swig-0_28_8/preview_wrap.cxx @@ -6976,6 +6976,7 @@ SWIGINTERN int _wrap_new_PreviewManager(PyObject *self, PyObject *args, PyObject if (resultobj != Py_None) if (private_store_set(resultobj, "refers_to", args)) { + Py_DECREF(resultobj); SWIG_fail; } diff --git a/src/swig-0_28_8/xmp_wrap.cxx b/src/swig-0_28_8/xmp_wrap.cxx index 2e76fcea..62b9df9e 100644 --- a/src/swig-0_28_8/xmp_wrap.cxx +++ b/src/swig-0_28_8/xmp_wrap.cxx @@ -6901,6 +6901,7 @@ SWIGINTERN PyObject *_wrap_Xmpdatum_pointer_value__SWIG_0(PyObject *self, Py_ssi if (resultobj != Py_None) if (private_store_set(resultobj, "refers_to", self)) { + Py_DECREF(resultobj); SWIG_fail; } @@ -6951,6 +6952,7 @@ SWIGINTERN PyObject *_wrap_Xmpdatum_pointer_value__SWIG_1(PyObject *self, Py_ssi if (resultobj != Py_None) if (private_store_set(resultobj, "refers_to", self)) { + Py_DECREF(resultobj); SWIG_fail; } @@ -7265,6 +7267,7 @@ SWIGINTERN PyObject *_wrap_XmpData_iterator___iter__(PyObject *self, PyObject *a if (resultobj != Py_None) if (private_store_set(resultobj, "refers_to", self)) { + Py_DECREF(resultobj); SWIG_fail; } @@ -7412,6 +7415,7 @@ SWIGINTERN PyObject *_wrap__getitem_Exiv2_XmpData(PyObject *self, PyObject *args if (resultobj != Py_None) if (private_store_set(resultobj, "refers_to", self)) { + Py_DECREF(resultobj); SWIG_fail; } @@ -8380,6 +8384,7 @@ SWIGINTERN PyObject *_wrap_Xmpdatum_value__SWIG_0(PyObject *self, Py_ssize_t nob if (resultobj != Py_None) if (private_store_set(resultobj, "refers_to", self)) { + Py_DECREF(resultobj); SWIG_fail; } @@ -8620,6 +8625,7 @@ SWIGINTERN PyObject *_wrap_Xmpdatum_value__SWIG_1(PyObject *self, Py_ssize_t nob if (resultobj != Py_None) if (private_store_set(resultobj, "refers_to", self)) { + Py_DECREF(resultobj); SWIG_fail; } @@ -9042,6 +9048,7 @@ SWIGINTERN PyObject *_wrap_XmpData_erase(PyObject *self, PyObject *args) { if (resultobj != Py_None) if (private_store_set(resultobj, "refers_to", self)) { + Py_DECREF(resultobj); SWIG_fail; } @@ -9190,6 +9197,7 @@ SWIGINTERN PyObject *_wrap_XmpData_begin(PyObject *self, PyObject *args) { if (resultobj != Py_None) if (private_store_set(resultobj, "refers_to", self)) { + Py_DECREF(resultobj); SWIG_fail; } @@ -9227,6 +9235,7 @@ SWIGINTERN PyObject *_wrap_XmpData_end(PyObject *self, PyObject *args) { if (resultobj != Py_None) if (private_store_set(resultobj, "refers_to", self)) { + Py_DECREF(resultobj); SWIG_fail; } @@ -9285,6 +9294,7 @@ SWIGINTERN PyObject *_wrap_XmpData_findKey(PyObject *self, PyObject *args) { if (resultobj != Py_None) if (private_store_set(resultobj, "refers_to", self)) { + Py_DECREF(resultobj); SWIG_fail; } From 9f1cfdf405e886226077224ba45d204590340209 Mon Sep 17 00:00:00 2001 From: Jim Easterbrook Date: Thu, 23 Jul 2026 16:57:32 +0100 Subject: [PATCH 08/13] Catch exceptions in str(value) This should fix bug #65. --- src/interface/shared/slots.i | 15 ++++++++++++--- src/swig-0_27_7/metadatum_wrap.cxx | 18 ++++++++++++++++-- src/swig-0_27_7/value_wrap.cxx | 9 ++++++++- src/swig-0_28_7/metadatum_wrap.cxx | 18 ++++++++++++++++-- src/swig-0_28_7/value_wrap.cxx | 9 ++++++++- src/swig-0_28_8/metadatum_wrap.cxx | 18 ++++++++++++++++-- src/swig-0_28_8/value_wrap.cxx | 9 ++++++++- tests/test_value.py | 14 ++++++++++++++ 8 files changed, 98 insertions(+), 12 deletions(-) diff --git a/src/interface/shared/slots.i b/src/interface/shared/slots.i index f413140a..10a6db96 100644 --- a/src/interface/shared/slots.i +++ b/src/interface/shared/slots.i @@ -1,6 +1,6 @@ /* python-exiv2 - Python interface to libexiv2 * http://github.com/jim-easterbrook/python-exiv2 - * Copyright (C) 2025 Jim Easterbrook jim@jim-easterbrook.me.uk + * Copyright (C) 2025-26 Jim Easterbrook jim@jim-easterbrook.me.uk * * This file is part of python-exiv2. * @@ -19,6 +19,8 @@ */ +%include "shared/exception.i" + // Macro to add mp_ass_subscript slot and functions %define MP_ASS_SUBSCRIPT(type, item_type, setfunc, delfunc, canfail) // Use %inline so SWIG generates wrappers with type conversions. @@ -200,11 +202,18 @@ static PyObject* _getitem_%mangle(type)_closure( // Macro to add tp_str slot and function %define TP_STR(type, func) -%fragment("str"{type}, "header") { +%fragment("str"{type}, "header", fragment="_set_python_exception") { static PyObject* _str_%mangle(type)(PyObject* py_self) { type* self = NULL; + std::string result; SWIG_ConvertPtr(py_self, (void**)&self, $descriptor(type*), 0); - std::string result = func; + try { + result = func; + } + catch(std::exception const& e) { + _set_python_exception(); + return NULL; + } return SWIG_FromCharPtrAndSize(result.data(), result.size()); }; } diff --git a/src/swig-0_27_7/metadatum_wrap.cxx b/src/swig-0_27_7/metadatum_wrap.cxx index 63bbf0b1..f1c9c399 100644 --- a/src/swig-0_27_7/metadatum_wrap.cxx +++ b/src/swig-0_27_7/metadatum_wrap.cxx @@ -4715,16 +4715,30 @@ static void _set_python_exception() { static PyObject* _str_Exiv2_Metadatum(PyObject* py_self) { Exiv2::Metadatum* self = NULL; + std::string result; SWIG_ConvertPtr(py_self, (void**)&self, SWIGTYPE_p_Exiv2__Metadatum, 0); - std::string result = metadatum_str(self); + try { + result = metadatum_str(self); + } + catch(std::exception const& e) { + _set_python_exception(); + return NULL; + } return SWIG_FromCharPtrAndSize(result.data(), result.size()); }; static PyObject* _str_MetadatumPointerBase(PyObject* py_self) { MetadatumPointerBase* self = NULL; + std::string result; SWIG_ConvertPtr(py_self, (void**)&self, SWIGTYPE_p_MetadatumPointerBase, 0); - std::string result = self->__str__(); + try { + result = self->__str__(); + } + catch(std::exception const& e) { + _set_python_exception(); + return NULL; + } return SWIG_FromCharPtrAndSize(result.data(), result.size()); }; diff --git a/src/swig-0_27_7/value_wrap.cxx b/src/swig-0_27_7/value_wrap.cxx index bf34c509..ba6d6a40 100644 --- a/src/swig-0_27_7/value_wrap.cxx +++ b/src/swig-0_27_7/value_wrap.cxx @@ -5763,8 +5763,15 @@ namespace swig { static PyObject* _str_Exiv2_Value(PyObject* py_self) { Exiv2::Value* self = NULL; + std::string result; SWIG_ConvertPtr(py_self, (void**)&self, SWIGTYPE_p_Exiv2__Value, 0); - std::string result = self->toString(); + try { + result = self->toString(); + } + catch(std::exception const& e) { + _set_python_exception(); + return NULL; + } return SWIG_FromCharPtrAndSize(result.data(), result.size()); }; diff --git a/src/swig-0_28_7/metadatum_wrap.cxx b/src/swig-0_28_7/metadatum_wrap.cxx index b8f4bd58..97d9a43e 100644 --- a/src/swig-0_28_7/metadatum_wrap.cxx +++ b/src/swig-0_28_7/metadatum_wrap.cxx @@ -4715,16 +4715,30 @@ static void _set_python_exception() { static PyObject* _str_Exiv2_Metadatum(PyObject* py_self) { Exiv2::Metadatum* self = NULL; + std::string result; SWIG_ConvertPtr(py_self, (void**)&self, SWIGTYPE_p_Exiv2__Metadatum, 0); - std::string result = metadatum_str(self); + try { + result = metadatum_str(self); + } + catch(std::exception const& e) { + _set_python_exception(); + return NULL; + } return SWIG_FromCharPtrAndSize(result.data(), result.size()); }; static PyObject* _str_MetadatumPointerBase(PyObject* py_self) { MetadatumPointerBase* self = NULL; + std::string result; SWIG_ConvertPtr(py_self, (void**)&self, SWIGTYPE_p_MetadatumPointerBase, 0); - std::string result = self->__str__(); + try { + result = self->__str__(); + } + catch(std::exception const& e) { + _set_python_exception(); + return NULL; + } return SWIG_FromCharPtrAndSize(result.data(), result.size()); }; diff --git a/src/swig-0_28_7/value_wrap.cxx b/src/swig-0_28_7/value_wrap.cxx index 617102d5..8497abad 100644 --- a/src/swig-0_28_7/value_wrap.cxx +++ b/src/swig-0_28_7/value_wrap.cxx @@ -5763,8 +5763,15 @@ namespace swig { static PyObject* _str_Exiv2_Value(PyObject* py_self) { Exiv2::Value* self = NULL; + std::string result; SWIG_ConvertPtr(py_self, (void**)&self, SWIGTYPE_p_Exiv2__Value, 0); - std::string result = self->toString(); + try { + result = self->toString(); + } + catch(std::exception const& e) { + _set_python_exception(); + return NULL; + } return SWIG_FromCharPtrAndSize(result.data(), result.size()); }; diff --git a/src/swig-0_28_8/metadatum_wrap.cxx b/src/swig-0_28_8/metadatum_wrap.cxx index b8f4bd58..97d9a43e 100644 --- a/src/swig-0_28_8/metadatum_wrap.cxx +++ b/src/swig-0_28_8/metadatum_wrap.cxx @@ -4715,16 +4715,30 @@ static void _set_python_exception() { static PyObject* _str_Exiv2_Metadatum(PyObject* py_self) { Exiv2::Metadatum* self = NULL; + std::string result; SWIG_ConvertPtr(py_self, (void**)&self, SWIGTYPE_p_Exiv2__Metadatum, 0); - std::string result = metadatum_str(self); + try { + result = metadatum_str(self); + } + catch(std::exception const& e) { + _set_python_exception(); + return NULL; + } return SWIG_FromCharPtrAndSize(result.data(), result.size()); }; static PyObject* _str_MetadatumPointerBase(PyObject* py_self) { MetadatumPointerBase* self = NULL; + std::string result; SWIG_ConvertPtr(py_self, (void**)&self, SWIGTYPE_p_MetadatumPointerBase, 0); - std::string result = self->__str__(); + try { + result = self->__str__(); + } + catch(std::exception const& e) { + _set_python_exception(); + return NULL; + } return SWIG_FromCharPtrAndSize(result.data(), result.size()); }; diff --git a/src/swig-0_28_8/value_wrap.cxx b/src/swig-0_28_8/value_wrap.cxx index b136b74c..a58f51a2 100644 --- a/src/swig-0_28_8/value_wrap.cxx +++ b/src/swig-0_28_8/value_wrap.cxx @@ -5763,8 +5763,15 @@ namespace swig { static PyObject* _str_Exiv2_Value(PyObject* py_self) { Exiv2::Value* self = NULL; + std::string result; SWIG_ConvertPtr(py_self, (void**)&self, SWIGTYPE_p_Exiv2__Value, 0); - std::string result = self->toString(); + try { + result = self->toString(); + } + catch(std::exception const& e) { + _set_python_exception(); + return NULL; + } return SWIG_FromCharPtrAndSize(result.data(), result.size()); }; diff --git a/tests/test_value.py b/tests/test_value.py index 12d38ddc..cc64a238 100644 --- a/tests/test_value.py +++ b/tests/test_value.py @@ -202,6 +202,20 @@ def test_CommentValue(self): self.do_common_string_tests(value, data) self.do_conversion_tests(value, text, data[0]) self.do_dataarea_tests(value) + # test bug #65 + if not exiv2.testVersion(0, 28, 0): + return + value = exiv2.CommentValue() + # read some invalid data (odd length UTF-16) + value.read(data[:-1]) + with self.assertRaises(exiv2.Exiv2Error) as cm: + str(value) + self.assertEqual(cm.exception.code, + exiv2.ErrorCode.kerInvalidIconvEncoding) + with self.assertRaises(exiv2.Exiv2Error) as cm: + value.toString() + self.assertEqual(cm.exception.code, + exiv2.ErrorCode.kerInvalidIconvEncoding) def test_StringValue(self): text = 'The quick brown fox jumps over the lazy dog. àéīöûç' From 3ac5f9cccce9d5d70719a0a466d5af1c4758e01b Mon Sep 17 00:00:00 2001 From: Jim Easterbrook Date: Fri, 24 Jul 2026 15:21:27 +0100 Subject: [PATCH 09/13] Add Exiv2::XmpParser::encode to Python interface This was requested in discussion #66. I still need to use a proper enum for the control flags. --- src/interface/image.i | 4 - src/interface/xmp.i | 23 +++- src/swig-0_27_7/image_wrap.cxx | 20 ++- src/swig-0_27_7/xmp_wrap.cxx | 219 ++++++++++++++++++++++++++++++--- src/swig-0_28_7/image_wrap.cxx | 20 ++- src/swig-0_28_7/xmp_wrap.cxx | 147 ++++++++++++++++++++-- src/swig-0_28_8/image_wrap.cxx | 20 ++- src/swig-0_28_8/xmp_wrap.cxx | 147 ++++++++++++++++++++-- tests/test_xmp.py | 17 +++ 9 files changed, 541 insertions(+), 76 deletions(-) diff --git a/src/interface/image.i b/src/interface/image.i index c7e796dc..3d0d8b5e 100644 --- a/src/interface/image.i +++ b/src/interface/image.i @@ -221,10 +221,6 @@ KEEP_REFERENCE(Exiv2::XmpData&) KEEP_REFERENCE(Exiv2::DataBuf*) KEEP_REFERENCE(Exiv2::DataBuf&) -// xmpPacket() returns a modifiable std::string, Python strings are immutable -// so treat it as a non-modifiable std::string -%apply const std::string& {std::string& xmpPacket}; - #if EXIV2_VERSION_HEX < 0x001c0000 // Extend ImageType namespace with ones that don't get picked up by swig %{ diff --git a/src/interface/xmp.i b/src/interface/xmp.i index f04b7d73..3c7d5d44 100644 --- a/src/interface/xmp.i +++ b/src/interface/xmp.i @@ -22,6 +22,7 @@ #endif #pragma SWIG nowarn=508 // Declaration of '__str__' shadows declaration accessible via operator->() +// #pragma SWIG nowarn=509 // Overloaded method effectively ignored %include "shared/preamble.i" %include "shared/containers.i" @@ -55,6 +56,27 @@ EXCEPTION() DATA_CONTAINER(XmpData, Xmpdatum, XmpKey, Exiv2::XmpProperties::propertyType(Exiv2::XmpKey(datum->key()))) +// Typemaps for different uses of xmpPacket. +// Exiv2::Image::xmpPacket return value +%apply const std::string & {std::string &xmpPacket()}; + +// Exiv2::Image::setXmpPacket input value +%typemap(in) const std::string &xmpPacket = std::string &INPUT; +%typemap(argout) const std::string &xmpPacket "" + +// Exiv2::XmpParser::encode output value +%typemap(in, numinputs=0) std::string &xmpPacket = std::string &OUTPUT; +%typemap(argout) std::string &xmpPacket = std::string &OUTPUT; +%typemap(freearg) std::string &xmpPacket ""; + +// Default typemaps for Exiv2::XmpParser::encode +%typemap(default) uint16_t formatFlags %{ + $1 = Exiv2::XmpParser::XmpFormatFlags::useCompactFormat; +%} +%typemap(default) uint32_t padding %{ $1 = 0; %} +%ignore Exiv2::XmpParser::encode(std::string &, const XmpData &); +%ignore Exiv2::XmpParser::encode(std::string &, const XmpData &, uint16_t); + // Ignore const overloads of some methods %ignore Exiv2::XmpData::begin() const; %ignore Exiv2::XmpData::end() const; @@ -64,6 +86,5 @@ DATA_CONTAINER(XmpData, Xmpdatum, XmpKey, %ignore Exiv2::operatorHelper; %ignore Exiv2::XmpData::operator[]; %ignore Exiv2::XmpParser::decode; -%ignore Exiv2::XmpParser::encode; %include "exiv2/xmp_exiv2.hpp" diff --git a/src/swig-0_27_7/image_wrap.cxx b/src/swig-0_27_7/image_wrap.cxx index 0d8d88e2..644a2d3a 100644 --- a/src/swig-0_27_7/image_wrap.cxx +++ b/src/swig-0_27_7/image_wrap.cxx @@ -5671,7 +5671,7 @@ SWIGINTERN PyObject *_wrap_Image_setXmpPacket(PyObject *self, PyObject *args) { std::string *arg2 = 0 ; void *argp1 = 0 ; int res1 = 0 ; - int res2 = SWIG_OLDOBJ ; + int res2 = 0 ; PyObject *swig_obj[2] ; if (!args) SWIG_fail; @@ -5681,17 +5681,14 @@ SWIGINTERN PyObject *_wrap_Image_setXmpPacket(PyObject *self, PyObject *args) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Image_setXmpPacket" "', argument " "1"" of type '" "Exiv2::Image *""'"); } arg1 = reinterpret_cast< Exiv2::Image * >(argp1); - { - std::string *ptr = (std::string *)0; - res2 = SWIG_AsPtr_std_string(swig_obj[0], &ptr); - if (!SWIG_IsOK(res2)) { - SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "Image_setXmpPacket" "', argument " "2"" of type '" "std::string const &""'"); - } - if (!ptr) { - SWIG_exception_fail(SWIG_NullReferenceError, "invalid null reference " "in method '" "Image_setXmpPacket" "', argument " "2"" of type '" "std::string const &""'"); - } - arg2 = ptr; + res2 = SWIG_AsPtr_std_string(swig_obj[0], &arg2); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "Image_setXmpPacket" "', argument " "2"" of type '" "std::string const &""'"); + } + if (!arg2) { + SWIG_exception_fail(SWIG_NullReferenceError, "invalid null reference " "in method '" "Image_setXmpPacket" "', argument " "2"" of type '" "std::string const &""'"); } + res2 = SWIG_AddTmpMask(res2); { #ifdef RELEASE_VIEWS_Image_setXmpPacket if (release_views(self) < 0) { @@ -5709,6 +5706,7 @@ SWIGINTERN PyObject *_wrap_Image_setXmpPacket(PyObject *self, PyObject *args) { } } resultobj = SWIG_Py_Void(); + if (SWIG_IsNewObj(res2)) delete arg2; return resultobj; fail: diff --git a/src/swig-0_27_7/xmp_wrap.cxx b/src/swig-0_27_7/xmp_wrap.cxx index d5829028..ea9ca704 100644 --- a/src/swig-0_27_7/xmp_wrap.cxx +++ b/src/swig-0_27_7/xmp_wrap.cxx @@ -4398,15 +4398,16 @@ SwigPyBuiltin_iternextfunc_closure(SwigPyWrapperFunction wrapper, PyObject *a) { #define SWIGTYPE_p_std__ostream swig_types[59] #define SWIGTYPE_p_std__pairT_int32_t_int32_t_t swig_types[60] #define SWIGTYPE_p_std__pairT_uint32_t_uint32_t_t swig_types[61] -#define SWIGTYPE_p_std__vectorT_Exiv2__Xmpdatum_std__allocatorT_Exiv2__Xmpdatum_t_t swig_types[62] -#define SWIGTYPE_p_std__vectorT_Exiv2__Xmpdatum_std__allocatorT_Exiv2__Xmpdatum_t_t__iterator swig_types[63] -#define SWIGTYPE_p_unsigned_char swig_types[64] -#define SWIGTYPE_p_unsigned_int swig_types[65] -#define SWIGTYPE_p_unsigned_long_long swig_types[66] -#define SWIGTYPE_p_unsigned_short swig_types[67] -#define SWIGTYPE_p_value_type swig_types[68] -static swig_type_info *swig_types[70]; -static swig_module_info swig_module = {swig_types, 69, 0, 0, 0, 0}; +#define SWIGTYPE_p_std__string swig_types[62] +#define SWIGTYPE_p_std__vectorT_Exiv2__Xmpdatum_std__allocatorT_Exiv2__Xmpdatum_t_t swig_types[63] +#define SWIGTYPE_p_std__vectorT_Exiv2__Xmpdatum_std__allocatorT_Exiv2__Xmpdatum_t_t__iterator swig_types[64] +#define SWIGTYPE_p_unsigned_char swig_types[65] +#define SWIGTYPE_p_unsigned_int swig_types[66] +#define SWIGTYPE_p_unsigned_long_long swig_types[67] +#define SWIGTYPE_p_unsigned_short swig_types[68] +#define SWIGTYPE_p_value_type swig_types[69] +static swig_type_info *swig_types[71]; +static swig_module_info swig_module = {swig_types, 70, 0, 0, 0, 0}; #define SWIG_TypeQuery(name) SWIG_TypeQueryModule(&swig_module, &swig_module, name) #define SWIG_MangledTypeQuery(name) SWIG_MangledTypeQueryModule(&swig_module, &swig_module, name) @@ -5840,6 +5841,90 @@ SWIG_AsPtr_std_string (PyObject * obj, std::string **val) return SWIG_ERROR; } + +SWIGINTERN int +SWIG_AsVal_unsigned_SS_long (PyObject *obj, unsigned long *val) +{ +#if PY_VERSION_HEX < 0x03000000 + if (PyInt_Check(obj)) { + long v = PyInt_AsLong(obj); + if (v >= 0) { + if (val) *val = v; + return SWIG_OK; + } else { + return SWIG_OverflowError; + } + } else +#endif + if (PyLong_Check(obj)) { + unsigned long v = PyLong_AsUnsignedLong(obj); + if (!PyErr_Occurred()) { + if (val) *val = v; + return SWIG_OK; + } else { + PyErr_Clear(); + return SWIG_OverflowError; + } + } +#ifdef SWIG_PYTHON_CAST_MODE + { + int dispatch = 0; + unsigned long v = PyLong_AsUnsignedLong(obj); + if (!PyErr_Occurred()) { + if (val) *val = v; + return SWIG_AddCast(SWIG_OK); + } else { + PyErr_Clear(); + } + if (!dispatch) { + double d; + int res = SWIG_AddCast(SWIG_AsVal_double (obj,&d)); + // Largest double not larger than ULONG_MAX (not portably calculated easily) + // Note that double(ULONG_MAX) is stored in a double rounded up by one (for 64-bit unsigned long) + // 0xfffffffffffff800ULL == (uint64_t)std::nextafter(double(__uint128_t(ULONG_MAX)+1), double(0)) + const double ulong_max = sizeof(unsigned long) == 8 ? 0xfffffffffffff800ULL : ULONG_MAX; + if (SWIG_IsOK(res) && SWIG_CanCastAsInteger(&d, 0, ulong_max)) { + if (val) *val = (unsigned long)(d); + return res; + } + } + } +#endif + return SWIG_TypeError; +} + + +SWIGINTERN int +SWIG_AsVal_unsigned_SS_short (PyObject * obj, unsigned short *val) +{ + unsigned long v; + int res = SWIG_AsVal_unsigned_SS_long (obj, &v); + if (SWIG_IsOK(res)) { + if ((v > USHRT_MAX)) { + return SWIG_OverflowError; + } else { + if (val) *val = static_cast< unsigned short >(v); + } + } + return res; +} + + +SWIGINTERN int +SWIG_AsVal_unsigned_SS_int (PyObject * obj, unsigned int *val) +{ + unsigned long v; + int res = SWIG_AsVal_unsigned_SS_long (obj, &v); + if (SWIG_IsOK(res)) { + if ((v > UINT_MAX)) { + return SWIG_OverflowError; + } else { + if (val) *val = static_cast< unsigned int >(v); + } + } + return res; +} + #ifdef __cplusplus extern "C" { #endif @@ -9220,7 +9305,7 @@ SWIGINTERN PyObject *_wrap_XmpData_setPacket(PyObject *self, PyObject *args) { std::string *arg2 = 0 ; void *argp1 = 0 ; int res1 = 0 ; - int res2 = SWIG_OLDOBJ ; + int res2 = 0 ; PyObject *swig_obj[2] ; if (!args) SWIG_fail; @@ -9230,17 +9315,14 @@ SWIGINTERN PyObject *_wrap_XmpData_setPacket(PyObject *self, PyObject *args) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "XmpData_setPacket" "', argument " "1"" of type '" "Exiv2::XmpData *""'"); } arg1 = reinterpret_cast< Exiv2::XmpData * >(argp1); - { - std::string *ptr = (std::string *)0; - res2 = SWIG_AsPtr_std_string(swig_obj[0], &ptr); - if (!SWIG_IsOK(res2)) { - SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "XmpData_setPacket" "', argument " "2"" of type '" "std::string const &""'"); - } - if (!ptr) { - SWIG_exception_fail(SWIG_NullReferenceError, "invalid null reference " "in method '" "XmpData_setPacket" "', argument " "2"" of type '" "std::string const &""'"); - } - arg2 = ptr; + res2 = SWIG_AsPtr_std_string(swig_obj[0], &arg2); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "XmpData_setPacket" "', argument " "2"" of type '" "std::string const &""'"); + } + if (!arg2) { + SWIG_exception_fail(SWIG_NullReferenceError, "invalid null reference " "in method '" "XmpData_setPacket" "', argument " "2"" of type '" "std::string const &""'"); } + res2 = SWIG_AddTmpMask(res2); { try { (arg1)->setPacket((std::string const &)*arg2); @@ -9251,6 +9333,7 @@ SWIGINTERN PyObject *_wrap_XmpData_setPacket(PyObject *self, PyObject *args) { } } resultobj = SWIG_Py_Void(); + if (SWIG_IsNewObj(res2)) delete arg2; return resultobj; fail: @@ -9322,6 +9405,73 @@ SWIGPY_LENFUNC_CLOSURE(_wrap_XmpData_count) /* defines _wrap_XmpData_count_lenfu SWIGPY_DESTRUCTOR_CLOSURE(_wrap_delete_XmpData) /* defines _wrap_delete_XmpData_destructor_closure */ +SWIGINTERN PyObject *_wrap_XmpParser_encode(PyObject *self, PyObject *args) { + PyObject *resultobj = 0; + std::string *arg1 = 0 ; + Exiv2::XmpData *arg2 = 0 ; + uint16_t arg3 ; + uint32_t arg4 ; + std::string temp1 ; + int res1 = SWIG_TMPOBJ ; + void *argp2 = 0 ; + int res2 = 0 ; + unsigned short val3 ; + int ecode3 = 0 ; + unsigned int val4 ; + int ecode4 = 0 ; + PyObject *swig_obj[3] ; + int result; + + + arg3 = Exiv2::XmpParser::XmpFormatFlags::useCompactFormat; + + arg4 = 0; + arg1 = &temp1; + if (!SWIG_Python_UnpackTuple(args, "XmpParser_encode", 1, 3, swig_obj)) SWIG_fail; + res2 = SWIG_ConvertPtr(swig_obj[0], &argp2, SWIGTYPE_p_Exiv2__XmpData, 0 | 0); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "XmpParser_encode" "', argument " "2"" of type '" "Exiv2::XmpData const &""'"); + } + if (!argp2) { + SWIG_exception_fail(SWIG_NullReferenceError, "invalid null reference " "in method '" "XmpParser_encode" "', argument " "2"" of type '" "Exiv2::XmpData const &""'"); + } + arg2 = reinterpret_cast< Exiv2::XmpData * >(argp2); + if (swig_obj[1]) { + ecode3 = SWIG_AsVal_unsigned_SS_short(swig_obj[1], &val3); + if (!SWIG_IsOK(ecode3)) { + SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "XmpParser_encode" "', argument " "3"" of type '" "uint16_t""'"); + } + arg3 = static_cast< uint16_t >(val3); + } + if (swig_obj[2]) { + ecode4 = SWIG_AsVal_unsigned_SS_int(swig_obj[2], &val4); + if (!SWIG_IsOK(ecode4)) { + SWIG_exception_fail(SWIG_ArgError(ecode4), "in method '" "XmpParser_encode" "', argument " "4"" of type '" "uint32_t""'"); + } + arg4 = static_cast< uint32_t >(val4); + } + { + try { + result = (int)Exiv2::XmpParser::encode(*arg1,(Exiv2::XmpData const &)*arg2,arg3,arg4); + } + catch(std::exception const& e) { + _set_python_exception(); + SWIG_fail; + } + } + resultobj = SWIG_From_int(static_cast< int >(result)); + if (SWIG_IsTmpObj(res1)) { + resultobj = SWIG_Python_AppendOutput(resultobj, SWIG_From_std_string((*arg1)), 0); + } else { + int new_flags = SWIG_IsNewObj(res1) ? (SWIG_POINTER_OWN | 0 ) : 0 ; + resultobj = SWIG_Python_AppendOutput(resultobj, SWIG_NewPointerObj((void*)(arg1), SWIGTYPE_p_std__string, new_flags), 0); + } + return resultobj; +fail: + return NULL; +} + + SWIGINTERN PyObject *_wrap_XmpParser_initialize__SWIG_0(PyObject *self, Py_ssize_t nobjs, PyObject **swig_obj) { PyObject *resultobj = 0; Exiv2::XmpParser::XmpLockFct arg1 = 0 ; @@ -11182,6 +11332,31 @@ SwigPyBuiltin__Exiv2__XmpParser_richcompare(PyObject *self, PyObject *other, int } SWIGINTERN PyMethodDef SwigPyBuiltin__Exiv2__XmpParser_methods[] = { + { "encode", (PyCFunction)(void(*)(void))_wrap_XmpParser_encode, METH_STATIC|METH_VARARGS, "\n" + "Encode (serialize) XMP metadata from *xmpData* into a\n" + " string xmpPacket. The XMP packet returned in the string\n" + " follows the XMP specification. This method only modifies\n" + " *xmpPacket* if the operations succeeds (return code 0).\n" + "\n" + ":type xmpPacket: str\n" + ":param xmpPacket: Reference to a string to hold the encoded XMP\n" + " packet.\n" + ":type xmpData: :py:class:`XmpData`\n" + ":param xmpData: XMP properties to encode.\n" + ":type formatFlags: int, optional\n" + ":param formatFlags: Flags that control the format of the XMP packet,\n" + " see enum XmpFormatFlags.\n" + ":type padding: int, optional\n" + ":param padding: Padding length.\n" + ":rtype: int\n" + ":return: 0 if successful;\n" + "\n" + " 1 if XMP support has not been compiled-in;\n" + "\n" + " 2 if the XMP toolkit failed to initialize;\n" + "\n" + " 3 if the XMP toolkit failed and raised an XMP_Error\n" + "" }, { "initialize", (PyCFunction)(void(*)(void))_wrap_XmpParser_initialize, METH_STATIC|METH_VARARGS, "\n" " Initialize the XMP Toolkit.\n" "\n" @@ -11680,6 +11855,7 @@ static swig_type_info _swigt__p_size_type = {"_p_size_type", "size_type *", 0, 0 static swig_type_info _swigt__p_std__ostream = {"_p_std__ostream", "std::ostream *", 0, 0, (void*)0, 0}; static swig_type_info _swigt__p_std__pairT_int32_t_int32_t_t = {"_p_std__pairT_int32_t_int32_t_t", "Exiv2::Rational *|std::pair< int,int > *", 0, 0, (void*)0, 0}; static swig_type_info _swigt__p_std__pairT_uint32_t_uint32_t_t = {"_p_std__pairT_uint32_t_uint32_t_t", "Exiv2::URational *|std::pair< unsigned int,unsigned int > *", 0, 0, (void*)0, 0}; +static swig_type_info _swigt__p_std__string = {"_p_std__string", "std::string *", 0, 0, (void*)0, 0}; static swig_type_info _swigt__p_std__vectorT_Exiv2__Xmpdatum_std__allocatorT_Exiv2__Xmpdatum_t_t = {"_p_std__vectorT_Exiv2__Xmpdatum_std__allocatorT_Exiv2__Xmpdatum_t_t", "Exiv2::XmpMetadata *|std::vector< Exiv2::Xmpdatum,std::allocator< Exiv2::Xmpdatum > > *", 0, 0, (void*)0, 0}; static swig_type_info _swigt__p_std__vectorT_Exiv2__Xmpdatum_std__allocatorT_Exiv2__Xmpdatum_t_t__iterator = {"_p_std__vectorT_Exiv2__Xmpdatum_std__allocatorT_Exiv2__Xmpdatum_t_t__iterator", "Exiv2::XmpData::iterator *|std::vector< Exiv2::Xmpdatum,std::allocator< Exiv2::Xmpdatum > >::iterator *", 0, 0, (void*)0, 0}; static swig_type_info _swigt__p_unsigned_char = {"_p_unsigned_char", "Exiv2::byte *|uint8_t *|uint_fast8_t *|uint_least8_t *|unsigned char *", 0, 0, (void*)0, 0}; @@ -11751,6 +11927,7 @@ static swig_type_info *swig_type_initial[] = { &_swigt__p_std__ostream, &_swigt__p_std__pairT_int32_t_int32_t_t, &_swigt__p_std__pairT_uint32_t_uint32_t_t, + &_swigt__p_std__string, &_swigt__p_std__vectorT_Exiv2__Xmpdatum_std__allocatorT_Exiv2__Xmpdatum_t_t, &_swigt__p_std__vectorT_Exiv2__Xmpdatum_std__allocatorT_Exiv2__Xmpdatum_t_t__iterator, &_swigt__p_unsigned_char, @@ -11822,6 +11999,7 @@ static swig_cast_info _swigc__p_size_type[] = { {&_swigt__p_size_type, 0, 0, 0} static swig_cast_info _swigc__p_std__ostream[] = { {&_swigt__p_std__ostream, 0, 0, 0},{0, 0, 0, 0}}; static swig_cast_info _swigc__p_std__pairT_int32_t_int32_t_t[] = { {&_swigt__p_std__pairT_int32_t_int32_t_t, 0, 0, 0},{0, 0, 0, 0}}; static swig_cast_info _swigc__p_std__pairT_uint32_t_uint32_t_t[] = { {&_swigt__p_std__pairT_uint32_t_uint32_t_t, 0, 0, 0},{0, 0, 0, 0}}; +static swig_cast_info _swigc__p_std__string[] = { {&_swigt__p_std__string, 0, 0, 0},{0, 0, 0, 0}}; static swig_cast_info _swigc__p_std__vectorT_Exiv2__Xmpdatum_std__allocatorT_Exiv2__Xmpdatum_t_t[] = { {&_swigt__p_std__vectorT_Exiv2__Xmpdatum_std__allocatorT_Exiv2__Xmpdatum_t_t, 0, 0, 0},{0, 0, 0, 0}}; static swig_cast_info _swigc__p_std__vectorT_Exiv2__Xmpdatum_std__allocatorT_Exiv2__Xmpdatum_t_t__iterator[] = { {&_swigt__p_std__vectorT_Exiv2__Xmpdatum_std__allocatorT_Exiv2__Xmpdatum_t_t__iterator, 0, 0, 0},{0, 0, 0, 0}}; static swig_cast_info _swigc__p_unsigned_char[] = { {&_swigt__p_unsigned_char, 0, 0, 0},{0, 0, 0, 0}}; @@ -11893,6 +12071,7 @@ static swig_cast_info *swig_cast_initial[] = { _swigc__p_std__ostream, _swigc__p_std__pairT_int32_t_int32_t_t, _swigc__p_std__pairT_uint32_t_uint32_t_t, + _swigc__p_std__string, _swigc__p_std__vectorT_Exiv2__Xmpdatum_std__allocatorT_Exiv2__Xmpdatum_t_t, _swigc__p_std__vectorT_Exiv2__Xmpdatum_std__allocatorT_Exiv2__Xmpdatum_t_t__iterator, _swigc__p_unsigned_char, diff --git a/src/swig-0_28_7/image_wrap.cxx b/src/swig-0_28_7/image_wrap.cxx index 1b7a1c7c..ad1267eb 100644 --- a/src/swig-0_28_7/image_wrap.cxx +++ b/src/swig-0_28_7/image_wrap.cxx @@ -5725,7 +5725,7 @@ SWIGINTERN PyObject *_wrap_Image_setXmpPacket(PyObject *self, PyObject *args) { std::string *arg2 = 0 ; void *argp1 = 0 ; int res1 = 0 ; - int res2 = SWIG_OLDOBJ ; + int res2 = 0 ; PyObject *swig_obj[2] ; if (!args) SWIG_fail; @@ -5735,17 +5735,14 @@ SWIGINTERN PyObject *_wrap_Image_setXmpPacket(PyObject *self, PyObject *args) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Image_setXmpPacket" "', argument " "1"" of type '" "Exiv2::Image *""'"); } arg1 = reinterpret_cast< Exiv2::Image * >(argp1); - { - std::string *ptr = (std::string *)0; - res2 = SWIG_AsPtr_std_string(swig_obj[0], &ptr); - if (!SWIG_IsOK(res2)) { - SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "Image_setXmpPacket" "', argument " "2"" of type '" "std::string const &""'"); - } - if (!ptr) { - SWIG_exception_fail(SWIG_NullReferenceError, "invalid null reference " "in method '" "Image_setXmpPacket" "', argument " "2"" of type '" "std::string const &""'"); - } - arg2 = ptr; + res2 = SWIG_AsPtr_std_string(swig_obj[0], &arg2); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "Image_setXmpPacket" "', argument " "2"" of type '" "std::string const &""'"); + } + if (!arg2) { + SWIG_exception_fail(SWIG_NullReferenceError, "invalid null reference " "in method '" "Image_setXmpPacket" "', argument " "2"" of type '" "std::string const &""'"); } + res2 = SWIG_AddTmpMask(res2); { #ifdef RELEASE_VIEWS_Image_setXmpPacket if (release_views(self) < 0) { @@ -5763,6 +5760,7 @@ SWIGINTERN PyObject *_wrap_Image_setXmpPacket(PyObject *self, PyObject *args) { } } resultobj = SWIG_Py_Void(); + if (SWIG_IsNewObj(res2)) delete arg2; return resultobj; fail: diff --git a/src/swig-0_28_7/xmp_wrap.cxx b/src/swig-0_28_7/xmp_wrap.cxx index 62b9df9e..db9255a7 100644 --- a/src/swig-0_28_7/xmp_wrap.cxx +++ b/src/swig-0_28_7/xmp_wrap.cxx @@ -4398,15 +4398,16 @@ SwigPyBuiltin_iternextfunc_closure(SwigPyWrapperFunction wrapper, PyObject *a) { #define SWIGTYPE_p_std__ostream swig_types[59] #define SWIGTYPE_p_std__pairT_int32_t_int32_t_t swig_types[60] #define SWIGTYPE_p_std__pairT_uint32_t_uint32_t_t swig_types[61] -#define SWIGTYPE_p_std__vectorT_Exiv2__Xmpdatum_std__allocatorT_Exiv2__Xmpdatum_t_t swig_types[62] -#define SWIGTYPE_p_std__vectorT_Exiv2__Xmpdatum_std__allocatorT_Exiv2__Xmpdatum_t_t__iterator swig_types[63] -#define SWIGTYPE_p_unsigned_char swig_types[64] -#define SWIGTYPE_p_unsigned_int swig_types[65] -#define SWIGTYPE_p_unsigned_long_long swig_types[66] -#define SWIGTYPE_p_unsigned_short swig_types[67] -#define SWIGTYPE_p_value_type swig_types[68] -static swig_type_info *swig_types[70]; -static swig_module_info swig_module = {swig_types, 69, 0, 0, 0, 0}; +#define SWIGTYPE_p_std__string swig_types[62] +#define SWIGTYPE_p_std__vectorT_Exiv2__Xmpdatum_std__allocatorT_Exiv2__Xmpdatum_t_t swig_types[63] +#define SWIGTYPE_p_std__vectorT_Exiv2__Xmpdatum_std__allocatorT_Exiv2__Xmpdatum_t_t__iterator swig_types[64] +#define SWIGTYPE_p_unsigned_char swig_types[65] +#define SWIGTYPE_p_unsigned_int swig_types[66] +#define SWIGTYPE_p_unsigned_long_long swig_types[67] +#define SWIGTYPE_p_unsigned_short swig_types[68] +#define SWIGTYPE_p_value_type swig_types[69] +static swig_type_info *swig_types[71]; +static swig_module_info swig_module = {swig_types, 70, 0, 0, 0, 0}; #define SWIG_TypeQuery(name) SWIG_TypeQueryModule(&swig_module, &swig_module, name) #define SWIG_MangledTypeQuery(name) SWIG_MangledTypeQueryModule(&swig_module, &swig_module, name) @@ -6002,6 +6003,38 @@ SWIG_AsPtr_std_string (PyObject * obj, std::string **val) return SWIG_ERROR; } + +SWIGINTERN int +SWIG_AsVal_unsigned_SS_short (PyObject * obj, unsigned short *val) +{ + unsigned long v; + int res = SWIG_AsVal_unsigned_SS_long (obj, &v); + if (SWIG_IsOK(res)) { + if ((v > USHRT_MAX)) { + return SWIG_OverflowError; + } else { + if (val) *val = static_cast< unsigned short >(v); + } + } + return res; +} + + +SWIGINTERN int +SWIG_AsVal_unsigned_SS_int (PyObject * obj, unsigned int *val) +{ + unsigned long v; + int res = SWIG_AsVal_unsigned_SS_long (obj, &v); + if (SWIG_IsOK(res)) { + if ((v > UINT_MAX)) { + return SWIG_OverflowError; + } else { + if (val) *val = static_cast< unsigned int >(v); + } + } + return res; +} + #ifdef __cplusplus extern "C" { #endif @@ -9544,6 +9577,73 @@ SWIGPY_LENFUNC_CLOSURE(_wrap_XmpData_count) /* defines _wrap_XmpData_count_lenfu SWIGPY_DESTRUCTOR_CLOSURE(_wrap_delete_XmpData) /* defines _wrap_delete_XmpData_destructor_closure */ +SWIGINTERN PyObject *_wrap_XmpParser_encode(PyObject *self, PyObject *args) { + PyObject *resultobj = 0; + std::string *arg1 = 0 ; + Exiv2::XmpData *arg2 = 0 ; + uint16_t arg3 ; + uint32_t arg4 ; + std::string temp1 ; + int res1 = SWIG_TMPOBJ ; + void *argp2 = 0 ; + int res2 = 0 ; + unsigned short val3 ; + int ecode3 = 0 ; + unsigned int val4 ; + int ecode4 = 0 ; + PyObject *swig_obj[3] ; + int result; + + + arg3 = Exiv2::XmpParser::XmpFormatFlags::useCompactFormat; + + arg4 = 0; + arg1 = &temp1; + if (!SWIG_Python_UnpackTuple(args, "XmpParser_encode", 1, 3, swig_obj)) SWIG_fail; + res2 = SWIG_ConvertPtr(swig_obj[0], &argp2, SWIGTYPE_p_Exiv2__XmpData, 0 | 0); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "XmpParser_encode" "', argument " "2"" of type '" "Exiv2::XmpData const &""'"); + } + if (!argp2) { + SWIG_exception_fail(SWIG_NullReferenceError, "invalid null reference " "in method '" "XmpParser_encode" "', argument " "2"" of type '" "Exiv2::XmpData const &""'"); + } + arg2 = reinterpret_cast< Exiv2::XmpData * >(argp2); + if (swig_obj[1]) { + ecode3 = SWIG_AsVal_unsigned_SS_short(swig_obj[1], &val3); + if (!SWIG_IsOK(ecode3)) { + SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "XmpParser_encode" "', argument " "3"" of type '" "uint16_t""'"); + } + arg3 = static_cast< uint16_t >(val3); + } + if (swig_obj[2]) { + ecode4 = SWIG_AsVal_unsigned_SS_int(swig_obj[2], &val4); + if (!SWIG_IsOK(ecode4)) { + SWIG_exception_fail(SWIG_ArgError(ecode4), "in method '" "XmpParser_encode" "', argument " "4"" of type '" "uint32_t""'"); + } + arg4 = static_cast< uint32_t >(val4); + } + { + try { + result = (int)Exiv2::XmpParser::encode(*arg1,(Exiv2::XmpData const &)*arg2,arg3,arg4); + } + catch(std::exception const& e) { + _set_python_exception(); + SWIG_fail; + } + } + resultobj = SWIG_From_int(static_cast< int >(result)); + if (SWIG_IsTmpObj(res1)) { + resultobj = SWIG_Python_AppendOutput(resultobj, SWIG_From_std_string((*arg1)), 0); + } else { + int new_flags = SWIG_IsNewObj(res1) ? (SWIG_POINTER_OWN | 0 ) : 0 ; + resultobj = SWIG_Python_AppendOutput(resultobj, SWIG_NewPointerObj((void*)(arg1), SWIGTYPE_p_std__string, new_flags), 0); + } + return resultobj; +fail: + return NULL; +} + + SWIGINTERN PyObject *_wrap_XmpParser_initialize__SWIG_0(PyObject *self, Py_ssize_t nobjs, PyObject **swig_obj) { PyObject *resultobj = 0; Exiv2::XmpParser::XmpLockFct arg1 = 0 ; @@ -11407,6 +11507,31 @@ SwigPyBuiltin__Exiv2__XmpParser_richcompare(PyObject *self, PyObject *other, int } SWIGINTERN PyMethodDef SwigPyBuiltin__Exiv2__XmpParser_methods[] = { + { "encode", (PyCFunction)(void(*)(void))_wrap_XmpParser_encode, METH_STATIC|METH_VARARGS, "\n" + "Encode (serialize) XMP metadata from *xmpData* into a\n" + " string xmpPacket. The XMP packet returned in the string\n" + " follows the XMP specification. This method only modifies\n" + " *xmpPacket* if the operations succeeds (return code 0).\n" + "\n" + ":type xmpPacket: str\n" + ":param xmpPacket: Reference to a string to hold the encoded XMP\n" + " packet.\n" + ":type xmpData: :py:class:`XmpData`\n" + ":param xmpData: XMP properties to encode.\n" + ":type formatFlags: int, optional\n" + ":param formatFlags: Flags that control the format of the XMP packet,\n" + " see enum XmpFormatFlags.\n" + ":type padding: int, optional\n" + ":param padding: Padding length.\n" + ":rtype: int\n" + ":return: 0 if successful;\n" + "\n" + " 1 if XMP support has not been compiled-in;\n" + "\n" + " 2 if the XMP toolkit failed to initialize;\n" + "\n" + " 3 if the XMP toolkit failed and raised an XMP_Error\n" + "" }, { "initialize", (PyCFunction)(void(*)(void))_wrap_XmpParser_initialize, METH_STATIC|METH_VARARGS, "\n" "Initialize the XMP Toolkit.\n" "\n" @@ -11905,6 +12030,7 @@ static swig_type_info _swigt__p_size_type = {"_p_size_type", "size_type *", 0, 0 static swig_type_info _swigt__p_std__ostream = {"_p_std__ostream", "std::ostream *", 0, 0, (void*)0, 0}; static swig_type_info _swigt__p_std__pairT_int32_t_int32_t_t = {"_p_std__pairT_int32_t_int32_t_t", "Exiv2::Rational *|std::pair< int,int > *", 0, 0, (void*)0, 0}; static swig_type_info _swigt__p_std__pairT_uint32_t_uint32_t_t = {"_p_std__pairT_uint32_t_uint32_t_t", "Exiv2::URational *|std::pair< unsigned int,unsigned int > *", 0, 0, (void*)0, 0}; +static swig_type_info _swigt__p_std__string = {"_p_std__string", "std::string *", 0, 0, (void*)0, 0}; static swig_type_info _swigt__p_std__vectorT_Exiv2__Xmpdatum_std__allocatorT_Exiv2__Xmpdatum_t_t = {"_p_std__vectorT_Exiv2__Xmpdatum_std__allocatorT_Exiv2__Xmpdatum_t_t", "Exiv2::XmpMetadata *|std::vector< Exiv2::Xmpdatum,std::allocator< Exiv2::Xmpdatum > > *", 0, 0, (void*)0, 0}; static swig_type_info _swigt__p_std__vectorT_Exiv2__Xmpdatum_std__allocatorT_Exiv2__Xmpdatum_t_t__iterator = {"_p_std__vectorT_Exiv2__Xmpdatum_std__allocatorT_Exiv2__Xmpdatum_t_t__iterator", "Exiv2::XmpData::iterator *|std::vector< Exiv2::Xmpdatum,std::allocator< Exiv2::Xmpdatum > >::iterator *", 0, 0, (void*)0, 0}; static swig_type_info _swigt__p_unsigned_char = {"_p_unsigned_char", "Exiv2::byte *|uint8_t *|uint_fast8_t *|uint_least8_t *|unsigned char *", 0, 0, (void*)0, 0}; @@ -11976,6 +12102,7 @@ static swig_type_info *swig_type_initial[] = { &_swigt__p_std__ostream, &_swigt__p_std__pairT_int32_t_int32_t_t, &_swigt__p_std__pairT_uint32_t_uint32_t_t, + &_swigt__p_std__string, &_swigt__p_std__vectorT_Exiv2__Xmpdatum_std__allocatorT_Exiv2__Xmpdatum_t_t, &_swigt__p_std__vectorT_Exiv2__Xmpdatum_std__allocatorT_Exiv2__Xmpdatum_t_t__iterator, &_swigt__p_unsigned_char, @@ -12047,6 +12174,7 @@ static swig_cast_info _swigc__p_size_type[] = { {&_swigt__p_size_type, 0, 0, 0} static swig_cast_info _swigc__p_std__ostream[] = { {&_swigt__p_std__ostream, 0, 0, 0},{0, 0, 0, 0}}; static swig_cast_info _swigc__p_std__pairT_int32_t_int32_t_t[] = { {&_swigt__p_std__pairT_int32_t_int32_t_t, 0, 0, 0},{0, 0, 0, 0}}; static swig_cast_info _swigc__p_std__pairT_uint32_t_uint32_t_t[] = { {&_swigt__p_std__pairT_uint32_t_uint32_t_t, 0, 0, 0},{0, 0, 0, 0}}; +static swig_cast_info _swigc__p_std__string[] = { {&_swigt__p_std__string, 0, 0, 0},{0, 0, 0, 0}}; static swig_cast_info _swigc__p_std__vectorT_Exiv2__Xmpdatum_std__allocatorT_Exiv2__Xmpdatum_t_t[] = { {&_swigt__p_std__vectorT_Exiv2__Xmpdatum_std__allocatorT_Exiv2__Xmpdatum_t_t, 0, 0, 0},{0, 0, 0, 0}}; static swig_cast_info _swigc__p_std__vectorT_Exiv2__Xmpdatum_std__allocatorT_Exiv2__Xmpdatum_t_t__iterator[] = { {&_swigt__p_std__vectorT_Exiv2__Xmpdatum_std__allocatorT_Exiv2__Xmpdatum_t_t__iterator, 0, 0, 0},{0, 0, 0, 0}}; static swig_cast_info _swigc__p_unsigned_char[] = { {&_swigt__p_unsigned_char, 0, 0, 0},{0, 0, 0, 0}}; @@ -12118,6 +12246,7 @@ static swig_cast_info *swig_cast_initial[] = { _swigc__p_std__ostream, _swigc__p_std__pairT_int32_t_int32_t_t, _swigc__p_std__pairT_uint32_t_uint32_t_t, + _swigc__p_std__string, _swigc__p_std__vectorT_Exiv2__Xmpdatum_std__allocatorT_Exiv2__Xmpdatum_t_t, _swigc__p_std__vectorT_Exiv2__Xmpdatum_std__allocatorT_Exiv2__Xmpdatum_t_t__iterator, _swigc__p_unsigned_char, diff --git a/src/swig-0_28_8/image_wrap.cxx b/src/swig-0_28_8/image_wrap.cxx index 1b7a1c7c..ad1267eb 100644 --- a/src/swig-0_28_8/image_wrap.cxx +++ b/src/swig-0_28_8/image_wrap.cxx @@ -5725,7 +5725,7 @@ SWIGINTERN PyObject *_wrap_Image_setXmpPacket(PyObject *self, PyObject *args) { std::string *arg2 = 0 ; void *argp1 = 0 ; int res1 = 0 ; - int res2 = SWIG_OLDOBJ ; + int res2 = 0 ; PyObject *swig_obj[2] ; if (!args) SWIG_fail; @@ -5735,17 +5735,14 @@ SWIGINTERN PyObject *_wrap_Image_setXmpPacket(PyObject *self, PyObject *args) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Image_setXmpPacket" "', argument " "1"" of type '" "Exiv2::Image *""'"); } arg1 = reinterpret_cast< Exiv2::Image * >(argp1); - { - std::string *ptr = (std::string *)0; - res2 = SWIG_AsPtr_std_string(swig_obj[0], &ptr); - if (!SWIG_IsOK(res2)) { - SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "Image_setXmpPacket" "', argument " "2"" of type '" "std::string const &""'"); - } - if (!ptr) { - SWIG_exception_fail(SWIG_NullReferenceError, "invalid null reference " "in method '" "Image_setXmpPacket" "', argument " "2"" of type '" "std::string const &""'"); - } - arg2 = ptr; + res2 = SWIG_AsPtr_std_string(swig_obj[0], &arg2); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "Image_setXmpPacket" "', argument " "2"" of type '" "std::string const &""'"); + } + if (!arg2) { + SWIG_exception_fail(SWIG_NullReferenceError, "invalid null reference " "in method '" "Image_setXmpPacket" "', argument " "2"" of type '" "std::string const &""'"); } + res2 = SWIG_AddTmpMask(res2); { #ifdef RELEASE_VIEWS_Image_setXmpPacket if (release_views(self) < 0) { @@ -5763,6 +5760,7 @@ SWIGINTERN PyObject *_wrap_Image_setXmpPacket(PyObject *self, PyObject *args) { } } resultobj = SWIG_Py_Void(); + if (SWIG_IsNewObj(res2)) delete arg2; return resultobj; fail: diff --git a/src/swig-0_28_8/xmp_wrap.cxx b/src/swig-0_28_8/xmp_wrap.cxx index 62b9df9e..db9255a7 100644 --- a/src/swig-0_28_8/xmp_wrap.cxx +++ b/src/swig-0_28_8/xmp_wrap.cxx @@ -4398,15 +4398,16 @@ SwigPyBuiltin_iternextfunc_closure(SwigPyWrapperFunction wrapper, PyObject *a) { #define SWIGTYPE_p_std__ostream swig_types[59] #define SWIGTYPE_p_std__pairT_int32_t_int32_t_t swig_types[60] #define SWIGTYPE_p_std__pairT_uint32_t_uint32_t_t swig_types[61] -#define SWIGTYPE_p_std__vectorT_Exiv2__Xmpdatum_std__allocatorT_Exiv2__Xmpdatum_t_t swig_types[62] -#define SWIGTYPE_p_std__vectorT_Exiv2__Xmpdatum_std__allocatorT_Exiv2__Xmpdatum_t_t__iterator swig_types[63] -#define SWIGTYPE_p_unsigned_char swig_types[64] -#define SWIGTYPE_p_unsigned_int swig_types[65] -#define SWIGTYPE_p_unsigned_long_long swig_types[66] -#define SWIGTYPE_p_unsigned_short swig_types[67] -#define SWIGTYPE_p_value_type swig_types[68] -static swig_type_info *swig_types[70]; -static swig_module_info swig_module = {swig_types, 69, 0, 0, 0, 0}; +#define SWIGTYPE_p_std__string swig_types[62] +#define SWIGTYPE_p_std__vectorT_Exiv2__Xmpdatum_std__allocatorT_Exiv2__Xmpdatum_t_t swig_types[63] +#define SWIGTYPE_p_std__vectorT_Exiv2__Xmpdatum_std__allocatorT_Exiv2__Xmpdatum_t_t__iterator swig_types[64] +#define SWIGTYPE_p_unsigned_char swig_types[65] +#define SWIGTYPE_p_unsigned_int swig_types[66] +#define SWIGTYPE_p_unsigned_long_long swig_types[67] +#define SWIGTYPE_p_unsigned_short swig_types[68] +#define SWIGTYPE_p_value_type swig_types[69] +static swig_type_info *swig_types[71]; +static swig_module_info swig_module = {swig_types, 70, 0, 0, 0, 0}; #define SWIG_TypeQuery(name) SWIG_TypeQueryModule(&swig_module, &swig_module, name) #define SWIG_MangledTypeQuery(name) SWIG_MangledTypeQueryModule(&swig_module, &swig_module, name) @@ -6002,6 +6003,38 @@ SWIG_AsPtr_std_string (PyObject * obj, std::string **val) return SWIG_ERROR; } + +SWIGINTERN int +SWIG_AsVal_unsigned_SS_short (PyObject * obj, unsigned short *val) +{ + unsigned long v; + int res = SWIG_AsVal_unsigned_SS_long (obj, &v); + if (SWIG_IsOK(res)) { + if ((v > USHRT_MAX)) { + return SWIG_OverflowError; + } else { + if (val) *val = static_cast< unsigned short >(v); + } + } + return res; +} + + +SWIGINTERN int +SWIG_AsVal_unsigned_SS_int (PyObject * obj, unsigned int *val) +{ + unsigned long v; + int res = SWIG_AsVal_unsigned_SS_long (obj, &v); + if (SWIG_IsOK(res)) { + if ((v > UINT_MAX)) { + return SWIG_OverflowError; + } else { + if (val) *val = static_cast< unsigned int >(v); + } + } + return res; +} + #ifdef __cplusplus extern "C" { #endif @@ -9544,6 +9577,73 @@ SWIGPY_LENFUNC_CLOSURE(_wrap_XmpData_count) /* defines _wrap_XmpData_count_lenfu SWIGPY_DESTRUCTOR_CLOSURE(_wrap_delete_XmpData) /* defines _wrap_delete_XmpData_destructor_closure */ +SWIGINTERN PyObject *_wrap_XmpParser_encode(PyObject *self, PyObject *args) { + PyObject *resultobj = 0; + std::string *arg1 = 0 ; + Exiv2::XmpData *arg2 = 0 ; + uint16_t arg3 ; + uint32_t arg4 ; + std::string temp1 ; + int res1 = SWIG_TMPOBJ ; + void *argp2 = 0 ; + int res2 = 0 ; + unsigned short val3 ; + int ecode3 = 0 ; + unsigned int val4 ; + int ecode4 = 0 ; + PyObject *swig_obj[3] ; + int result; + + + arg3 = Exiv2::XmpParser::XmpFormatFlags::useCompactFormat; + + arg4 = 0; + arg1 = &temp1; + if (!SWIG_Python_UnpackTuple(args, "XmpParser_encode", 1, 3, swig_obj)) SWIG_fail; + res2 = SWIG_ConvertPtr(swig_obj[0], &argp2, SWIGTYPE_p_Exiv2__XmpData, 0 | 0); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "XmpParser_encode" "', argument " "2"" of type '" "Exiv2::XmpData const &""'"); + } + if (!argp2) { + SWIG_exception_fail(SWIG_NullReferenceError, "invalid null reference " "in method '" "XmpParser_encode" "', argument " "2"" of type '" "Exiv2::XmpData const &""'"); + } + arg2 = reinterpret_cast< Exiv2::XmpData * >(argp2); + if (swig_obj[1]) { + ecode3 = SWIG_AsVal_unsigned_SS_short(swig_obj[1], &val3); + if (!SWIG_IsOK(ecode3)) { + SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "XmpParser_encode" "', argument " "3"" of type '" "uint16_t""'"); + } + arg3 = static_cast< uint16_t >(val3); + } + if (swig_obj[2]) { + ecode4 = SWIG_AsVal_unsigned_SS_int(swig_obj[2], &val4); + if (!SWIG_IsOK(ecode4)) { + SWIG_exception_fail(SWIG_ArgError(ecode4), "in method '" "XmpParser_encode" "', argument " "4"" of type '" "uint32_t""'"); + } + arg4 = static_cast< uint32_t >(val4); + } + { + try { + result = (int)Exiv2::XmpParser::encode(*arg1,(Exiv2::XmpData const &)*arg2,arg3,arg4); + } + catch(std::exception const& e) { + _set_python_exception(); + SWIG_fail; + } + } + resultobj = SWIG_From_int(static_cast< int >(result)); + if (SWIG_IsTmpObj(res1)) { + resultobj = SWIG_Python_AppendOutput(resultobj, SWIG_From_std_string((*arg1)), 0); + } else { + int new_flags = SWIG_IsNewObj(res1) ? (SWIG_POINTER_OWN | 0 ) : 0 ; + resultobj = SWIG_Python_AppendOutput(resultobj, SWIG_NewPointerObj((void*)(arg1), SWIGTYPE_p_std__string, new_flags), 0); + } + return resultobj; +fail: + return NULL; +} + + SWIGINTERN PyObject *_wrap_XmpParser_initialize__SWIG_0(PyObject *self, Py_ssize_t nobjs, PyObject **swig_obj) { PyObject *resultobj = 0; Exiv2::XmpParser::XmpLockFct arg1 = 0 ; @@ -11407,6 +11507,31 @@ SwigPyBuiltin__Exiv2__XmpParser_richcompare(PyObject *self, PyObject *other, int } SWIGINTERN PyMethodDef SwigPyBuiltin__Exiv2__XmpParser_methods[] = { + { "encode", (PyCFunction)(void(*)(void))_wrap_XmpParser_encode, METH_STATIC|METH_VARARGS, "\n" + "Encode (serialize) XMP metadata from *xmpData* into a\n" + " string xmpPacket. The XMP packet returned in the string\n" + " follows the XMP specification. This method only modifies\n" + " *xmpPacket* if the operations succeeds (return code 0).\n" + "\n" + ":type xmpPacket: str\n" + ":param xmpPacket: Reference to a string to hold the encoded XMP\n" + " packet.\n" + ":type xmpData: :py:class:`XmpData`\n" + ":param xmpData: XMP properties to encode.\n" + ":type formatFlags: int, optional\n" + ":param formatFlags: Flags that control the format of the XMP packet,\n" + " see enum XmpFormatFlags.\n" + ":type padding: int, optional\n" + ":param padding: Padding length.\n" + ":rtype: int\n" + ":return: 0 if successful;\n" + "\n" + " 1 if XMP support has not been compiled-in;\n" + "\n" + " 2 if the XMP toolkit failed to initialize;\n" + "\n" + " 3 if the XMP toolkit failed and raised an XMP_Error\n" + "" }, { "initialize", (PyCFunction)(void(*)(void))_wrap_XmpParser_initialize, METH_STATIC|METH_VARARGS, "\n" "Initialize the XMP Toolkit.\n" "\n" @@ -11905,6 +12030,7 @@ static swig_type_info _swigt__p_size_type = {"_p_size_type", "size_type *", 0, 0 static swig_type_info _swigt__p_std__ostream = {"_p_std__ostream", "std::ostream *", 0, 0, (void*)0, 0}; static swig_type_info _swigt__p_std__pairT_int32_t_int32_t_t = {"_p_std__pairT_int32_t_int32_t_t", "Exiv2::Rational *|std::pair< int,int > *", 0, 0, (void*)0, 0}; static swig_type_info _swigt__p_std__pairT_uint32_t_uint32_t_t = {"_p_std__pairT_uint32_t_uint32_t_t", "Exiv2::URational *|std::pair< unsigned int,unsigned int > *", 0, 0, (void*)0, 0}; +static swig_type_info _swigt__p_std__string = {"_p_std__string", "std::string *", 0, 0, (void*)0, 0}; static swig_type_info _swigt__p_std__vectorT_Exiv2__Xmpdatum_std__allocatorT_Exiv2__Xmpdatum_t_t = {"_p_std__vectorT_Exiv2__Xmpdatum_std__allocatorT_Exiv2__Xmpdatum_t_t", "Exiv2::XmpMetadata *|std::vector< Exiv2::Xmpdatum,std::allocator< Exiv2::Xmpdatum > > *", 0, 0, (void*)0, 0}; static swig_type_info _swigt__p_std__vectorT_Exiv2__Xmpdatum_std__allocatorT_Exiv2__Xmpdatum_t_t__iterator = {"_p_std__vectorT_Exiv2__Xmpdatum_std__allocatorT_Exiv2__Xmpdatum_t_t__iterator", "Exiv2::XmpData::iterator *|std::vector< Exiv2::Xmpdatum,std::allocator< Exiv2::Xmpdatum > >::iterator *", 0, 0, (void*)0, 0}; static swig_type_info _swigt__p_unsigned_char = {"_p_unsigned_char", "Exiv2::byte *|uint8_t *|uint_fast8_t *|uint_least8_t *|unsigned char *", 0, 0, (void*)0, 0}; @@ -11976,6 +12102,7 @@ static swig_type_info *swig_type_initial[] = { &_swigt__p_std__ostream, &_swigt__p_std__pairT_int32_t_int32_t_t, &_swigt__p_std__pairT_uint32_t_uint32_t_t, + &_swigt__p_std__string, &_swigt__p_std__vectorT_Exiv2__Xmpdatum_std__allocatorT_Exiv2__Xmpdatum_t_t, &_swigt__p_std__vectorT_Exiv2__Xmpdatum_std__allocatorT_Exiv2__Xmpdatum_t_t__iterator, &_swigt__p_unsigned_char, @@ -12047,6 +12174,7 @@ static swig_cast_info _swigc__p_size_type[] = { {&_swigt__p_size_type, 0, 0, 0} static swig_cast_info _swigc__p_std__ostream[] = { {&_swigt__p_std__ostream, 0, 0, 0},{0, 0, 0, 0}}; static swig_cast_info _swigc__p_std__pairT_int32_t_int32_t_t[] = { {&_swigt__p_std__pairT_int32_t_int32_t_t, 0, 0, 0},{0, 0, 0, 0}}; static swig_cast_info _swigc__p_std__pairT_uint32_t_uint32_t_t[] = { {&_swigt__p_std__pairT_uint32_t_uint32_t_t, 0, 0, 0},{0, 0, 0, 0}}; +static swig_cast_info _swigc__p_std__string[] = { {&_swigt__p_std__string, 0, 0, 0},{0, 0, 0, 0}}; static swig_cast_info _swigc__p_std__vectorT_Exiv2__Xmpdatum_std__allocatorT_Exiv2__Xmpdatum_t_t[] = { {&_swigt__p_std__vectorT_Exiv2__Xmpdatum_std__allocatorT_Exiv2__Xmpdatum_t_t, 0, 0, 0},{0, 0, 0, 0}}; static swig_cast_info _swigc__p_std__vectorT_Exiv2__Xmpdatum_std__allocatorT_Exiv2__Xmpdatum_t_t__iterator[] = { {&_swigt__p_std__vectorT_Exiv2__Xmpdatum_std__allocatorT_Exiv2__Xmpdatum_t_t__iterator, 0, 0, 0},{0, 0, 0, 0}}; static swig_cast_info _swigc__p_unsigned_char[] = { {&_swigt__p_unsigned_char, 0, 0, 0},{0, 0, 0, 0}}; @@ -12118,6 +12246,7 @@ static swig_cast_info *swig_cast_initial[] = { _swigc__p_std__ostream, _swigc__p_std__pairT_int32_t_int32_t_t, _swigc__p_std__pairT_uint32_t_uint32_t_t, + _swigc__p_std__string, _swigc__p_std__vectorT_Exiv2__Xmpdatum_std__allocatorT_Exiv2__Xmpdatum_t_t, _swigc__p_std__vectorT_Exiv2__Xmpdatum_std__allocatorT_Exiv2__Xmpdatum_t_t__iterator, _swigc__p_unsigned_char, diff --git a/tests/test_xmp.py b/tests/test_xmp.py index a8d09afb..61abd21d 100644 --- a/tests/test_xmp.py +++ b/tests/test_xmp.py @@ -37,6 +37,23 @@ def setUpClass(cls): os.environ['LANG'] = name os.environ['LANGUAGE'] = name + def test_XmpParser(self): + parser = exiv2.XmpParser + data = self.image.xmpData() + res, packet = parser.encode(data) + lines = packet.splitlines() + self.assertEqual(res, 0) + self.assertEqual(lines[0], '') + self.assertEqual(lines[-1], '') + res, packet = parser.encode( + data, parser.useCompactFormat | parser.omitPacketWrapper) + lines = packet.splitlines() + self.assertEqual(res, 0) + self.assertEqual(lines[0], '') + self.assertEqual(lines[-1], '') + def test_XmpData(self): # empty container data = exiv2.XmpData() From 88a00d94cab5b6c40535421d70004e4d776d5de7 Mon Sep 17 00:00:00 2001 From: Jim Easterbrook Date: Fri, 24 Jul 2026 15:31:37 +0100 Subject: [PATCH 10/13] Increment python-exiv2 version --- README.rst | 2 +- src/doc/requirements.txt | 2 +- src/swig-0_27_7/__init__.py | 4 ++-- src/swig-0_28_7/__init__.py | 4 ++-- src/swig-0_28_8/__init__.py | 4 ++-- 5 files changed, 8 insertions(+), 8 deletions(-) diff --git a/README.rst b/README.rst index a37f00fd..58ad50ad 100644 --- a/README.rst +++ b/README.rst @@ -1,4 +1,4 @@ -python-exiv2 v\ 0.18.1 +python-exiv2 v\ 0.19.0 ====================== python-exiv2 is a low level interface (or binding) to the exiv2_ C++ library. diff --git a/src/doc/requirements.txt b/src/doc/requirements.txt index 36bdd36f..1501db29 100644 --- a/src/doc/requirements.txt +++ b/src/doc/requirements.txt @@ -1,4 +1,4 @@ -exiv2 == 0.18.1 +exiv2 == 0.19.0 sphinx == 8.2.3 sphinx-rtd-theme == 3.0.2 enum_tools[sphinx] >= 0.13 diff --git a/src/swig-0_27_7/__init__.py b/src/swig-0_27_7/__init__.py index c6d5b85f..592af026 100644 --- a/src/swig-0_27_7/__init__.py +++ b/src/swig-0_27_7/__init__.py @@ -10,9 +10,9 @@ os.environ['PATH'] = _dir + ';' + os.environ['PATH'] #: python-exiv2 version as a string -__version__ = "0.18.1" +__version__ = "0.19.0" #: python-exiv2 version as a tuple of ints -__version_tuple__ = tuple((0, 18, 1)) +__version_tuple__ = tuple((0, 19, 0)) from exiv2.extras import Exiv2Error __all__ = ["Exiv2Error"] diff --git a/src/swig-0_28_7/__init__.py b/src/swig-0_28_7/__init__.py index c6d5b85f..592af026 100644 --- a/src/swig-0_28_7/__init__.py +++ b/src/swig-0_28_7/__init__.py @@ -10,9 +10,9 @@ os.environ['PATH'] = _dir + ';' + os.environ['PATH'] #: python-exiv2 version as a string -__version__ = "0.18.1" +__version__ = "0.19.0" #: python-exiv2 version as a tuple of ints -__version_tuple__ = tuple((0, 18, 1)) +__version_tuple__ = tuple((0, 19, 0)) from exiv2.extras import Exiv2Error __all__ = ["Exiv2Error"] diff --git a/src/swig-0_28_8/__init__.py b/src/swig-0_28_8/__init__.py index c6d5b85f..592af026 100644 --- a/src/swig-0_28_8/__init__.py +++ b/src/swig-0_28_8/__init__.py @@ -10,9 +10,9 @@ os.environ['PATH'] = _dir + ';' + os.environ['PATH'] #: python-exiv2 version as a string -__version__ = "0.18.1" +__version__ = "0.19.0" #: python-exiv2 version as a tuple of ints -__version_tuple__ = tuple((0, 18, 1)) +__version_tuple__ = tuple((0, 19, 0)) from exiv2.extras import Exiv2Error __all__ = ["Exiv2Error"] From 11ffeeafef1b439855b5a46ccafcb0cdd4cf389f Mon Sep 17 00:00:00 2001 From: Jim Easterbrook Date: Sat, 25 Jul 2026 10:13:03 +0100 Subject: [PATCH 11/13] Make XmpFormatFlags enum Pythonic This concludes the changes started in 3ac5f9c --- src/interface/0_27_7/enum_members.i | 14 ++++++ src/interface/0_28_7/enum_members.i | 14 ++++++ src/interface/0_28_8/enum_members.i | 14 ++++++ src/interface/xmp.i | 9 +++- src/swig-0_27_7/_enum_data.py | 43 ++++++++++++++++++ src/swig-0_27_7/xmp_wrap.cxx | 67 ++++++++++++++++++++++++++--- src/swig-0_28_7/_enum_data.py | 43 ++++++++++++++++++ src/swig-0_28_7/xmp_wrap.cxx | 67 ++++++++++++++++++++++++++--- src/swig-0_28_8/_enum_data.py | 43 ++++++++++++++++++ src/swig-0_28_8/xmp_wrap.cxx | 67 ++++++++++++++++++++++++++--- tests/test_xmp.py | 3 +- utils/extract_enums.py | 5 ++- 12 files changed, 364 insertions(+), 25 deletions(-) diff --git a/src/interface/0_27_7/enum_members.i b/src/interface/0_27_7/enum_members.i index 4d7b6454..c93c5f4e 100644 --- a/src/interface/0_27_7/enum_members.i +++ b/src/interface/0_27_7/enum_members.i @@ -36,6 +36,20 @@ static PyObject* _get_enum_data_%mangle(Exiv2::LogMsg::Level)() { NULL); }; } +%fragment("_get_enum_data"{Exiv2::XmpParser::XmpFormatFlags}, "header", + fragment="_get_enum_data") { +static PyObject* _get_enum_data_%mangle(Exiv2::XmpParser::XmpFormatFlags)() { + return _get_enum_data("Exiv2::XmpParser::XmpFormatFlags", + "omitPacketWrapper", Exiv2::XmpParser::omitPacketWrapper, + "readOnlyPacket", Exiv2::XmpParser::readOnlyPacket, + "useCompactFormat", Exiv2::XmpParser::useCompactFormat, + "includeThumbnailPad", Exiv2::XmpParser::includeThumbnailPad, + "exactPacketLength", Exiv2::XmpParser::exactPacketLength, + "writeAliasComments", Exiv2::XmpParser::writeAliasComments, + "omitAllFormatting", Exiv2::XmpParser::omitAllFormatting, + NULL); +}; +} %fragment("_get_enum_data"{Exiv2::XmpValue::XmpArrayType}, "header", fragment="_get_enum_data") { static PyObject* _get_enum_data_%mangle(Exiv2::XmpValue::XmpArrayType)() { diff --git a/src/interface/0_28_7/enum_members.i b/src/interface/0_28_7/enum_members.i index 2b01ca79..940fece4 100644 --- a/src/interface/0_28_7/enum_members.i +++ b/src/interface/0_28_7/enum_members.i @@ -36,6 +36,20 @@ static PyObject* _get_enum_data_%mangle(Exiv2::LogMsg::Level)() { NULL); }; } +%fragment("_get_enum_data"{Exiv2::XmpParser::XmpFormatFlags}, "header", + fragment="_get_enum_data") { +static PyObject* _get_enum_data_%mangle(Exiv2::XmpParser::XmpFormatFlags)() { + return _get_enum_data("Exiv2::XmpParser::XmpFormatFlags", + "omitPacketWrapper", Exiv2::XmpParser::omitPacketWrapper, + "readOnlyPacket", Exiv2::XmpParser::readOnlyPacket, + "useCompactFormat", Exiv2::XmpParser::useCompactFormat, + "includeThumbnailPad", Exiv2::XmpParser::includeThumbnailPad, + "exactPacketLength", Exiv2::XmpParser::exactPacketLength, + "writeAliasComments", Exiv2::XmpParser::writeAliasComments, + "omitAllFormatting", Exiv2::XmpParser::omitAllFormatting, + NULL); +}; +} %fragment("_get_enum_data"{Exiv2::XmpValue::XmpArrayType}, "header", fragment="_get_enum_data") { static PyObject* _get_enum_data_%mangle(Exiv2::XmpValue::XmpArrayType)() { diff --git a/src/interface/0_28_8/enum_members.i b/src/interface/0_28_8/enum_members.i index 2b01ca79..940fece4 100644 --- a/src/interface/0_28_8/enum_members.i +++ b/src/interface/0_28_8/enum_members.i @@ -36,6 +36,20 @@ static PyObject* _get_enum_data_%mangle(Exiv2::LogMsg::Level)() { NULL); }; } +%fragment("_get_enum_data"{Exiv2::XmpParser::XmpFormatFlags}, "header", + fragment="_get_enum_data") { +static PyObject* _get_enum_data_%mangle(Exiv2::XmpParser::XmpFormatFlags)() { + return _get_enum_data("Exiv2::XmpParser::XmpFormatFlags", + "omitPacketWrapper", Exiv2::XmpParser::omitPacketWrapper, + "readOnlyPacket", Exiv2::XmpParser::readOnlyPacket, + "useCompactFormat", Exiv2::XmpParser::useCompactFormat, + "includeThumbnailPad", Exiv2::XmpParser::includeThumbnailPad, + "exactPacketLength", Exiv2::XmpParser::exactPacketLength, + "writeAliasComments", Exiv2::XmpParser::writeAliasComments, + "omitAllFormatting", Exiv2::XmpParser::omitAllFormatting, + NULL); +}; +} %fragment("_get_enum_data"{Exiv2::XmpValue::XmpArrayType}, "header", fragment="_get_enum_data") { static PyObject* _get_enum_data_%mangle(Exiv2::XmpValue::XmpArrayType)() { diff --git a/src/interface/xmp.i b/src/interface/xmp.i index 3c7d5d44..5fb344a9 100644 --- a/src/interface/xmp.i +++ b/src/interface/xmp.i @@ -1,6 +1,6 @@ // python-exiv2 - Python interface to libexiv2 // http://github.com/jim-easterbrook/python-exiv2 -// Copyright (C) 2021-25 Jim Easterbrook jim@jim-easterbrook.me.uk +// Copyright (C) 2021-26 Jim Easterbrook jim@jim-easterbrook.me.uk // // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by @@ -77,6 +77,13 @@ DATA_CONTAINER(XmpData, Xmpdatum, XmpKey, %ignore Exiv2::XmpParser::encode(std::string &, const XmpData &); %ignore Exiv2::XmpParser::encode(std::string &, const XmpData &, uint16_t); +// Make enums more Pythonic +#ifndef SWIGIMPORTED +DEFINE_CLASS_ENUM(XmpParser, XmpFormatFlags,) +#else +IMPORT_CLASS_ENUM(_xmp, XmpParser, XmpFormatFlags) +#endif + // Ignore const overloads of some methods %ignore Exiv2::XmpData::begin() const; %ignore Exiv2::XmpData::end() const; diff --git a/src/swig-0_27_7/_enum_data.py b/src/swig-0_27_7/_enum_data.py index 9f37cf15..33079c4b 100644 --- a/src/swig-0_27_7/_enum_data.py +++ b/src/swig-0_27_7/_enum_data.py @@ -152,6 +152,49 @@ 'xmpText': 'XMP text type. '}}, 'Exiv2::XmpCategory': {'doc': 'Category of an XMP property. ', 'values': {}}, + 'Exiv2::XmpParser::XmpFormatFlags': {'doc': 'Options to control the ' + 'format of the serialized ' + 'XMP packet. ', + 'values': {'exactPacketLength': 'The ' + 'padding ' + 'parameter ' + 'is ' + 'the ' + 'overall ' + 'packet ' + 'length. ', + 'includeThumbnailPad': 'Include ' + 'a ' + 'padding ' + 'allowance ' + 'for ' + 'a ' + 'thumbnail ' + 'image. ', + 'omitAllFormatting': 'Omit ' + 'all ' + 'formatting ' + 'whitespace. ', + 'omitPacketWrapper': 'Omit ' + 'the ' + 'XML ' + 'packet ' + 'wrapper. ', + 'readOnlyPacket': 'Default ' + 'is a ' + 'writeable ' + 'packet. ', + 'useCompactFormat': 'Use ' + 'a ' + 'compact ' + 'form ' + 'of ' + 'RDF. ', + 'writeAliasComments': 'Show ' + 'aliases ' + 'as ' + 'XML ' + 'comments. '}}, 'Exiv2::XmpValue::XmpArrayType': {'doc': 'XMP array types. ', 'values': {}}, 'Exiv2::XmpValue::XmpStruct': {'doc': 'XMP structure indicator. ', diff --git a/src/swig-0_27_7/xmp_wrap.cxx b/src/swig-0_27_7/xmp_wrap.cxx index ea9ca704..1b157d2f 100644 --- a/src/swig-0_27_7/xmp_wrap.cxx +++ b/src/swig-0_27_7/xmp_wrap.cxx @@ -5773,6 +5773,52 @@ static int _contains_Exiv2_XmpData(PyObject* py_self, PyObject* py_key) { return self->findKey(Exiv2::XmpKey(key)) != self->end() ? 1 : 0; }; + +static PyObject* Python_Exiv2_XmpParser_XmpFormatFlags = NULL; + + +static PyObject* Python_Exiv2_extras_create_enum = NULL; + + + + +// Convert enum names & values to a Python list +static PyObject* _get_enum_data(const char* name, ...) { + PyObject* py_obj = NULL; + PyObject* members = PyList_New(0); + va_list args; + va_start(args, name); + char* label = va_arg(args, char*); + while (label) { + py_obj = Py_BuildValue("(si)", label, va_arg(args, int)); + PyList_Append(members, py_obj); + Py_DECREF(py_obj); + label = va_arg(args, char*); + } + va_end(args); + return members; +}; +// Call Python to create an enum from list of names & values +static PyObject* _create_enum(const char* name, const char* alias_strip, + PyObject* members) { + return PyObject_CallFunction( + Python_Exiv2_extras_create_enum, "(sssN)", + SWIG_name, name, alias_strip, members); +}; + + +static PyObject* _get_enum_data_Exiv2_XmpParser_XmpFormatFlags() { + return _get_enum_data("Exiv2::XmpParser::XmpFormatFlags", + "omitPacketWrapper", Exiv2::XmpParser::omitPacketWrapper, + "readOnlyPacket", Exiv2::XmpParser::readOnlyPacket, + "useCompactFormat", Exiv2::XmpParser::useCompactFormat, + "includeThumbnailPad", Exiv2::XmpParser::includeThumbnailPad, + "exactPacketLength", Exiv2::XmpParser::exactPacketLength, + "writeAliasComments", Exiv2::XmpParser::writeAliasComments, + "omitAllFormatting", Exiv2::XmpParser::omitAllFormatting, + NULL); +}; + SWIGINTERN bool Exiv2_Xmpdatum_operator_Se__Se_(Exiv2::Xmpdatum const *self,Exiv2::Xmpdatum const &other){ return &other == self; } @@ -12908,6 +12954,19 @@ SWIGINTERN int SWIG_mod_exec(PyObject *m) { SwigPyBuiltin_AddPublicSymbol(public_interface, "Xmpdatum_reference"); d = md; + Python_Exiv2_extras_create_enum = import_from_python("exiv2.extras","_create_enum"); + if (!Python_Exiv2_extras_create_enum) + return INIT_ERROR_RETURN; + + + Python_Exiv2_XmpParser_XmpFormatFlags = _create_enum( + "Exiv2::XmpParser::XmpFormatFlags","", _get_enum_data_Exiv2_XmpParser_XmpFormatFlags()); + if (!Python_Exiv2_XmpParser_XmpFormatFlags) + return INIT_ERROR_RETURN; + // SWIG_Python_SetConstant will decref PyEnum object + Py_INCREF(Python_Exiv2_XmpParser_XmpFormatFlags); + + /* type 'Exiv2::Xmpdatum' */ d = PyDict_New(); builtin_base_count = 0; @@ -12955,13 +13014,7 @@ SWIGINTERN int SWIG_mod_exec(PyObject *m) { /* type 'Exiv2::XmpParser' */ d = PyDict_New(); - SWIG_Python_SetConstant(d, d == md ? public_interface : NULL, "omitPacketWrapper",SWIG_From_int(static_cast< int >(Exiv2::XmpParser::omitPacketWrapper))); - SWIG_Python_SetConstant(d, d == md ? public_interface : NULL, "readOnlyPacket",SWIG_From_int(static_cast< int >(Exiv2::XmpParser::readOnlyPacket))); - SWIG_Python_SetConstant(d, d == md ? public_interface : NULL, "useCompactFormat",SWIG_From_int(static_cast< int >(Exiv2::XmpParser::useCompactFormat))); - SWIG_Python_SetConstant(d, d == md ? public_interface : NULL, "includeThumbnailPad",SWIG_From_int(static_cast< int >(Exiv2::XmpParser::includeThumbnailPad))); - SWIG_Python_SetConstant(d, d == md ? public_interface : NULL, "exactPacketLength",SWIG_From_int(static_cast< int >(Exiv2::XmpParser::exactPacketLength))); - SWIG_Python_SetConstant(d, d == md ? public_interface : NULL, "writeAliasComments",SWIG_From_int(static_cast< int >(Exiv2::XmpParser::writeAliasComments))); - SWIG_Python_SetConstant(d, d == md ? public_interface : NULL, "omitAllFormatting",SWIG_From_int(static_cast< int >(Exiv2::XmpParser::omitAllFormatting))); + SWIG_Python_SetConstant(d, d == md ? public_interface : NULL, "XmpFormatFlags",Python_Exiv2_XmpParser_XmpFormatFlags); builtin_base_count = 0; builtin_bases[builtin_base_count] = NULL; PyDict_SetItemString(d, "this", this_descr); diff --git a/src/swig-0_28_7/_enum_data.py b/src/swig-0_28_7/_enum_data.py index bff54c24..eebc919d 100644 --- a/src/swig-0_28_7/_enum_data.py +++ b/src/swig-0_28_7/_enum_data.py @@ -103,6 +103,49 @@ 'xmpText': 'XMP text type. '}}, 'Exiv2::XmpCategory': {'doc': 'Category of an XMP property. ', 'values': {}}, + 'Exiv2::XmpParser::XmpFormatFlags': {'doc': 'Options to control the ' + 'format of the serialized ' + 'XMP packet. ', + 'values': {'exactPacketLength': 'The ' + 'padding ' + 'parameter ' + 'is ' + 'the ' + 'overall ' + 'packet ' + 'length. ', + 'includeThumbnailPad': 'Include ' + 'a ' + 'padding ' + 'allowance ' + 'for ' + 'a ' + 'thumbnail ' + 'image. ', + 'omitAllFormatting': 'Omit ' + 'all ' + 'formatting ' + 'whitespace. ', + 'omitPacketWrapper': 'Omit ' + 'the ' + 'XML ' + 'packet ' + 'wrapper. ', + 'readOnlyPacket': 'Default ' + 'is a ' + 'writeable ' + 'packet. ', + 'useCompactFormat': 'Use ' + 'a ' + 'compact ' + 'form ' + 'of ' + 'RDF. ', + 'writeAliasComments': 'Show ' + 'aliases ' + 'as ' + 'XML ' + 'comments. '}}, 'Exiv2::XmpValue::XmpArrayType': {'doc': 'XMP array types. ', 'values': {}}, 'Exiv2::XmpValue::XmpStruct': {'doc': 'XMP structure indicator. ', diff --git a/src/swig-0_28_7/xmp_wrap.cxx b/src/swig-0_28_7/xmp_wrap.cxx index db9255a7..c1d29a9a 100644 --- a/src/swig-0_28_7/xmp_wrap.cxx +++ b/src/swig-0_28_7/xmp_wrap.cxx @@ -5935,6 +5935,52 @@ static int _contains_Exiv2_XmpData(PyObject* py_self, PyObject* py_key) { return self->findKey(Exiv2::XmpKey(key)) != self->end() ? 1 : 0; }; + +static PyObject* Python_Exiv2_XmpParser_XmpFormatFlags = NULL; + + +static PyObject* Python_Exiv2_extras_create_enum = NULL; + + + + +// Convert enum names & values to a Python list +static PyObject* _get_enum_data(const char* name, ...) { + PyObject* py_obj = NULL; + PyObject* members = PyList_New(0); + va_list args; + va_start(args, name); + char* label = va_arg(args, char*); + while (label) { + py_obj = Py_BuildValue("(si)", label, va_arg(args, int)); + PyList_Append(members, py_obj); + Py_DECREF(py_obj); + label = va_arg(args, char*); + } + va_end(args); + return members; +}; +// Call Python to create an enum from list of names & values +static PyObject* _create_enum(const char* name, const char* alias_strip, + PyObject* members) { + return PyObject_CallFunction( + Python_Exiv2_extras_create_enum, "(sssN)", + SWIG_name, name, alias_strip, members); +}; + + +static PyObject* _get_enum_data_Exiv2_XmpParser_XmpFormatFlags() { + return _get_enum_data("Exiv2::XmpParser::XmpFormatFlags", + "omitPacketWrapper", Exiv2::XmpParser::omitPacketWrapper, + "readOnlyPacket", Exiv2::XmpParser::readOnlyPacket, + "useCompactFormat", Exiv2::XmpParser::useCompactFormat, + "includeThumbnailPad", Exiv2::XmpParser::includeThumbnailPad, + "exactPacketLength", Exiv2::XmpParser::exactPacketLength, + "writeAliasComments", Exiv2::XmpParser::writeAliasComments, + "omitAllFormatting", Exiv2::XmpParser::omitAllFormatting, + NULL); +}; + SWIGINTERN bool Exiv2_Xmpdatum_operator_Se__Se_(Exiv2::Xmpdatum const *self,Exiv2::Xmpdatum const &other){ return &other == self; } @@ -13083,6 +13129,19 @@ SWIGINTERN int SWIG_mod_exec(PyObject *m) { SwigPyBuiltin_AddPublicSymbol(public_interface, "Xmpdatum_reference"); d = md; + Python_Exiv2_extras_create_enum = import_from_python("exiv2.extras","_create_enum"); + if (!Python_Exiv2_extras_create_enum) + return INIT_ERROR_RETURN; + + + Python_Exiv2_XmpParser_XmpFormatFlags = _create_enum( + "Exiv2::XmpParser::XmpFormatFlags","", _get_enum_data_Exiv2_XmpParser_XmpFormatFlags()); + if (!Python_Exiv2_XmpParser_XmpFormatFlags) + return INIT_ERROR_RETURN; + // SWIG_Python_SetConstant will decref PyEnum object + Py_INCREF(Python_Exiv2_XmpParser_XmpFormatFlags); + + /* type 'Exiv2::Xmpdatum' */ d = PyDict_New(); builtin_base_count = 0; @@ -13130,13 +13189,7 @@ SWIGINTERN int SWIG_mod_exec(PyObject *m) { /* type 'Exiv2::XmpParser' */ d = PyDict_New(); - SWIG_Python_SetConstant(d, d == md ? public_interface : NULL, "omitPacketWrapper",SWIG_From_int(static_cast< int >(Exiv2::XmpParser::omitPacketWrapper))); - SWIG_Python_SetConstant(d, d == md ? public_interface : NULL, "readOnlyPacket",SWIG_From_int(static_cast< int >(Exiv2::XmpParser::readOnlyPacket))); - SWIG_Python_SetConstant(d, d == md ? public_interface : NULL, "useCompactFormat",SWIG_From_int(static_cast< int >(Exiv2::XmpParser::useCompactFormat))); - SWIG_Python_SetConstant(d, d == md ? public_interface : NULL, "includeThumbnailPad",SWIG_From_int(static_cast< int >(Exiv2::XmpParser::includeThumbnailPad))); - SWIG_Python_SetConstant(d, d == md ? public_interface : NULL, "exactPacketLength",SWIG_From_int(static_cast< int >(Exiv2::XmpParser::exactPacketLength))); - SWIG_Python_SetConstant(d, d == md ? public_interface : NULL, "writeAliasComments",SWIG_From_int(static_cast< int >(Exiv2::XmpParser::writeAliasComments))); - SWIG_Python_SetConstant(d, d == md ? public_interface : NULL, "omitAllFormatting",SWIG_From_int(static_cast< int >(Exiv2::XmpParser::omitAllFormatting))); + SWIG_Python_SetConstant(d, d == md ? public_interface : NULL, "XmpFormatFlags",Python_Exiv2_XmpParser_XmpFormatFlags); builtin_base_count = 0; builtin_bases[builtin_base_count] = NULL; PyDict_SetItemString(d, "this", this_descr); diff --git a/src/swig-0_28_8/_enum_data.py b/src/swig-0_28_8/_enum_data.py index bff54c24..eebc919d 100644 --- a/src/swig-0_28_8/_enum_data.py +++ b/src/swig-0_28_8/_enum_data.py @@ -103,6 +103,49 @@ 'xmpText': 'XMP text type. '}}, 'Exiv2::XmpCategory': {'doc': 'Category of an XMP property. ', 'values': {}}, + 'Exiv2::XmpParser::XmpFormatFlags': {'doc': 'Options to control the ' + 'format of the serialized ' + 'XMP packet. ', + 'values': {'exactPacketLength': 'The ' + 'padding ' + 'parameter ' + 'is ' + 'the ' + 'overall ' + 'packet ' + 'length. ', + 'includeThumbnailPad': 'Include ' + 'a ' + 'padding ' + 'allowance ' + 'for ' + 'a ' + 'thumbnail ' + 'image. ', + 'omitAllFormatting': 'Omit ' + 'all ' + 'formatting ' + 'whitespace. ', + 'omitPacketWrapper': 'Omit ' + 'the ' + 'XML ' + 'packet ' + 'wrapper. ', + 'readOnlyPacket': 'Default ' + 'is a ' + 'writeable ' + 'packet. ', + 'useCompactFormat': 'Use ' + 'a ' + 'compact ' + 'form ' + 'of ' + 'RDF. ', + 'writeAliasComments': 'Show ' + 'aliases ' + 'as ' + 'XML ' + 'comments. '}}, 'Exiv2::XmpValue::XmpArrayType': {'doc': 'XMP array types. ', 'values': {}}, 'Exiv2::XmpValue::XmpStruct': {'doc': 'XMP structure indicator. ', diff --git a/src/swig-0_28_8/xmp_wrap.cxx b/src/swig-0_28_8/xmp_wrap.cxx index db9255a7..c1d29a9a 100644 --- a/src/swig-0_28_8/xmp_wrap.cxx +++ b/src/swig-0_28_8/xmp_wrap.cxx @@ -5935,6 +5935,52 @@ static int _contains_Exiv2_XmpData(PyObject* py_self, PyObject* py_key) { return self->findKey(Exiv2::XmpKey(key)) != self->end() ? 1 : 0; }; + +static PyObject* Python_Exiv2_XmpParser_XmpFormatFlags = NULL; + + +static PyObject* Python_Exiv2_extras_create_enum = NULL; + + + + +// Convert enum names & values to a Python list +static PyObject* _get_enum_data(const char* name, ...) { + PyObject* py_obj = NULL; + PyObject* members = PyList_New(0); + va_list args; + va_start(args, name); + char* label = va_arg(args, char*); + while (label) { + py_obj = Py_BuildValue("(si)", label, va_arg(args, int)); + PyList_Append(members, py_obj); + Py_DECREF(py_obj); + label = va_arg(args, char*); + } + va_end(args); + return members; +}; +// Call Python to create an enum from list of names & values +static PyObject* _create_enum(const char* name, const char* alias_strip, + PyObject* members) { + return PyObject_CallFunction( + Python_Exiv2_extras_create_enum, "(sssN)", + SWIG_name, name, alias_strip, members); +}; + + +static PyObject* _get_enum_data_Exiv2_XmpParser_XmpFormatFlags() { + return _get_enum_data("Exiv2::XmpParser::XmpFormatFlags", + "omitPacketWrapper", Exiv2::XmpParser::omitPacketWrapper, + "readOnlyPacket", Exiv2::XmpParser::readOnlyPacket, + "useCompactFormat", Exiv2::XmpParser::useCompactFormat, + "includeThumbnailPad", Exiv2::XmpParser::includeThumbnailPad, + "exactPacketLength", Exiv2::XmpParser::exactPacketLength, + "writeAliasComments", Exiv2::XmpParser::writeAliasComments, + "omitAllFormatting", Exiv2::XmpParser::omitAllFormatting, + NULL); +}; + SWIGINTERN bool Exiv2_Xmpdatum_operator_Se__Se_(Exiv2::Xmpdatum const *self,Exiv2::Xmpdatum const &other){ return &other == self; } @@ -13083,6 +13129,19 @@ SWIGINTERN int SWIG_mod_exec(PyObject *m) { SwigPyBuiltin_AddPublicSymbol(public_interface, "Xmpdatum_reference"); d = md; + Python_Exiv2_extras_create_enum = import_from_python("exiv2.extras","_create_enum"); + if (!Python_Exiv2_extras_create_enum) + return INIT_ERROR_RETURN; + + + Python_Exiv2_XmpParser_XmpFormatFlags = _create_enum( + "Exiv2::XmpParser::XmpFormatFlags","", _get_enum_data_Exiv2_XmpParser_XmpFormatFlags()); + if (!Python_Exiv2_XmpParser_XmpFormatFlags) + return INIT_ERROR_RETURN; + // SWIG_Python_SetConstant will decref PyEnum object + Py_INCREF(Python_Exiv2_XmpParser_XmpFormatFlags); + + /* type 'Exiv2::Xmpdatum' */ d = PyDict_New(); builtin_base_count = 0; @@ -13130,13 +13189,7 @@ SWIGINTERN int SWIG_mod_exec(PyObject *m) { /* type 'Exiv2::XmpParser' */ d = PyDict_New(); - SWIG_Python_SetConstant(d, d == md ? public_interface : NULL, "omitPacketWrapper",SWIG_From_int(static_cast< int >(Exiv2::XmpParser::omitPacketWrapper))); - SWIG_Python_SetConstant(d, d == md ? public_interface : NULL, "readOnlyPacket",SWIG_From_int(static_cast< int >(Exiv2::XmpParser::readOnlyPacket))); - SWIG_Python_SetConstant(d, d == md ? public_interface : NULL, "useCompactFormat",SWIG_From_int(static_cast< int >(Exiv2::XmpParser::useCompactFormat))); - SWIG_Python_SetConstant(d, d == md ? public_interface : NULL, "includeThumbnailPad",SWIG_From_int(static_cast< int >(Exiv2::XmpParser::includeThumbnailPad))); - SWIG_Python_SetConstant(d, d == md ? public_interface : NULL, "exactPacketLength",SWIG_From_int(static_cast< int >(Exiv2::XmpParser::exactPacketLength))); - SWIG_Python_SetConstant(d, d == md ? public_interface : NULL, "writeAliasComments",SWIG_From_int(static_cast< int >(Exiv2::XmpParser::writeAliasComments))); - SWIG_Python_SetConstant(d, d == md ? public_interface : NULL, "omitAllFormatting",SWIG_From_int(static_cast< int >(Exiv2::XmpParser::omitAllFormatting))); + SWIG_Python_SetConstant(d, d == md ? public_interface : NULL, "XmpFormatFlags",Python_Exiv2_XmpParser_XmpFormatFlags); builtin_base_count = 0; builtin_bases[builtin_base_count] = NULL; PyDict_SetItemString(d, "this", this_descr); diff --git a/tests/test_xmp.py b/tests/test_xmp.py index 61abd21d..fbc3bb95 100644 --- a/tests/test_xmp.py +++ b/tests/test_xmp.py @@ -47,7 +47,8 @@ def test_XmpParser(self): ' id="W5M0MpCehiHzreSzNTczkc9d"?>') self.assertEqual(lines[-1], '') res, packet = parser.encode( - data, parser.useCompactFormat | parser.omitPacketWrapper) + data, parser.XmpFormatFlags.useCompactFormat | + parser.XmpFormatFlags.omitPacketWrapper) lines = packet.splitlines() self.assertEqual(res, 0) self.assertEqual(lines[0], ' Date: Thu, 30 Jul 2026 09:10:49 +0100 Subject: [PATCH 12/13] Update change log --- CHANGELOG.txt | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/CHANGELOG.txt b/CHANGELOG.txt index c766597c..c2d5a94f 100644 --- a/CHANGELOG.txt +++ b/CHANGELOG.txt @@ -16,6 +16,11 @@ You should have received a copy of the GNU General Public License along with this program. If not, see . +Changes in v0.19.0: + 1/ Add exiv2.XmpParser.encode() to Python interface. + 2/ Fix crash when getting strings of malformed values. + 3/ Python 3.15 compatibility. + Changes in v0.18.1: 1/ Binary wheels incorporate libexiv2 v0.28.8 From 4d372edd01ce8c27f211f678b77e1cbbc25ae378 Mon Sep 17 00:00:00 2001 From: Jim Easterbrook Date: Thu, 30 Jul 2026 09:15:17 +0100 Subject: [PATCH 13/13] Catch deprecation warning in test --- tests/test_value.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/tests/test_value.py b/tests/test_value.py index cc64a238..347c2ef0 100644 --- a/tests/test_value.py +++ b/tests/test_value.py @@ -207,7 +207,8 @@ def test_CommentValue(self): return value = exiv2.CommentValue() # read some invalid data (odd length UTF-16) - value.read(data[:-1]) + with self.assertWarns(DeprecationWarning): + value.read(data[:-1]) with self.assertRaises(exiv2.Exiv2Error) as cm: str(value) self.assertEqual(cm.exception.code,