Merge pull request #65 from msgpack/old-buffer

Stop using new style buffer API.
This commit is contained in:
INADA Naoki 2013-05-18 20:43:27 -07:00
commit d4bb86c0c8
2 changed files with 26 additions and 24 deletions

View file

@ -10,7 +10,7 @@ doc:
cd docs && make zip
cython:
cython msgpack/*.pyx
cython --cplus msgpack/*.pyx
python3: cython
python3 setup.py build_ext -i -f

View file

@ -2,6 +2,9 @@
#cython: embedsignature=True
from cpython cimport *
cdef extern from "Python.h":
ctypedef struct PyObject
cdef int PyObject_AsReadBuffer(object o, const void* buff, Py_ssize_t* buf_len) except -1
from libc.stdlib cimport *
from libc.string cimport *
@ -15,8 +18,8 @@ from msgpack.exceptions import (
)
cdef extern from "unpack.h":
ctypedef struct PyObject
ctypedef struct msgpack_user:
bint use_list
PyObject* object_hook
@ -87,33 +90,32 @@ def unpackb(object packed, object object_hook=None, object list_hook=None,
cdef size_t off = 0
cdef int ret
cdef Py_buffer buff
cdef char* buf
cdef Py_ssize_t buf_len
cdef char* cenc = NULL
cdef char* cerr = NULL
PyObject_GetBuffer(packed, &buff, PyBUF_SIMPLE)
try:
if encoding is not None:
if isinstance(encoding, unicode):
encoding = encoding.encode('ascii')
cenc = PyBytes_AsString(encoding)
PyObject_AsReadBuffer(packed, <const void*>&buf, &buf_len)
if unicode_errors is not None:
if isinstance(unicode_errors, unicode):
unicode_errors = unicode_errors.encode('ascii')
cerr = PyBytes_AsString(unicode_errors)
if encoding is not None:
if isinstance(encoding, unicode):
encoding = encoding.encode('ascii')
cenc = PyBytes_AsString(encoding)
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.buf+off, buff.len-off))
return obj
else:
raise UnpackValueError("Unpack failed: error = %d" % (ret,))
finally:
PyBuffer_Release(&buff)
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,))
def unpack(object stream, object object_hook=None, object list_hook=None,