@@ -685,58 +685,29 @@ def _pack(self, obj, nest_limit=DEFAULT_RECURSE_LIMIT,
685685 default_used = True
686686 continue
687687 raise PackOverflowError ("Integer value out of range" )
688- if self . _use_bin_type and check (obj , bytes ):
688+ if check (obj , bytes ):
689689 n = len (obj )
690- if n <= 0xff :
691- self ._buffer .write (struct .pack ('>BB' , 0xc4 , n ))
692- elif n <= 0xffff :
693- self ._buffer .write (struct .pack (">BH" , 0xc5 , n ))
694- elif n <= 0xffffffff :
695- self ._buffer .write (struct .pack (">BI" , 0xc6 , n ))
696- else :
690+ if n >= 2 ** 32 :
697691 raise PackValueError ("Bytes is too large" )
692+ self ._fb_pack_bin_header (n )
698693 return self ._buffer .write (obj )
699- if check (obj , (Unicode , bytes )):
700- if check (obj , Unicode ):
701- if self ._encoding is None :
702- raise TypeError (
703- "Can't encode unicode string: "
704- "no encoding is specified" )
705- obj = obj .encode (self ._encoding , self ._unicode_errors )
694+ if check (obj , Unicode ):
695+ if self ._encoding is None :
696+ raise TypeError (
697+ "Can't encode unicode string: "
698+ "no encoding is specified" )
699+ obj = obj .encode (self ._encoding , self ._unicode_errors )
706700 n = len (obj )
707- if n <= 0x1f :
708- self ._buffer .write (struct .pack ('B' , 0xa0 + n ))
709- elif self ._use_bin_type and n <= 0xff :
710- self ._buffer .write (struct .pack ('>BB' , 0xd9 , n ))
711- elif n <= 0xffff :
712- self ._buffer .write (struct .pack (">BH" , 0xda , n ))
713- elif n <= 0xffffffff :
714- self ._buffer .write (struct .pack (">BI" , 0xdb , n ))
715- else :
701+ if n >= 2 ** 32 :
716702 raise PackValueError ("String is too large" )
703+ self ._fb_pack_raw_header (n )
717704 return self ._buffer .write (obj )
718705 if check (obj , memoryview ):
719706 n = len (obj ) * obj .itemsize
720- if self ._use_bin_type :
721- if n <= 0xff :
722- self ._buffer .write (struct .pack ('>BB' , 0xc4 , n ))
723- elif n <= 0xffff :
724- self ._buffer .write (struct .pack (">BH" , 0xc5 , n ))
725- elif n <= 0xffffffff :
726- self ._buffer .write (struct .pack (">BI" , 0xc6 , n ))
727- else :
728- raise PackValueError ("memoryview is too large" )
729- return self ._buffer .write (obj )
730- else :
731- if n <= 0x1f :
732- self ._buffer .write (struct .pack ('B' , 0xa0 + n ))
733- elif n <= 0xffff :
734- self ._buffer .write (struct .pack (">BH" , 0xda , n ))
735- elif n <= 0xffffffff :
736- self ._buffer .write (struct .pack (">BI" , 0xdb , n ))
737- else :
738- raise PackValueError ("memoryview is too large" )
739- return self ._buffer .write (obj )
707+ if n >= 2 ** 32 :
708+ raise PackValueError ("Memoryview is too large" )
709+ self ._fb_pack_bin_header (n )
710+ return self ._buffer .write (obj )
740711 if check (obj , float ):
741712 if self ._use_float :
742713 return self ._buffer .write (struct .pack (">Bf" , 0xca , obj ))
@@ -874,6 +845,30 @@ def _fb_pack_map_pairs(self, n, pairs, nest_limit=DEFAULT_RECURSE_LIMIT):
874845 self ._pack (k , nest_limit - 1 )
875846 self ._pack (v , nest_limit - 1 )
876847
848+ def _fb_pack_raw_header (self , n ):
849+ if n <= 0x1f :
850+ self ._buffer .write (struct .pack ('B' , 0xa0 + n ))
851+ elif self ._use_bin_type and n <= 0xff :
852+ self ._buffer .write (struct .pack ('>BB' , 0xd9 , n ))
853+ elif n <= 0xffff :
854+ self ._buffer .write (struct .pack (">BH" , 0xda , n ))
855+ elif n <= 0xffffffff :
856+ self ._buffer .write (struct .pack (">BI" , 0xdb , n ))
857+ else :
858+ raise PackValueError ('Raw is too large' )
859+
860+ def _fb_pack_bin_header (self , n ):
861+ if not self ._use_bin_type :
862+ return self ._fb_pack_raw_header (n )
863+ elif n <= 0xff :
864+ return self ._buffer .write (struct .pack ('>BB' , 0xc4 , n ))
865+ elif n <= 0xffff :
866+ return self ._buffer .write (struct .pack (">BH" , 0xc5 , n ))
867+ elif n <= 0xffffffff :
868+ return self ._buffer .write (struct .pack (">BI" , 0xc6 , n ))
869+ else :
870+ raise PackValueError ('Bin is too large' )
871+
877872 def bytes (self ):
878873 return self ._buffer .getvalue ()
879874
0 commit comments