From 80c9e7c7094a4b7af121cdd9ff1b686ef42ee083 Mon Sep 17 00:00:00 2001 From: Jonas Devlieghere Date: Thu, 13 Nov 2025 11:24:29 -0800 Subject: [PATCH] Revert "[lldb] Limit Py_buffer_RAII to SWIG < 4.1 (#167808)" This reverts commit ac2d3d1da68ddab7f663afec39637452eca35572. --- lldb/bindings/python/python-typemaps.h | 19 +++++++++++++++++ lldb/bindings/python/python-typemaps.swig | 26 +++++++++-------------- 2 files changed, 29 insertions(+), 16 deletions(-) create mode 100644 lldb/bindings/python/python-typemaps.h diff --git a/lldb/bindings/python/python-typemaps.h b/lldb/bindings/python/python-typemaps.h new file mode 100644 index 0000000000000..8a533e822988e --- /dev/null +++ b/lldb/bindings/python/python-typemaps.h @@ -0,0 +1,19 @@ +#ifndef LLDB_BINDINGS_PYTHON_PYTHON_TYPEMAPS_H +#define LLDB_BINDINGS_PYTHON_PYTHON_TYPEMAPS_H + +#include + +// Defined here instead of a .swig file because SWIG 2 doesn't support +// explicit deleted functions. +struct Py_buffer_RAII { + Py_buffer buffer = {}; + Py_buffer_RAII(){}; + Py_buffer &operator=(const Py_buffer_RAII &) = delete; + Py_buffer_RAII(const Py_buffer_RAII &) = delete; + ~Py_buffer_RAII() { + if (buffer.obj) + PyBuffer_Release(&buffer); + } +}; + +#endif // LLDB_BINDINGS_PYTHON_PYTHON_TYPEMAPS_H diff --git a/lldb/bindings/python/python-typemaps.swig b/lldb/bindings/python/python-typemaps.swig index 841162beb4e30..4d3a95768f2f3 100644 --- a/lldb/bindings/python/python-typemaps.swig +++ b/lldb/bindings/python/python-typemaps.swig @@ -6,6 +6,12 @@ AND call SWIG_fail at the same time, because it will result in a double free. */ +%inline %{ + +#include "../bindings/python/python-typemaps.h" + +%} + %typemap(in) char ** { /* Check if is a list */ if (PythonList::Check($input)) { @@ -628,21 +634,12 @@ template <> bool SetNumberFromPyObject(double &number, PyObject *obj) { } } -#if SWIG_VERSION < 0x040100 -// The two pybuffer macros below are copied out of swig/Lib/python/pybuffer.i, +// These two pybuffer macros are copied out of swig/Lib/python/pybuffer.i, // and fixed so they will not crash if PyObject_GetBuffer fails. // https://github.com/swig/swig/issues/1640 - -struct Py_buffer_RAII { - Py_buffer buffer = {}; - Py_buffer_RAII(){}; - Py_buffer &operator=(const Py_buffer_RAII &) = delete; - Py_buffer_RAII(const Py_buffer_RAII &) = delete; - ~Py_buffer_RAII() { - if (buffer.obj) - PyBuffer_Release(&buffer); - } -}; +// +// I've also moved the call to PyBuffer_Release to the end of the SWIG wrapper, +// doing it right away is not legal according to the python buffer protocol. %define %pybuffer_mutable_binary(TYPEMAP, SIZE) %typemap(in) (TYPEMAP, SIZE) (Py_buffer_RAII view) { @@ -677,9 +674,6 @@ struct Py_buffer_RAII { $2 = ($2_ltype)(size / sizeof($*1_type)); } %enddef -#else -%include -#endif %pybuffer_binary(const uint8_t *buf, size_t num_bytes); %pybuffer_mutable_binary(uint8_t *buf, size_t num_bytes);