From 6a5f697f729dbb818fe3423790b126848c0cb7c2 Mon Sep 17 00:00:00 2001 From: Ivan Smirnov Date: Tue, 28 Nov 2017 00:13:54 +0000 Subject: [PATCH] Support generic buffers in from_bytes() (Also throw a TypeError if it's not a bytes object or a buffer) --- capnp/lib/capnp.pyx | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/capnp/lib/capnp.pyx b/capnp/lib/capnp.pyx index aa23137..7f0b0fc 100644 --- a/capnp/lib/capnp.pyx +++ b/capnp/lib/capnp.pyx @@ -15,7 +15,7 @@ from libc.stdlib cimport malloc, free from libc.string cimport memcpy from cython.operator cimport dereference as deref from cpython.exc cimport PyErr_Clear -from cpython cimport Py_buffer +from cpython cimport Py_buffer, PyObject_CheckBuffer from cpython.buffer cimport PyBUF_SIMPLE from types import ModuleType as _ModuleType @@ -3756,11 +3756,7 @@ cdef class _FlatArrayMessageReader(_MessageReader): raise ValueError("input length must be a multiple of eight bytes") cdef char * ptr - if type(buf) == _mmap.mmap: - view = _BufferView(buf) - ptr = view.buf - self._object_to_pin = view - else: + if isinstance(buf, bytes): ptr = buf if (ptr) % 8 != 0: aligned = _AlignedBuffer(buf) @@ -3768,6 +3764,12 @@ cdef class _FlatArrayMessageReader(_MessageReader): self._object_to_pin = aligned else: self._object_to_pin = buf + elif PyObject_CheckBuffer(buf): + view = _BufferView(buf) + ptr = view.buf + self._object_to_pin = view + else: + raise TypeError('expected buffer-like object in FlatArrayMessageReader') self.thisptr = new schema_cpp.FlatArrayMessageReader( schema_cpp.WordArrayPtr(ptr, sz//8),