[Lldb-commits] [PATCH] D77480: Fix illegal early call to PyBuffer_Release in swig typemaps
Lawrence D'Anna via Phabricator via lldb-commits
lldb-commits at lists.llvm.org
Mon Apr 6 13:04:47 PDT 2020
lawrence_danna updated this revision to Diff 255447.
lawrence_danna added a comment.
review fixes
Repository:
rG LLVM Github Monorepo
CHANGES SINCE LAST ACTION
https://reviews.llvm.org/D77480/new/
https://reviews.llvm.org/D77480
Files:
lldb/bindings/python/python-typemaps.swig
Index: lldb/bindings/python/python-typemaps.swig
===================================================================
--- lldb/bindings/python/python-typemaps.swig
+++ lldb/bindings/python/python-typemaps.swig
@@ -488,39 +488,52 @@
}
}
+%inline %{
+
+struct Py_buffer_RAII {
+ Py_buffer buffer;
+ Py_buffer_RAII() { buffer = {}; };
+ Py_buffer_RAII(const Py_buffer_RAII &) = delete;
+ ~Py_buffer_RAII() {
+ if (buffer.obj)
+ PyBuffer_Release(&buffer);
+ }
+};
+
+%}
+
// 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
+//
+// 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) {
+%typemap(in) (TYPEMAP, SIZE) (Py_buffer_RAII view) {
int res; Py_ssize_t size = 0; void *buf = 0;
- Py_buffer view;
- res = PyObject_GetBuffer($input, &view, PyBUF_WRITABLE);
+ res = PyObject_GetBuffer($input, &view.buffer, PyBUF_WRITABLE);
if (res < 0) {
PyErr_Clear();
%argument_fail(res, "(TYPEMAP, SIZE)", $symname, $argnum);
}
- size = view.len;
- buf = view.buf;
- PyBuffer_Release(&view);
+ size = view.buffer.len;
+ buf = view.buffer.buf;
$1 = ($1_ltype) buf;
$2 = ($2_ltype) (size/sizeof($*1_type));
}
%enddef
%define %pybuffer_binary(TYPEMAP, SIZE)
-%typemap(in) (TYPEMAP, SIZE) {
+%typemap(in) (TYPEMAP, SIZE) (Py_buffer_RAII view) {
int res; Py_ssize_t size = 0; const void *buf = 0;
- Py_buffer view;
- res = PyObject_GetBuffer($input, &view, PyBUF_CONTIG_RO);
+ res = PyObject_GetBuffer($input, &view.buffer, PyBUF_CONTIG_RO);
if (res < 0) {
PyErr_Clear();
%argument_fail(res, "(TYPEMAP, SIZE)", $symname, $argnum);
}
- size = view.len;
- buf = view.buf;
- PyBuffer_Release(&view);
+ size = view.buffer.len;
+ buf = view.buffer.buf;
$1 = ($1_ltype) buf;
$2 = ($2_ltype) (size / sizeof($*1_type));
}
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D77480.255447.patch
Type: text/x-patch
Size: 2107 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/lldb-commits/attachments/20200406/5bc197f9/attachment.bin>
More information about the lldb-commits
mailing list