@@ -21,6 +21,8 @@ from cpython.object cimport PyCallable_Check
21
21
from cpython.ref cimport Py_DECREF
22
22
from cpython.exc cimport PyErr_WarnEx
23
23
24
+ ctypedef PyObject* (* extptr)(int , const char * pos, unsigned int )
25
+
24
26
cdef extern from " Python.h" :
25
27
ctypedef struct PyObject
26
28
cdef int PyObject_AsReadBuffer(object o, const void ** buff, Py_ssize_t* buf_len) except - 1
@@ -46,6 +48,7 @@ cdef extern from "unpack.h":
46
48
bint has_pairs_hook # call object_hook with k-v pairs
47
49
PyObject* list_hook
48
50
PyObject* ext_hook
51
+ extptr ext_hook_c
49
52
char * encoding
50
53
char * unicode_errors
51
54
Py_ssize_t max_str_len
@@ -71,7 +74,7 @@ cdef extern from "unpack.h":
71
74
72
75
cdef inline init_ctx(unpack_context * ctx,
73
76
object object_hook, object object_pairs_hook,
74
- object list_hook, object ext_hook,
77
+ object list_hook, object ext_hook, extptr ext_hook_c,
75
78
bint use_list, char * encoding, char * unicode_errors,
76
79
Py_ssize_t max_str_len, Py_ssize_t max_bin_len,
77
80
Py_ssize_t max_array_len, Py_ssize_t max_map_len,
@@ -111,6 +114,9 @@ cdef inline init_ctx(unpack_context *ctx,
111
114
raise TypeError (" ext_hook must be a callable." )
112
115
ctx.user.ext_hook = < PyObject* > ext_hook
113
116
117
+ if ext_hook_c:
118
+ ctx.user.ext_hook_c = ext_hook_c
119
+
114
120
ctx.user.encoding = encoding
115
121
ctx.user.unicode_errors = unicode_errors
116
122
@@ -155,7 +161,7 @@ cdef inline int get_data_from_buffer(object obj,
155
161
156
162
def unpackb (object packed , object object_hook = None , object list_hook = None ,
157
163
bint use_list = 1 , encoding = None , unicode_errors = " strict" ,
158
- object_pairs_hook = None , ext_hook = ExtType,
164
+ object_pairs_hook = None , ext_hook = ExtType, Py_ssize_t ext_hook_c = 0 ,
159
165
Py_ssize_t max_str_len = 2147483647 , # 2**32-1
160
166
Py_ssize_t max_bin_len = 2147483647 ,
161
167
Py_ssize_t max_array_len = 2147483647 ,
@@ -192,7 +198,7 @@ def unpackb(object packed, object object_hook=None, object list_hook=None,
192
198
unicode_errors = unicode_errors.encode(' ascii' )
193
199
cerr = PyBytes_AsString(unicode_errors)
194
200
195
- init_ctx(& ctx, object_hook, object_pairs_hook, list_hook, ext_hook,
201
+ init_ctx(& ctx, object_hook, object_pairs_hook, list_hook, ext_hook, < extptr > ext_hook_c,
196
202
use_list, cenc, cerr,
197
203
max_str_len, max_bin_len, max_array_len, max_map_len, max_ext_len)
198
204
ret = unpack_construct(& ctx, buf, buf_len, & off)
@@ -211,7 +217,7 @@ def unpackb(object packed, object object_hook=None, object list_hook=None,
211
217
212
218
def unpack (object stream , object object_hook = None , object list_hook = None ,
213
219
bint use_list = 1 , encoding = None , unicode_errors = " strict" ,
214
- object_pairs_hook = None , ext_hook = ExtType,
220
+ object_pairs_hook = None , ext_hook = ExtType, Py_ssize_t ext_hook_c = 0 ,
215
221
Py_ssize_t max_str_len = 2147483647 , # 2**32-1
216
222
Py_ssize_t max_bin_len = 2147483647 ,
217
223
Py_ssize_t max_array_len = 2147483647 ,
@@ -226,7 +232,7 @@ def unpack(object stream, object object_hook=None, object list_hook=None,
226
232
"""
227
233
return unpackb(stream.read(), use_list = use_list,
228
234
object_hook = object_hook, object_pairs_hook = object_pairs_hook, list_hook = list_hook,
229
- encoding = encoding, unicode_errors = unicode_errors, ext_hook = ext_hook,
235
+ encoding = encoding, unicode_errors = unicode_errors, ext_hook = ext_hook, ext_hook_c = ext_hook_c,
230
236
max_str_len = max_str_len,
231
237
max_bin_len = max_bin_len,
232
238
max_array_len = max_array_len,
@@ -312,6 +318,7 @@ cdef class Unpacker(object):
312
318
cdef Py_ssize_t read_size
313
319
# To maintain refcnt.
314
320
cdef object object_hook, object_pairs_hook, list_hook, ext_hook
321
+ cdef extptr ext_hook_c
315
322
cdef object encoding, unicode_errors
316
323
cdef Py_ssize_t max_buffer_size
317
324
@@ -326,6 +333,7 @@ cdef class Unpacker(object):
326
333
object object_hook = None , object object_pairs_hook = None , object list_hook = None ,
327
334
encoding = None , unicode_errors = ' strict' , int max_buffer_size = 0 ,
328
335
object ext_hook = ExtType,
336
+ Py_ssize_t ext_hook_c = 0 ,
329
337
Py_ssize_t max_str_len = 2147483647 , # 2**32-1
330
338
Py_ssize_t max_bin_len = 2147483647 ,
331
339
Py_ssize_t max_array_len = 2147483647 ,
@@ -338,6 +346,7 @@ cdef class Unpacker(object):
338
346
self .object_pairs_hook = object_pairs_hook
339
347
self .list_hook = list_hook
340
348
self .ext_hook = ext_hook
349
+ self .ext_hook_c = < extptr> ext_hook_c
341
350
342
351
self .file_like = file_like
343
352
if file_like:
@@ -378,7 +387,7 @@ cdef class Unpacker(object):
378
387
cerr = PyBytes_AsString(self .unicode_errors)
379
388
380
389
init_ctx(& self .ctx, object_hook, object_pairs_hook, list_hook,
381
- ext_hook, use_list, cenc, cerr,
390
+ ext_hook, self .ext_hook_c, use_list, cenc, cerr,
382
391
max_str_len, max_bin_len, max_array_len,
383
392
max_map_len, max_ext_len)
384
393
0 commit comments