Update pybuffer.i library to use new-style Python buffer C API.
Removed old API altogether as Python 2.7 is now the minimum version supported and it supports the new-style buffer API.
This commit is contained in:
parent
33f3dbb005
commit
4313c2c168
4 changed files with 18 additions and 33 deletions
|
|
@ -7,6 +7,9 @@ the issue number to the end of the URL: https://github.com/swig/swig/issues/
|
|||
Version 4.0.0 (in progress)
|
||||
===========================
|
||||
|
||||
2018-08-12: gmazzamuto
|
||||
[Python] #1283 Update pybuffer.i library to use new-style Python buffer C API.
|
||||
|
||||
2018-08-12: brianhatwood,wsfulton
|
||||
[Java] #1303 #1304 Fix crash in directors when using OUTPUT and INOUT typemaps in typemaps.i and
|
||||
passing NULL pointers in C++ to director method overloaded and implemented in Java.
|
||||
|
|
|
|||
|
|
@ -6272,8 +6272,8 @@ For detailed usage of function annotation, see
|
|||
|
||||
|
||||
<p>
|
||||
Buffer protocols were revised in Python 3. SWIG also gains a series of
|
||||
new typemaps to support buffer interfaces. These typemap macros are
|
||||
SWIG has a series of
|
||||
typemaps to support buffer interfaces. These typemap macros are
|
||||
defined in <tt>pybuffer.i</tt>, which must be included in order to use them.
|
||||
By using these typemaps, your wrapped function will be able to
|
||||
accept any Python object that exposes a suitable buffer interface.
|
||||
|
|
@ -6398,7 +6398,7 @@ type.
|
|||
This macro maps an object's buffer to a pointer <tt>parm</tt> and a
|
||||
size <tt>size_parm</tt>. It is similar to
|
||||
<tt>%pybuffer_mutable_binary</tt>, except the
|
||||
<tt>%pybuffer_binary</tt> an accept both mutable and immutable
|
||||
<tt>%pybuffer_binary</tt> can accept both mutable and immutable
|
||||
buffers. As a result, the wrapped function should not modify the buffer.
|
||||
</p>
|
||||
|
||||
|
|
|
|||
|
|
@ -1,6 +1,6 @@
|
|||
%module python_pybuf
|
||||
%include<pybuffer.i>
|
||||
%include<cstring.i>
|
||||
%include <pybuffer.i>
|
||||
%include <cstring.i>
|
||||
/*functions for the test case*/
|
||||
%pybuffer_mutable_binary(char *buf1, int len);
|
||||
%pybuffer_mutable_string(char *buf2);
|
||||
|
|
|
|||
|
|
@ -15,16 +15,12 @@
|
|||
%define %pybuffer_mutable_binary(TYPEMAP, SIZE)
|
||||
%typemap(in) (TYPEMAP, SIZE) {
|
||||
int res; Py_ssize_t size = 0; void *buf = 0;
|
||||
%#if PY_VERSION_HEX < 0x03000000
|
||||
res = PyObject_AsWriteBuffer($input, &buf, &size);
|
||||
%#else
|
||||
Py_buffer view;
|
||||
res = PyObject_GetBuffer($input, &view, PyBUF_WRITABLE);
|
||||
size = view.len;
|
||||
buf = view.buf;
|
||||
PyBuffer_Release(&view);
|
||||
%#endif
|
||||
if (res<0) {
|
||||
if (res < 0) {
|
||||
PyErr_Clear();
|
||||
%argument_fail(res, "(TYPEMAP, SIZE)", $symname, $argnum);
|
||||
}
|
||||
|
|
@ -33,7 +29,7 @@
|
|||
}
|
||||
%enddef
|
||||
|
||||
/* %pybuffer_mutable_string(TYPEMAP, SIZE)
|
||||
/* %pybuffer_mutable_string(TYPEMAP)
|
||||
*
|
||||
* Macro for functions accept mutable zero terminated string pointer.
|
||||
* This can be used for both input and output. For example:
|
||||
|
|
@ -48,19 +44,14 @@
|
|||
|
||||
%define %pybuffer_mutable_string(TYPEMAP)
|
||||
%typemap(in) (TYPEMAP) {
|
||||
int res; Py_ssize_t size = 0; void *buf = 0;
|
||||
%#if PY_VERSION_HEX < 0x03000000
|
||||
res = PyObject_AsWriteBuffer($input, &buf, &size);
|
||||
%#else
|
||||
int res; void *buf = 0;
|
||||
Py_buffer view;
|
||||
res = PyObject_GetBuffer($input, &view, PyBUF_WRITABLE);
|
||||
size = view.len;
|
||||
buf = view.buf;
|
||||
PyBuffer_Release(&view);
|
||||
%#endif
|
||||
if (res<0) {
|
||||
if (res < 0) {
|
||||
PyErr_Clear();
|
||||
%argument_fail(res, "(TYPEMAP, SIZE)", $symname, $argnum);
|
||||
%argument_fail(res, "(TYPEMAP)", $symname, $argnum);
|
||||
}
|
||||
$1 = ($1_ltype) buf;
|
||||
}
|
||||
|
|
@ -83,16 +74,12 @@
|
|||
%define %pybuffer_binary(TYPEMAP, SIZE)
|
||||
%typemap(in) (TYPEMAP, SIZE) {
|
||||
int res; Py_ssize_t size = 0; const void *buf = 0;
|
||||
%#if PY_VERSION_HEX < 0x03000000
|
||||
res = PyObject_AsReadBuffer($input, &buf, &size);
|
||||
%#else
|
||||
Py_buffer view;
|
||||
res = PyObject_GetBuffer($input, &view, PyBUF_CONTIG_RO);
|
||||
size = view.len;
|
||||
buf = view.buf;
|
||||
PyBuffer_Release(&view);
|
||||
%#endif
|
||||
if (res<0) {
|
||||
if (res < 0) {
|
||||
PyErr_Clear();
|
||||
%argument_fail(res, "(TYPEMAP, SIZE)", $symname, $argnum);
|
||||
}
|
||||
|
|
@ -101,7 +88,7 @@
|
|||
}
|
||||
%enddef
|
||||
|
||||
/* %pybuffer_string(TYPEMAP, SIZE)
|
||||
/* %pybuffer_string(TYPEMAP)
|
||||
*
|
||||
* Macro for functions accept read only zero terminated string pointer.
|
||||
* This can be used for input. For example:
|
||||
|
|
@ -118,18 +105,13 @@
|
|||
|
||||
%define %pybuffer_string(TYPEMAP)
|
||||
%typemap(in) (TYPEMAP) {
|
||||
int res; Py_ssize_t size = 0; const void *buf = 0;
|
||||
%#if PY_VERSION_HEX < 0x03000000
|
||||
res = PyObject_AsReadBuffer($input, &buf, &size);
|
||||
%#else
|
||||
int res; const void *buf = 0;
|
||||
Py_buffer view;
|
||||
res = PyObject_GetBuffer($input, &view, PyBUF_CONTIG_RO);
|
||||
size = view.len;
|
||||
buf = view.buf;
|
||||
PyBuffer_Release(&view);
|
||||
%#endif
|
||||
if (res<0) {
|
||||
%argument_fail(res, "(TYPEMAP, SIZE)", $symname, $argnum);
|
||||
if (res < 0) {
|
||||
%argument_fail(res, "(TYPEMAP)", $symname, $argnum);
|
||||
}
|
||||
$1 = ($1_ltype) buf;
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue