mirror of
				https://github.com/msgpack/msgpack-python.git
				synced 2025-11-04 03:20:56 +00:00 
			
		
		
		
	Factor context initialisation from unpackb and Unpacker
This commit is contained in:
		
							parent
							
								
									96ed236c1d
								
							
						
					
					
						commit
						b06ed8eb75
					
				
					 1 changed files with 28 additions and 54 deletions
				
			
		| 
						 | 
					@ -213,6 +213,32 @@ cdef extern from "unpack.h":
 | 
				
			||||||
    void template_init(template_context* ctx)
 | 
					    void template_init(template_context* ctx)
 | 
				
			||||||
    object template_data(template_context* ctx)
 | 
					    object template_data(template_context* ctx)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					cdef inline init_ctx(template_context *ctx, object object_hook, object list_hook, bint use_list, encoding, unicode_errors):
 | 
				
			||||||
 | 
					    template_init(ctx)
 | 
				
			||||||
 | 
					    ctx.user.use_list = use_list
 | 
				
			||||||
 | 
					    ctx.user.object_hook = ctx.user.list_hook = <PyObject*>NULL
 | 
				
			||||||
 | 
					    if object_hook is not None:
 | 
				
			||||||
 | 
					        if not PyCallable_Check(object_hook):
 | 
				
			||||||
 | 
					            raise TypeError("object_hook must be a callable.")
 | 
				
			||||||
 | 
					        ctx.user.object_hook = <PyObject*>object_hook
 | 
				
			||||||
 | 
					    if list_hook is not None:
 | 
				
			||||||
 | 
					        if not PyCallable_Check(list_hook):
 | 
				
			||||||
 | 
					            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)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
