@@ -5,15 +5,13 @@ from cython cimport Py_ssize_t
5
5
6
6
from cpython cimport (
7
7
PyCallable_Check,
8
- PyBUF_SIMPLE, PyObject_GetBuffer, PyBuffer_Release,
8
+ PyBUF_SIMPLE, PyObject_GetBuffer, PyBuffer_Release, Py_buffer,
9
9
PyBytes_Size,
10
10
PyBytes_FromStringAndSize,
11
11
PyBytes_AsString)
12
12
13
13
cdef extern from " Python.h" :
14
14
ctypedef struct PyObject
15
- cdef int PyObject_AsReadBuffer(object o, const void ** buff,
16
- Py_ssize_t* buf_len) except - 1
17
15
18
16
from libc.stdlib cimport free, malloc
19
17
from libc.string cimport memcpy, memmove
@@ -129,8 +127,14 @@ def unpackb(object packed, object object_hook=None, object list_hook=None,
129
127
Py_ssize_t buf_len
130
128
char * cenc = NULL
131
129
char * cerr = NULL
130
+ Py_buffer view
131
+ bytes extra_bytes
132
132
133
- PyObject_AsReadBuffer(packed, < const void ** > & buf, & buf_len)
133
+ # GH#26769 Effectively re-implement deprecated PyObject_AsReadBuffer;
134
+ # based on https://xpra.org/trac/ticket/1884
135
+ PyObject_GetBuffer(packed, & view, PyBUF_SIMPLE)
136
+ buf = < char * > view.buf
137
+ buf_len = view.len
134
138
135
139
if encoding is not None :
136
140
if isinstance (encoding, unicode ):
@@ -149,10 +153,13 @@ def unpackb(object packed, object object_hook=None, object list_hook=None,
149
153
if ret == 1 :
150
154
obj = unpack_data(& ctx)
151
155
if < Py_ssize_t> off < buf_len:
152
- raise ExtraData(obj, PyBytes_FromStringAndSize(
153
- buf + off, buf_len - off))
156
+ extra_bytes = PyBytes_FromStringAndSize(buf + off, buf_len - off)
157
+ PyBuffer_Release(& view)
158
+ raise ExtraData(obj, extra_bytes)
159
+ PyBuffer_Release(& view)
154
160
return obj
155
161
else :
162
+ PyBuffer_Release(& view)
156
163
raise UnpackValueError(" Unpack failed: error = {ret}" .format(ret = ret))
157
164
158
165
0 commit comments