1
1
"""Fallback pure Python implementation of msgpack"""
2
2
3
- from datetime import datetime as _DateTime
4
- import sys
5
3
import struct
6
-
4
+ import sys
5
+ from datetime import datetime as _DateTime
7
6
8
7
if hasattr (sys , "pypy_version_info" ):
9
- # StringIO is slow on PyPy, StringIO is faster. However: PyPy's own
10
- # StringBuilder is fastest.
11
8
from __pypy__ import newlist_hint
9
+ from __pypy__ .builders import BytesBuilder
12
10
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
18
12
19
- class StringIO :
13
+ class BytesIO :
20
14
def __init__ (self , s = b"" ):
21
15
if s :
22
- self .builder = StringBuilder (len (s ))
16
+ self .builder = BytesBuilder (len (s ))
23
17
self .builder .append (s )
24
18
else :
25
- self .builder = StringBuilder ()
19
+ self .builder = BytesBuilder ()
26
20
27
21
def write (self , s ):
28
22
if isinstance (s , memoryview ):
@@ -35,17 +29,17 @@ def getvalue(self):
35
29
return self .builder .build ()
36
30
37
31
else :
38
- USING_STRINGBUILDER = False
39
- from io import BytesIO as StringIO
32
+ from io import BytesIO
40
33
41
- newlist_hint = lambda size : []
34
+ _USING_STRINGBUILDER = False
42
35
36
+ def newlist_hint (size ):
37
+ return []
43
38
44
- from .exceptions import BufferFull , OutOfData , ExtraData , FormatError , StackError
45
39
40
+ from .exceptions import BufferFull , ExtraData , FormatError , OutOfData , StackError
46
41
from .ext import ExtType , Timestamp
47
42
48
-
49
43
EX_SKIP = 0
50
44
EX_CONSTRUCT = 1
51
45
EX_READ_ARRAY_HEADER = 2
@@ -335,6 +329,7 @@ def feed(self, next_bytes):
335
329
336
330
# Use extend here: INPLACE_ADD += doesn't reliably typecast memoryview in jython
337
331
self ._buffer .extend (view )
332
+ view .release ()
338
333
339
334
def _consume (self ):
340
335
"""Gets rid of the used parts of the buffer."""
@@ -671,12 +666,11 @@ def __init__(
671
666
self ._use_float = use_single_float
672
667
self ._autoreset = autoreset
673
668
self ._use_bin_type = use_bin_type
674
- self ._buffer = StringIO ()
669
+ self ._buffer = BytesIO ()
675
670
self ._datetime = bool (datetime )
676
671
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" )
680
674
self ._default = default
681
675
682
676
def _pack (
@@ -807,18 +801,18 @@ def pack(self, obj):
807
801
try :
808
802
self ._pack (obj )
809
803
except :
810
- self ._buffer = StringIO () # force reset
804
+ self ._buffer = BytesIO () # force reset
811
805
raise
812
806
if self ._autoreset :
813
807
ret = self ._buffer .getvalue ()
814
- self ._buffer = StringIO ()
808
+ self ._buffer = BytesIO ()
815
809
return ret
816
810
817
811
def pack_map_pairs (self , pairs ):
818
812
self ._pack_map_pairs (len (pairs ), pairs )
819
813
if self ._autoreset :
820
814
ret = self ._buffer .getvalue ()
821
- self ._buffer = StringIO ()
815
+ self ._buffer = BytesIO ()
822
816
return ret
823
817
824
818
def pack_array_header (self , n ):
@@ -827,7 +821,7 @@ def pack_array_header(self, n):
827
821
self ._pack_array_header (n )
828
822
if self ._autoreset :
829
823
ret = self ._buffer .getvalue ()
830
- self ._buffer = StringIO ()
824
+ self ._buffer = BytesIO ()
831
825
return ret
832
826
833
827
def pack_map_header (self , n ):
@@ -836,7 +830,7 @@ def pack_map_header(self, n):
836
830
self ._pack_map_header (n )
837
831
if self ._autoreset :
838
832
ret = self ._buffer .getvalue ()
839
- self ._buffer = StringIO ()
833
+ self ._buffer = BytesIO ()
840
834
return ret
841
835
842
836
def pack_ext_type (self , typecode , data ):
@@ -925,11 +919,11 @@ def reset(self):
925
919
926
920
This method is useful only when autoreset=False.
927
921
"""
928
- self ._buffer = StringIO ()
922
+ self ._buffer = BytesIO ()
929
923
930
924
def getbuffer (self ):
931
925
"""Return view of internal buffer."""
932
- if USING_STRINGBUILDER :
926
+ if _USING_STRINGBUILDER :
933
927
return memoryview (self .bytes ())
934
928
else :
935
929
return self ._buffer .getbuffer ()
0 commit comments