def unpackb(object packed, object object_hook=None, object list_hook=None,
 | 
					def unpackb(object packed, object object_hook=None, object list_hook=None,
 | 
				
			||||||
            bint use_list=0, encoding=None, unicode_errors="strict",
 | 
					            bint use_list=0, encoding=None, unicode_errors="strict",
 | 
				
			||||||
| 
						 | 
					@ -229,34 +255,7 @@ def unpackb(object packed, object object_hook=None, object list_hook=None,
 | 
				
			||||||
    cdef Py_ssize_t buf_len
 | 
					    cdef Py_ssize_t buf_len
 | 
				
			||||||
    PyObject_AsReadBuffer(packed, <const_void_ptr*>&buf, &buf_len)
 | 
					    PyObject_AsReadBuffer(packed, <const_void_ptr*>&buf, &buf_len)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    if encoding is None:
 | 
					    init_ctx(&ctx, object_hook, list_hook, use_list, encoding, unicode_errors)
 | 
				
			||||||
        enc = NULL
 | 
					 | 
				
			||||||
        err = NULL
 | 
					 | 
				
			||||||
    else:
 | 
					 | 
				
			||||||
        if isinstance(encoding, unicode):
 | 
					 | 
				
			||||||
            bencoding = encoding.encode('ascii')
 | 
					 | 
				
			||||||
        else:
 | 
					 | 
				
			||||||
            bencoding = encoding
 | 
					 | 
				
			||||||
        if isinstance(unicode_errors, unicode):
 | 
					 | 
				
			||||||
            berrors = unicode_errors.encode('ascii')
 | 
					 | 
				
			||||||
        else:
 | 
					 | 
				
			||||||
            berrors = unicode_errors
 | 
					 | 
				
			||||||
        enc = PyBytes_AsString(bencoding)
 | 
					 | 
				
			||||||
        err = PyBytes_AsString(berrors)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    template_init(&ctx)
 | 
					 | 
				
			||||||
    ctx.user.use_list = use_list
 | 
					 | 
				
			||||||
    ctx.user.object_hook = ctx.user.list_hook = NULL
 | 
					 | 
				
			||||||
    ctx.user.encoding = <const_char_ptr>enc
 | 
					 | 
				
			||||||
    ctx.user.unicode_errors = <const_char_ptr>err
 | 
					 | 
				
			||||||
    if object_hook is not None:
 | 
					 | 
				
			||||||
        if not PyCallable_Check(object_hook):
 | 
					 | 
				
			||||||
            raise TypeError("object_hook must be a callable.")
 | 
					 | 
				
			||||||
        ctx.user.object_hook = <PyObject*>object_hook
 | 
					 | 
				
			||||||
    if list_hook is not None:
 | 
					 | 
				
			||||||
        if not PyCallable_Check(list_hook):
 | 
					 | 
				
			||||||
            raise TypeError("list_hook must be a callable.")
 | 
					 | 
				
			||||||
        ctx.user.list_hook = <PyObject*>list_hook
 | 
					 | 
				
			||||||
    ret = template_execute(&ctx, buf, buf_len, &off, 1)
 | 
					    ret = template_execute(&ctx, buf, buf_len, &off, 1)
 | 
				
			||||||
    if ret == 1:
 | 
					    if ret == 1:
 | 
				
			||||||
        obj = template_data(&ctx)
 | 
					        obj = template_data(&ctx)
 | 
				
			||||||
| 
						 | 
					@ -348,7 +347,6 @@ cdef class Unpacker(object):
 | 
				
			||||||
    def __init__(self, file_like=None, Py_ssize_t read_size=0, bint use_list=0,
 | 
					    def __init__(self, file_like=None, Py_ssize_t read_size=0, bint use_list=0,
 | 
				
			||||||
                 object object_hook=None, object list_hook=None,
 | 
					                 object object_hook=None, object list_hook=None,
 | 
				
			||||||
                 encoding=None, unicode_errors='strict', int max_buffer_size=0,
 | 
					                 encoding=None, unicode_errors='strict', int max_buffer_size=0,
 | 
				
			||||||
                 object object_pairs_hook=None,
 | 
					 | 
				
			||||||
                 ):
 | 
					                 ):
 | 
				
			||||||
        self.use_list = use_list
 | 
					        self.use_list = use_list
 | 
				
			||||||
        self.file_like = file_like
 | 
					        self.file_like = file_like
 | 
				
			||||||
| 
						 | 
					@ -370,31 +368,7 @@ cdef class Unpacker(object):
 | 
				
			||||||
        self.buf_size = read_size
 | 
					        self.buf_size = read_size
 | 
				
			||||||
        self.buf_head = 0
 | 
					        self.buf_head = 0
 | 
				
			||||||
        self.buf_tail = 0
 | 
					        self.buf_tail = 0
 | 
				
			||||||
        template_init(&self.ctx)
 | 
					        init_ctx(&self.ctx, object_hook, list_hook, use_list, encoding, unicode_errors)
 | 
				
			||||||
        self.ctx.user.use_list = use_list
 | 
					 | 
				
			||||||
        self.ctx.user.object_hook = self.ctx.user.list_hook = <PyObject*>NULL
 | 
					 | 
				
			||||||
        if object_hook is not None:
 | 
					 | 
				
			||||||
            if not PyCallable_Check(object_hook):
 | 
					 | 
				
			||||||
                raise TypeError("object_hook must be a callable.")
 | 
					 | 
				
			||||||
            self.ctx.user.object_hook = <PyObject*>object_hook
 | 
					 | 
				
			||||||
        if list_hook is not None:
 | 
					 | 
				
			||||||
            if not PyCallable_Check(list_hook):
 | 
					 | 
				
			||||||
                raise TypeError("list_hook must be a callable.")
 | 
					 | 
				
			||||||
            self.ctx.user.list_hook = <PyObject*>list_hook
 | 
					 | 
				
			||||||
        if encoding is None:
 | 
					 | 
				
			||||||
            self.ctx.user.encoding = NULL
 | 
					 | 
				
			||||||
            self.ctx.user.unicode_errors = NULL
 | 
					 | 
				
			||||||
        else:
 | 
					 | 
				
			||||||
            if isinstance(encoding, unicode):
 | 
					 | 
				
			||||||
                self._bencoding = encoding.encode('ascii')
 | 
					 | 
				
			||||||
            else:
 | 
					 | 
				
			||||||
                self._bencoding = encoding
 | 
					 | 
				
			||||||
            self.ctx.user.encoding = PyBytes_AsString(self._bencoding)
 | 
					 | 
				
			||||||
            if isinstance(unicode_errors, unicode):
 | 
					 | 
				
			||||||
                self._berrors = unicode_errors.encode('ascii')
 | 
					 | 
				
			||||||
            else:
 | 
					 | 
				
			||||||
                self._berrors = unicode_errors
 | 
					 | 
				
			||||||
            self.ctx.user.unicode_errors = PyBytes_AsString(self._berrors)
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
    def feed(self, object next_bytes):
 | 
					    def feed(self, object next_bytes):
 | 
				
			||||||
        cdef char* buf
 | 
					        cdef char* buf
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue