@@ -675,6 +675,17 @@ def pack_array_header(self, n) -> bytes:
675675 self ._buffer = BytesIO (ret )
676676 return ret
677677
678+ def pack_ext_header (self , code , n ):
679+ if n >= _DEFAULT_MAX_LEN :
680+ raise PackValueError ()
681+ self ._pack_ext_header (code , n )
682+ ret = self ._buffer .getvalue ()
683+ if self ._autoreset :
684+ self ._buffer = BytesIO ()
685+ elif _USING_BYTESBUILDER :
686+ self ._buffer = BytesIO (ret )
687+ return ret
688+
678689 def _pack (self , obj , nest_limit = _DEFAULT_NEST_LIMIT ):
679690 default_used = False
680691 while True :
@@ -799,21 +810,8 @@ def _pack(self, obj, nest_limit=_DEFAULT_NEST_LIMIT):
799810
800811 # Packing EXT*
801812 elif isinstance (obj , ExtType ):
802- data_len = len (obj .data )
803-
804- # Packing EXT8
805- if data_len <= 0xFF :
806- return self ._buffer .write (b'\xDB ' + _STRUCT_EXT8 .pack (data_len , obj .code ) + obj .data )
807-
808- # Packing EXT16
809- elif data_len <= 0xFFFF :
810- return self ._buffer .write (b'\xDC ' + _STRUCT_EXT16 .pack (data_len , obj .code ) + obj .data )
811-
812- # Packing EXT32
813- elif data_len <= 0xFFFFFFFF :
814- return self ._buffer .write (b'\xDD ' + _STRUCT_EXT32 .pack (data_len , obj .code ) + obj .data )
815- else :
816- raise PackValueError ('ext is too large' )
813+ self ._pack_ext_header (obj .code , len (obj .data ))
814+ return self ._buffer .write (obj .data )
817815
818816 elif not default_used and self ._default is not None :
819817 obj = self ._default (obj )
@@ -875,3 +873,13 @@ def _pack_bin_header(self, n):
875873 return self ._buffer .write (b'\xD0 ' + _STRUCT_UINT32 .pack (n ))
876874 else :
877875 raise PackValueError ('binary too large' )
876+
877+ def _pack_ext_header (self , code , n ):
878+ if n <= 0xFF :
879+ return self ._buffer .write (b'\xDB ' )
880+ elif n <= 0xFFFF :
881+ return self ._buffer .write (b'\xDC ' )
882+ elif n <= 0xFFFFFFFF :
883+ return self ._buffer .write (b'\xDD ' )
884+ else :
885+ raise PackValueError ('ext too large' )
0 commit comments