Skip to content
Merged
Show file tree
Hide file tree
Changes from 2 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 1 addition & 3 deletions msgpack/_unpacker.pyx
Original file line number Diff line number Diff line change
Expand Up @@ -130,9 +130,7 @@ cdef inline int get_data_from_buffer(object obj,
# create a contiguous copy and get buffer
contiguous = PyMemoryView_GetContiguous(obj, PyBUF_READ, b'C')
PyObject_GetBuffer(contiguous, view, PyBUF_SIMPLE)
# view must hold the only reference to contiguous,
# so memory is freed when view is released
Py_DECREF(contiguous)

Comment thread
KowalskiThomas marked this conversation as resolved.
buffer_len[0] = view.len
buf[0] = <char*> view.buf
return 1
Expand Down
3 changes: 2 additions & 1 deletion msgpack/fallback.py
Original file line number Diff line number Diff line change
Expand Up @@ -328,7 +328,8 @@ def feed(self, next_bytes):
self._buf_checkpoint = 0

# Use extend here: INPLACE_ADD += doesn't reliably typecast memoryview in jython
self._buffer.extend(view)
# tobytes ensures compatibility with non-contiguous memoryviews
self._buffer.extend(view.tobytes())
view.release()
Comment thread
KowalskiThomas marked this conversation as resolved.

def _consume(self):
Expand Down
12 changes: 12 additions & 0 deletions test/test_memoryview.py
Original file line number Diff line number Diff line change
Expand Up @@ -97,3 +97,15 @@ def test_multidim_memoryview():
data = view.cast(view.format, (3, 2))
packed = packb(data)
assert packed == b"\xc4\x06\x00\x00\x00\x00\x00\x00"


def test_unpack_noncontiguous_memoryview():
# Use a multi-byte value so the padded stride-2 view is non-contiguous.
packed = packb(2**32)
padded = bytearray()
for byte in packed:
padded.append(byte)
padded.append(0)
noncont = memoryview(bytes(padded))[::2]
assert not noncont.c_contiguous
assert unpackb(noncont) == 2**32
Loading