11"""Fallback pure Python implementation of msgpack"""
22
3- from datetime import datetime as _DateTime
4- import sys
53import struct
6-
4+ import sys
5+ from datetime import datetime as _DateTime
76
87if hasattr (sys , "pypy_version_info" ):
9- # StringIO is slow on PyPy, StringIO is faster. However: PyPy's own
10- # StringBuilder is fastest.
118 from __pypy__ import newlist_hint
9+ from __pypy__ .builders import BytesBuilder
1210
13- try :
14- from __pypy__ .builders import BytesBuilder as StringBuilder
15- except ImportError :
16- from __pypy__ .builders import StringBuilder
17- USING_STRINGBUILDER = True
11+ _USING_STRINGBUILDER = True
1812
19- class StringIO :
13+ class BytesIO :
2014 def __init__ (self , s = b"" ):
2115 if s :
22- self .builder = StringBuilder (len (s ))
16+ self .builder = BytesBuilder (len (s ))
2317 self .builder .append (s )
2418 else :
25- self .builder = StringBuilder ()
19+ self .builder = BytesBuilder ()
2620
2721 def write (self , s ):
2822 if isinstance (s , memoryview ):
@@ -35,17 +29,17 @@ def getvalue(self):
3529 return self .builder .build ()
3630
3731else :
38- USING_STRINGBUILDER = False
39- from io import BytesIO as StringIO
32+ from io import BytesIO
4033
41- newlist_hint = lambda size : []
34+ _USING_STRINGBUILDER = False
4235
36+ def newlist_hint (size ):
37+ return []
4338
44- from .exceptions import BufferFull , OutOfData , ExtraData , FormatError , StackError
4539
40+ from .exceptions import BufferFull , ExtraData , FormatError , OutOfData , StackError
4641from .ext import ExtType , Timestamp
4742
48-
4943EX_SKIP = 0
5044EX_CONSTRUCT = 1
5145EX_READ_ARRAY_HEADER = 2
@@ -335,6 +329,7 @@ def feed(self, next_bytes):
335329
336330 # Use extend here: INPLACE_ADD += doesn't reliably typecast memoryview in jython
337331 self ._buffer .extend (view )
332+ view .release ()
338333
339334 def _consume (self ):
340335 """Gets rid of the used parts of the buffer."""
@@ -671,12 +666,11 @@ def __init__(
671666 self ._use_float = use_single_float
672667 self ._autoreset = autoreset
673668 self ._use_bin_type = use_bin_type
674- self ._buffer = StringIO ()
669+ self ._buffer = BytesIO ()
675670 self ._datetime = bool (datetime )
676671 self ._unicode_errors = unicode_errors or "strict"
677- if default is not None :
678- if not callable (default ):
679- raise TypeError ("default must be callable" )
672+ if default is not None and not callable (default ):
673+ raise TypeError ("default must be callable" )
680674 self ._default = default
681675
682676 def _pack (
@@ -807,18 +801,18 @@ def pack(self, obj):
807801 try :
808802 self ._pack (obj )
809803 except :
810- self ._buffer = StringIO () # force reset
804+ self ._buffer = BytesIO () # force reset
811805 raise
812806 if self ._autoreset :
813807 ret = self ._buffer .getvalue ()
814- self ._buffer = StringIO ()
808+ self ._buffer = BytesIO ()
815809 return ret
816810
817811 def pack_map_pairs (self , pairs ):
818812 self ._pack_map_pairs (len (pairs ), pairs )
819813 if self ._autoreset :
820814 ret = self ._buffer .getvalue ()
821- self ._buffer = StringIO ()
815+ self ._buffer = BytesIO ()
822816 return ret
823817
824818 def pack_array_header (self , n ):
@@ -827,7 +821,7 @@ def pack_array_header(self, n):
827821 self ._pack_array_header (n )
828822 if self ._autoreset :
829823 ret = self ._buffer .getvalue ()
830- self ._buffer = StringIO ()
824+ self ._buffer = BytesIO ()
831825 return ret
832826
833827 def pack_map_header (self , n ):
@@ -836,7 +830,7 @@ def pack_map_header(self, n):
836830 self ._pack_map_header (n )
837831 if self ._autoreset :
838832 ret = self ._buffer .getvalue ()
839- self ._buffer = StringIO ()
833+ self ._buffer = BytesIO ()
840834 return ret
841835
842836 def pack_ext_type (self , typecode , data ):
@@ -925,11 +919,11 @@ def reset(self):
925919
926920 This method is useful only when autoreset=False.
927921 """
928- self ._buffer = StringIO ()
922+ self ._buffer = BytesIO ()
929923
930924 def getbuffer (self ):
931925 """Return view of internal buffer."""
932- if USING_STRINGBUILDER :
926+ if _USING_STRINGBUILDER :
933927 return memoryview (self .bytes ())
934928 else :
935929 return self ._buffer .getbuffer ()
0 commit comments