@@ -25,6 +25,7 @@ cdef extern from "unpack.h":
2525 PyObject* object_hook
2626 bint has_pairs_hook # call object_hook with k-v pairs
2727 PyObject* list_hook
28+ PyObject* ext_type_hook
2829 char * encoding
2930 char * unicode_errors
3031
@@ -46,6 +47,7 @@ cdef extern from "unpack.h":
4647
4748cdef inline init_ctx(unpack_context * ctx,
4849 object object_hook, object object_pairs_hook, object list_hook,
50+ object ext_type_hook,
4951 bint use_list, char * encoding, char * unicode_errors):
5052 unpack_init(ctx)
5153 ctx.user.use_list = use_list
@@ -72,9 +74,17 @@ cdef inline init_ctx(unpack_context *ctx,
7274 raise TypeError (" list_hook must be a callable." )
7375 ctx.user.list_hook = < PyObject* > list_hook
7476
77+ if ext_type_hook is not None :
78+ if not PyCallable_Check(ext_type_hook):
79+ raise TypeError (" ext_type_hook must be a callable." )
80+ ctx.user.ext_type_hook = < PyObject* > ext_type_hook
81+
7582 ctx.user.encoding = encoding
7683 ctx.user.unicode_errors = unicode_errors
7784
85+ def default_read_extended_type (typecode , data ):
86+ raise NotImplementedError (" Cannot decode extended type with typecode=%d " % typecode)
87+
7888def unpackb (object packed , object object_hook = None , object list_hook = None ,
7989 bint use_list = 1 , encoding = None , unicode_errors = " strict" ,
8090 object_pairs_hook = None ,
@@ -107,7 +117,8 @@ def unpackb(object packed, object object_hook=None, object list_hook=None,
107117 unicode_errors = unicode_errors.encode(' ascii' )
108118 cerr = PyBytes_AsString(unicode_errors)
109119
110- init_ctx(& ctx, object_hook, object_pairs_hook, list_hook, use_list, cenc, cerr)
120+ init_ctx(& ctx, object_hook, object_pairs_hook, list_hook, default_read_extended_type,
121+ use_list, cenc, cerr)
111122 ret = unpack_construct(& ctx, buf, buf_len, & off)
112123 if ret == 1 :
113124 obj = unpack_data(& ctx)
@@ -249,7 +260,10 @@ cdef class Unpacker(object):
249260 self .unicode_errors = unicode_errors
250261 cerr = PyBytes_AsString(self .unicode_errors)
251262
252- init_ctx(& self .ctx, object_hook, object_pairs_hook, list_hook, use_list, cenc, cerr)
263+ ext_type_hook = self .read_extended_type
264+ Py_INCREF(ext_type_hook)
265+ init_ctx(& self .ctx, object_hook, object_pairs_hook, list_hook,
266+ ext_type_hook, use_list, cenc, cerr)
253267
254268 def feed (self , object next_bytes ):
255269 """ Append `next_bytes` to internal buffer."""
@@ -404,6 +418,9 @@ cdef class Unpacker(object):
404418 """
405419 return self ._unpack(read_map_header, write_bytes)
406420
421+ def read_extended_type (self , typecode , data ):
422+ return default_read_extended_type(typecode, data)
423+
407424 def __iter__ (self ):
408425 return self
409426
0 commit comments