@@ -545,13 +545,29 @@ def handle_unknown_type(self, obj):
545545 # overridden by subclasses
546546 return None
547547
548- def pack_extended_type (self , fmt , typecode , data ):
549- # for now we support only this. We should add support for the other
550- # fixext/ext formats
551- assert fmt == "ext 32"
548+ def pack_extended_type (self , typecode , data ):
552549 assert 0 <= typecode <= 127
553- N = len (data )
554- self ._buffer .write (struct .pack ('>BIB' , 0xc9 , N , typecode ))
550+ n = len (data )
551+ if n == 1 :
552+ header = struct .pack (">BB" , 0xd4 , typecode ) # fixext 1
553+ elif n == 2 :
554+ header = struct .pack (">BB" , 0xd5 , typecode ) # fixext 2
555+ elif n == 4 :
556+ header = struct .pack (">BB" , 0xd6 , typecode ) # fixext 4
557+ elif n == 8 :
558+ header = struct .pack (">BB" , 0xd7 , typecode ) # fixext 8
559+ elif n == 16 :
560+ header = struct .pack (">BB" , 0xd8 , typecode ) # fixext 16
561+ elif n <= 2 ** 8 - 1 :
562+ header = struct .pack (">BBB" , 0xc7 , n , typecode ) # ext 8
563+ elif n <= 2 ** 16 - 1 :
564+ header = struct .pack (">BHB" , 0xc8 , n , typecode ) # ext 16
565+ elif n <= 2 ** 32 - 1 :
566+ header = struct .pack (">BIB" , 0xc9 , n , typecode ) # ext 32
567+ else :
568+ raise PackValueError ("ext data too large" )
569+ #
570+ self ._buffer .write (header )
555571 self ._buffer .write (data )
556572
557573 def pack (self , obj ):
0 commit comments