summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--msgpack/_msgpack.pyx62
-rw-r--r--setup.py2
-rw-r--r--test/test_obj.py2
-rw-r--r--test/test_sequnpack.py2
4 files changed, 39 insertions, 29 deletions
diff --git a/msgpack/_msgpack.pyx b/msgpack/_msgpack.pyx
index dca6237..5feba11 100644
--- a/msgpack/_msgpack.pyx
+++ b/msgpack/_msgpack.pyx
@@ -1,21 +1,17 @@
# coding: utf-8
#cython: embedsignature=True
-import warnings
-
from cpython cimport *
cdef extern from "Python.h":
ctypedef char* const_char_ptr "const char*"
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
- char* __FILE__
- int __LINE__
from libc.stdlib cimport *
from libc.string cimport *
from libc.limits cimport *
-
+import warnings
cdef extern from "pack.h":
struct msgpack_packer:
@@ -218,7 +214,9 @@ cdef extern from "unpack.h":
void template_init(template_context* ctx)
object template_data(template_context* ctx)
-cdef inline init_ctx(template_context *ctx, object object_hook, object object_pairs_hook, object list_hook, bint use_list, encoding, unicode_errors):
+cdef inline init_ctx(template_context *ctx,
+ object object_hook, object object_pairs_hook, object list_hook,
+ bint use_list, char* encoding, char* unicode_errors):
template_init(ctx)
ctx.user.use_list = use_list
ctx.user.object_hook = ctx.user.list_hook = <PyObject*>NULL
@@ -244,20 +242,8 @@ cdef inline init_ctx(template_context *ctx, object object_hook, object object_pa
raise TypeError("list_hook must be a callable.")
ctx.user.list_hook = <PyObject*>list_hook
- if encoding is None:
- ctx.user.encoding = NULL
- ctx.user.unicode_errors = NULL
- else:
- if isinstance(encoding, unicode):
- _bencoding = encoding.encode('ascii')
- else:
- _bencoding = encoding
- ctx.user.encoding = PyBytes_AsString(_bencoding)
- if isinstance(unicode_errors, unicode):
- _berrors = unicode_errors.encode('ascii')
- else:
- _berrors = unicode_errors
- ctx.user.unicode_errors = PyBytes_AsString(_berrors)
+ ctx.user.encoding = encoding
+ ctx.user.unicode_errors = unicode_errors
def unpackb(object packed, object object_hook=None, object list_hook=None,
use_list=None, encoding=None, unicode_errors="strict",
@@ -273,13 +259,26 @@ def unpackb(object packed, object object_hook=None, object list_hook=None,
cdef char* buf
cdef Py_ssize_t buf_len
+ cdef char* cenc = NULL
+ cdef char* cerr = NULL
PyObject_AsReadBuffer(packed, <const_void_ptr*>&buf, &buf_len)
if use_list is None:
warnings.warn("Set use_list explicitly.", category=DeprecationWarning, stacklevel=1)
use_list = 0
- init_ctx(&ctx, object_hook, object_pairs_hook, list_hook, use_list, encoding, unicode_errors)
+
+ 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 = template_execute(&ctx, buf, buf_len, &off, 1)
if ret == 1:
obj = template_data(&ctx)
@@ -361,10 +360,7 @@ cdef class Unpacker(object):
cdef object file_like_read
cdef Py_ssize_t read_size
cdef object object_hook
- cdef object _bencoding
- cdef object _berrors
- cdef char *encoding
- cdef char *unicode_errors
+ cdef object encoding, unicode_errors
cdef size_t max_buffer_size
def __cinit__(self):
@@ -378,6 +374,7 @@ cdef class Unpacker(object):
object object_hook=None, object object_pairs_hook=None, object list_hook=None,
encoding=None, unicode_errors='strict', int max_buffer_size=0,
):
+ cdef char *cenc=NULL, *cerr=NULL
if use_list is None:
warnings.warn("Set use_list explicitly.", category=DeprecationWarning, stacklevel=1)
use_list = 0
@@ -401,7 +398,20 @@ cdef class Unpacker(object):
self.buf_size = read_size
self.buf_head = 0
self.buf_tail = 0
- init_ctx(&self.ctx, object_hook, object_pairs_hook, list_hook, use_list, encoding, unicode_errors)
+
+ if encoding is not None:
+ if isinstance(encoding, unicode):
+ encoding = encoding.encode('ascii')
+ self.encoding = encoding
+ cenc = PyBytes_AsString(encoding)
+
+ if unicode_errors is not None:
+ if isinstance(unicode_errors, unicode):
+ unicode_errors = unicode_errors.encode('ascii')
+ self.unicode_errors = unicode_errors
+ cerr = PyBytes_AsString(unicode_errors)
+
+ init_ctx(&self.ctx, object_hook, object_pairs_hook, list_hook, use_list, cenc, cerr)
def feed(self, object next_bytes):
cdef char* buf
diff --git a/setup.py b/setup.py
index 9f0ce5d..86b0b34 100644
--- a/setup.py
+++ b/setup.py
@@ -18,7 +18,7 @@ except ImportError:
def cythonize(src):
sys.stderr.write("cythonize: %r\n" % (src,))
- cython_compiler.compile([src], emit_linenums=True)
+ cython_compiler.compile([src])
def ensure_source(src):
pyx = os.path.splitext(src)[0] + '.pyx'
diff --git a/test/test_obj.py b/test/test_obj.py
index 881e627..c38d6dc 100644
--- a/test/test_obj.py
+++ b/test/test_obj.py
@@ -34,7 +34,7 @@ def test_decode_pairs_hook():
@raises(ValueError)
def test_only_one_obj_hook():
- unpackb(b'', object_hook=lambda x: x, object_pairs_hook=lambda x: x)
+ unpackb(b'', object_hook=lambda x: x, object_pairs_hook=lambda x: x, use_list=1)
@raises(ValueError)
def test_bad_hook():
diff --git a/test/test_sequnpack.py b/test/test_sequnpack.py
index dac36a8..eac0828 100644
--- a/test/test_sequnpack.py
+++ b/test/test_sequnpack.py
@@ -44,7 +44,7 @@ def test_foobar_skip():
assert 1, "ok"
def test_maxbuffersize():
- nose.tools.assert_raises(ValueError, Unpacker, read_size=5, max_buffer_size=3)
+ nose.tools.assert_raises(ValueError, Unpacker, read_size=5, max_buffer_size=3, use_list=1)
unpacker = Unpacker(read_size=3, max_buffer_size=3, use_list=1)
unpacker.feed(b'fo')
nose.tools.assert_raises(BufferFull, unpacker.feed, b'ob')