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.
118from __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 :
2014def __init__ (self ,s = b"" ):
2115if s :
22- self .builder = StringBuilder (len (s ))
16+ self .builder = BytesBuilder (len (s ))
2317self .builder .append (s )
2418else :
25- self .builder = StringBuilder ()
19+ self .builder = BytesBuilder ()
2620
2721def write (self ,s ):
2822if isinstance (s ,memoryview ):
@@ -35,17 +29,17 @@ def getvalue(self):
3529return 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
337331self ._buffer .extend (view )
332+ view .release ()
338333
339334def _consume (self ):
340335"""Gets rid of the used parts of the buffer."""
@@ -671,12 +666,11 @@ def __init__(
671666self ._use_float = use_single_float
672667self ._autoreset = autoreset
673668self ._use_bin_type = use_bin_type
674- self ._buffer = StringIO ()
669+ self ._buffer = BytesIO ()
675670self ._datetime = bool (datetime )
676671self ._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" )
680674self ._default = default
681675
682676def _pack (
@@ -807,18 +801,18 @@ def pack(self, obj):
807801try :
808802self ._pack (obj )
809803except :
810- self ._buffer = StringIO ()# force reset
804+ self ._buffer = BytesIO ()# force reset
811805raise
812806if self ._autoreset :
813807ret = self ._buffer .getvalue ()
814- self ._buffer = StringIO ()
808+ self ._buffer = BytesIO ()
815809return ret
816810
817811def pack_map_pairs (self ,pairs ):
818812self ._pack_map_pairs (len (pairs ),pairs )
819813if self ._autoreset :
820814ret = self ._buffer .getvalue ()
821- self ._buffer = StringIO ()
815+ self ._buffer = BytesIO ()
822816return ret
823817
824818def pack_array_header (self ,n ):
@@ -827,7 +821,7 @@ def pack_array_header(self, n):
827821self ._pack_array_header (n )
828822if self ._autoreset :
829823ret = self ._buffer .getvalue ()
830- self ._buffer = StringIO ()
824+ self ._buffer = BytesIO ()
831825return ret
832826
833827def pack_map_header (self ,n ):
@@ -836,7 +830,7 @@ def pack_map_header(self, n):
836830self ._pack_map_header (n )
837831if self ._autoreset :
838832ret = self ._buffer .getvalue ()
839- self ._buffer = StringIO ()
833+ self ._buffer = BytesIO ()
840834return ret
841835
842836def 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
930924def getbuffer (self ):
931925"""Return view of internal buffer."""
932- if USING_STRINGBUILDER :
926+ if _USING_STRINGBUILDER :
933927return memoryview (self .bytes ())
934928else :
935929return self ._buffer .getbuffer ()