@@ -685,58 +685,29 @@ def _pack(self, obj, nest_limit=DEFAULT_RECURSE_LIMIT,
685
685
default_used = True
686
686
continue
687
687
raise PackOverflowError ("Integer value out of range" )
688
- if self . _use_bin_type and check (obj , bytes ):
688
+ if check (obj , bytes ):
689
689
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 :
697
691
raise PackValueError ("Bytes is too large" )
692
+ self ._fb_pack_bin_header (n )
698
693
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 )
706
700
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 :
716
702
raise PackValueError ("String is too large" )
703
+ self ._fb_pack_raw_header (n )
717
704
return self ._buffer .write (obj )
718
705
if check (obj , memoryview ):
719
706
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 )
740
711
if check (obj , float ):
741
712
if self ._use_float :
742
713
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):
874
845
self ._pack (k , nest_limit - 1 )
875
846
self ._pack (v , nest_limit - 1 )
876
847
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
+
877
872
def bytes (self ):
878
873
return self ._buffer .getvalue ()
879
874
0 commit comments