From 8f63ba79b77dcd7b567f28385e9025b82f2bf393 Mon Sep 17 00:00:00 2001 From: Jesse Rosenstock Date: Wed, 31 Dec 2025 11:35:30 +0100 Subject: [PATCH] SWIG: Ensure SWIG 4.4 compatibility SWIG_Python_TypeError was removed in SWIG 4.4. Use %argument_fail instead. Fixes https://github.com/google/s2geometry/issues/487. --- src/python/s2_common.i | 40 ++++++++++++++++++++-------------------- 1 file changed, 20 insertions(+), 20 deletions(-) diff --git a/src/python/s2_common.i b/src/python/s2_common.i index 845859a49..9e28e79c2 100755 --- a/src/python/s2_common.i +++ b/src/python/s2_common.i @@ -156,29 +156,29 @@ public: %apply SWIGTYPE *DISOWN {S2Builder::Layer *layer_disown}; %apply SWIGTYPE *DISOWN {S2Polygon *polygon_disown}; -%typemap(in) std::vector * (std::vector loops){ - PyObject *element(nullptr); - PyObject *iterator(PyObject_GetIter($input)); - if (!iterator) { - SWIG_fail; +%typemap(in) std::vector * (std::vector loops) { + PyObject *iter = PyObject_GetIter($input); + if (iter == nullptr) { + %argument_fail(SWIG_TypeError, "iterable of S2Loop *", $symname, $argnum); } - int i(0); - while ((element = PyIter_Next(iterator))) { - i++; - S2Loop *loop(nullptr); - int res(SWIG_ConvertPtr(element, (void **)&loop, $descriptor(S2Loop *), 0)); - if (SWIG_IsOK(res)) { - loops.push_back(loop->Clone()); - } else { - SWIG_Python_TypeError(SWIG_TypePrettyName($descriptor(S2Loop *)), element); - SWIG_Python_ArgFail(i); - Py_DECREF(element); - Py_DECREF(iterator); - SWIG_fail; + + for (PyObject *elem; (elem = PyIter_Next(iter)); Py_DECREF(elem)) { + S2Loop *loop = nullptr; + int res = SWIG_ConvertPtr( + elem, reinterpret_cast(&loop), $descriptor(S2Loop *), + SWIG_POINTER_NO_NULL); + + if (!SWIG_IsOK(res)) { + Py_DECREF(elem); + Py_DECREF(iter); + for (S2Loop *loop : loops) delete loop; + %argument_fail(res, "$type", $symname, $argnum); } - Py_DECREF(element); + + loops.push_back(new S2Loop(*loop)); } - Py_DECREF(iterator); + + Py_DECREF(iter); $1 = &loops; }