@@ -360,16 +360,19 @@ def _fb_unpack(self, execute=EX_CONSTRUCT, write_bytes=None):
360360 self ._fb_unpack (EX_SKIP , write_bytes )
361361 self ._fb_unpack (EX_SKIP , write_bytes )
362362 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 )))
367363 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+ )
369369 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 )
373376 return ret
374377 if execute == EX_SKIP :
375378 return
@@ -421,7 +424,7 @@ def __init__(self, default=None, encoding='utf-8', unicode_errors='strict',
421424 raise TypeError ("default must be callable" )
422425 self ._default = default
423426
424- def _pack (self , obj , nest_limit = DEFAULT_RECURSE_LIMIT ):
427+ def _pack (self , obj , nest_limit = DEFAULT_RECURSE_LIMIT , isinstance = isinstance ):
425428 if nest_limit < 0 :
426429 raise PackValueError ("recursion limit exceeded" )
427430 if obj is None :
@@ -454,6 +457,10 @@ def _pack(self, obj, nest_limit=DEFAULT_RECURSE_LIMIT):
454457 raise PackValueError ("Integer value out of range" )
455458 if isinstance (obj , (Unicode , bytes )):
456459 if isinstance (obj , Unicode ):
460+ if self .encoding is None :
461+ raise TypeError (
462+ "Can't encode unicode string: "
463+ "no encoding is specified" )
457464 obj = obj .encode (self .encoding , self .unicode_errors )
458465 n = len (obj )
459466 if n <= 0x1f :
0 commit comments