summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorINADA Naoki <songofacandy@gmail.com>2013-04-07 19:07:39 -0700
committerINADA Naoki <songofacandy@gmail.com>2013-04-07 19:07:39 -0700
commitc037aa7710cc93d11584a77c5d73773af6cd8172 (patch)
tree93b153a8b2ca7b866644002a7d8f82e2939f347c
parent075dbecc39cbd88a05935578bb5d806809a752e8 (diff)
parent085db7f8dca2b4e2497bfb291238cd3ff2d06e28 (diff)
downloadmsgpack-python-c037aa7710cc93d11584a77c5d73773af6cd8172.tar.gz
Merge pull request #59 from msgpack/refactor
Use new style buffer interface.
-rw-r--r--msgpack/_unpacker.pyx63
1 files changed, 31 insertions, 32 deletions
diff --git a/msgpack/_unpacker.pyx b/msgpack/_unpacker.pyx
index 1ad71a0..46be7e0 100644
--- a/msgpack/_unpacker.pyx
+++ b/msgpack/_unpacker.pyx
@@ -2,10 +2,6 @@
#cython: embedsignature=True
from cpython cimport *
-cdef extern from "Python.h":
- ctypedef char* const_void_ptr "const void*"
- ctypedef struct PyObject
- cdef int PyObject_AsReadBuffer(object o, const_void_ptr* buff, Py_ssize_t* buf_len) except -1
from libc.stdlib cimport *
from libc.string cimport *
@@ -19,8 +15,8 @@ from msgpack.exceptions import (
)
-
cdef extern from "unpack.h":
+ ctypedef struct PyObject
ctypedef struct msgpack_user:
bint use_list
PyObject* object_hook
@@ -91,32 +87,33 @@ def unpackb(object packed, object object_hook=None, object list_hook=None,
cdef size_t off = 0
cdef int ret
- cdef char* buf
- cdef Py_ssize_t buf_len
+ cdef Py_buffer buff
cdef char* cenc = NULL
cdef char* cerr = NULL
- PyObject_AsReadBuffer(packed, <const_void_ptr*>&buf, &buf_len)
-
- if encoding is not None:
- if isinstance(encoding, unicode):
- encoding = encoding.encode('ascii')
- cenc = PyBytes_AsString(encoding)
-
- if unicode_errors is not None:
- if isinstance(unicode_errors, unicode):
- unicode_errors = unicode_errors.encode('ascii')
- cerr = PyBytes_AsString(unicode_errors)
-
- init_ctx(&ctx, object_hook, object_pairs_hook, list_hook, use_list, cenc, cerr)
- ret = unpack_construct(&ctx, buf, buf_len, &off)
- if ret == 1:
- obj = unpack_data(&ctx)
- if off < buf_len:
- raise ExtraData(obj, PyBytes_FromStringAndSize(buf+off, buf_len-off))
- return obj
- else:
- raise UnpackValueError("Unpack failed: error = %d" % (ret,))
+ PyObject_GetBuffer(packed, &buff, PyBUF_SIMPLE)
+ try:
+ if encoding is not None:
+ if isinstance(encoding, unicode):
+ encoding = encoding.encode('ascii')
+ cenc = PyBytes_AsString(encoding)
+
+ if unicode_errors is not None:
+ if isinstance(unicode_errors, unicode):
+ unicode_errors = unicode_errors.encode('ascii')
+ cerr = PyBytes_AsString(unicode_errors)
+
+ init_ctx(&ctx, object_hook, object_pairs_hook, list_hook, use_list, cenc, cerr)
+ ret = unpack_construct(&ctx, <char*>buff.buf, buff.len, &off)
+ if ret == 1:
+ obj = unpack_data(&ctx)
+ if off < buff.len:
+ raise ExtraData(obj, PyBytes_FromStringAndSize(<char*>(buff)+off, buff.len-off))
+ return obj
+ else:
+ raise UnpackValueError("Unpack failed: error = %d" % (ret,))
+ finally:
+ PyBuffer_Release(&buff)
def unpack(object stream, object object_hook=None, object list_hook=None,
@@ -254,13 +251,15 @@ cdef class Unpacker(object):
def feed(self, object next_bytes):
"""Append `next_bytes` to internal buffer."""
- cdef char* buf
- cdef Py_ssize_t buf_len
+ cdef Py_buffer pybuff
if self.file_like is not None:
raise AssertionError(
"unpacker.feed() is not be able to use with `file_like`.")
- PyObject_AsReadBuffer(next_bytes, <const_void_ptr*>&buf, &buf_len)
- self.append_buffer(buf, buf_len)
+ PyObject_GetBuffer(next_bytes, &pybuff, PyBUF_SIMPLE)
+ try:
+ self.append_buffer(<char*>pybuff.buf, pybuff.len)
+ finally:
+ PyBuffer_Release(&pybuff)
cdef append_buffer(self, void* _buf, Py_ssize_t _buf_len):
cdef: