@@ -360,16 +360,19 @@ def _fb_unpack(self, execute=EX_CONSTRUCT, write_bytes=None):
360
360
self ._fb_unpack (EX_SKIP , write_bytes )
361
361
self ._fb_unpack (EX_SKIP , write_bytes )
362
362
return
363
- ret = []
364
- for i in xrange (n ):
365
- ret .append ((self ._fb_unpack (EX_CONSTRUCT , write_bytes ),
366
- self ._fb_unpack (EX_CONSTRUCT , write_bytes )))
367
363
if self .object_pairs_hook is not None :
368
- ret = self .object_pairs_hook (ret )
364
+ ret = self .object_pairs_hook (
365
+ (self ._fb_unpack (EX_CONSTRUCT , write_bytes ),
366
+ self ._fb_unpack (EX_CONSTRUCT , write_bytes ))
367
+ for _ in xrange (n )
368
+ )
369
369
else :
370
- ret = dict (ret )
371
- if self .object_hook is not None :
372
- ret = self .object_hook (ret )
370
+ ret = {}
371
+ for _ in xrange (n ):
372
+ key = self ._fb_unpack (EX_CONSTRUCT , write_bytes )
373
+ ret [key ] = self ._fb_unpack (EX_CONSTRUCT , write_bytes )
374
+ if self .object_hook is not None :
375
+ ret = self .object_hook (ret )
373
376
return ret
374
377
if execute == EX_SKIP :
375
378
return
@@ -421,7 +424,7 @@ def __init__(self, default=None, encoding='utf-8', unicode_errors='strict',
421
424
raise TypeError ("default must be callable" )
422
425
self ._default = default
423
426
424
- def _pack (self , obj , nest_limit = DEFAULT_RECURSE_LIMIT ):
427
+ def _pack (self , obj , nest_limit = DEFAULT_RECURSE_LIMIT , isinstance = isinstance ):
425
428
if nest_limit < 0 :
426
429
raise PackValueError ("recursion limit exceeded" )
427
430
if obj is None :
@@ -454,6 +457,10 @@ def _pack(self, obj, nest_limit=DEFAULT_RECURSE_LIMIT):
454
457
raise PackValueError ("Integer value out of range" )
455
458
if isinstance (obj , (Unicode , bytes )):
456
459
if isinstance (obj , Unicode ):
460
+ if self .encoding is None :
461
+ raise TypeError (
462
+ "Can't encode unicode string: "
463
+ "no encoding is specified" )
457
464
obj = obj .encode (self .encoding , self .unicode_errors )
458
465
n = len (obj )
459
466
if n <= 0x1f :
0 commit comments