Skip to content

Latest commit

 

History

History
1820 lines (1572 loc) · 63.4 KB

File metadata and controls

1820 lines (1572 loc) · 63.4 KB
 
Feb 4, 2000
Feb 4, 2000
1
"""Create portable serialized representations of Python objects.
Dec 5, 1997
Dec 5, 1997
2
May 11, 2008
May 11, 2008
3
See module copyreg for a mechanism for registering custom picklers.
Jan 27, 2003
Jan 27, 2003
4
See module pickletools source for extensive comments.
Dec 5, 1997
Dec 5, 1997
5
6
Classes:
7
8
Pickler
9
Unpickler
10
11
Functions:
12
13
dump(object, file)
14
dumps(object) -> string
15
load(file) -> object
May 2, 2020
May 2, 2020
16
loads(bytes) -> object
Dec 5, 1997
Dec 5, 1997
17
18
Misc variables:
19
Feb 13, 1998
Feb 13, 1998
20
__version__
Dec 5, 1997
Dec 5, 1997
21
format_version
22
compatible_formats
23
Mar 20, 2014
Mar 20, 2014
26
from types import FunctionType
May 11, 2008
May 11, 2008
27
from copyreg import dispatch_table
28
from copyreg import _extension_registry, _inverted_registry, _extension_cache
Apr 14, 2013
Apr 14, 2013
29
from itertools import islice
Oct 10, 2015
Oct 10, 2015
30
from functools import partial
Oct 22, 1998
Oct 22, 1998
31
import sys
Apr 14, 2013
Apr 14, 2013
32
from sys import maxsize
33
from struct import pack, unpack
Feb 18, 2001
Feb 18, 2001
34
import re
May 4, 2007
May 4, 2007
35
import io
Jun 12, 2007
Jun 12, 2007
36
import codecs
Jun 4, 2009
Jun 4, 2009
37
import _compat_pickle
Feb 7, 2001
Feb 7, 2001
39
__all__ = ["PickleError", "PicklingError", "UnpicklingError", "Pickler",
Jun 13, 2019
Jun 13, 2019
40
"Unpickler", "dump", "dumps", "load", "loads"]
41
42
try:
43
from _pickle import PickleBuffer
44
__all__.append("PickleBuffer")
45
_HAVE_PICKLE_BUFFER = True
46
except ImportError:
47
_HAVE_PICKLE_BUFFER = False
48
Feb 7, 2001
Feb 7, 2001
49
Nov 6, 2007
Nov 6, 2007
50
# Shortcut for use in isinstance testing
May 3, 2008
May 3, 2008
51
bytes_types = (bytes, bytearray)
Nov 6, 2007
Nov 6, 2007
52
Jan 29, 2003
Jan 29, 2003
53
# These are purely informational; no code uses these.
Nov 23, 2013
Nov 23, 2013
54
format_version = "4.0" # File format version we write
Jan 27, 2003
Jan 27, 2003
55
compatible_formats = ["1.0", # Original protocol 0
Jan 28, 2003
Jan 28, 2003
56
"1.1", # Protocol 0 with INST added
Jan 27, 2003
Jan 27, 2003
57
"1.2", # Original protocol 1
58
"1.3", # Protocol 1 with BINFLOAT added
59
"2.0", # Protocol 2
Mar 17, 2008
Mar 17, 2008
60
"3.0", # Protocol 3
Nov 23, 2013
Nov 23, 2013
61
"4.0", # Protocol 4
May 26, 2019
May 26, 2019
62
"5.0", # Protocol 5
Jan 27, 2003
Jan 27, 2003
63
] # Old format versions we can read
Mar 14, 1995
Mar 14, 1995
64
Jul 20, 2007
Jul 20, 2007
65
# This is the highest protocol number we know how to read.
May 26, 2019
May 26, 2019
66
HIGHEST_PROTOCOL = 5
Feb 13, 2003
Feb 13, 2003
67
May 4, 2007
May 4, 2007
68
# The protocol we write by default. May be less than HIGHEST_PROTOCOL.
Apr 4, 2018
Apr 4, 2018
69
# Only bump this if the oldest still supported version of Python already
70
# includes it.
71
DEFAULT_PROTOCOL = 4
May 4, 2007
May 4, 2007
72
May 29, 2002
May 29, 2002
73
class PickleError(Exception):
May 30, 2002
May 30, 2002
74
"""A common base class for the other pickling exceptions."""
May 29, 2002
May 29, 2002
75
pass
76
77
class PicklingError(PickleError):
78
"""This exception is raised when an unpicklable object is passed to the
79
dump() method.
80
81
"""
82
pass
83
84
class UnpicklingError(PickleError):
85
"""This exception is raised when there is a problem unpickling an object,
86
such as a security violation.
87
88
Note that other exceptions may also be raised during unpickling, including
89
(but not necessarily limited to) AttributeError, EOFError, ImportError,
90
and IndexError.
91
92
"""
93
pass
Apr 9, 1997
Apr 9, 1997
94
Jan 29, 2003
Jan 29, 2003
95
# An instance of _Stop is raised by Unpickler.load_stop() in response to
96
# the STOP opcode, passing the object that is the result of unpickling.
Dec 13, 2000
Dec 13, 2000
97
class _Stop(Exception):
98
def __init__(self, value):
99
self.value = value
100
Jan 28, 2003
Jan 28, 2003
101
# Jython has PyStringMap; it's a dict subclass with string keys
May 27, 1998
May 27, 1998
102
try:
103
from org.python.core import PyStringMap
Jul 4, 2013
Jul 4, 2013
104
except ImportError:
May 27, 1998
May 27, 1998
105
PyStringMap = None
106
Jan 27, 2003
Jan 27, 2003
107
# Pickle opcodes. See pickletools.py for extensive docs. The listing
108
# here is in kind-of alphabetical order of 1-character pickle code.
109
# pickletools groups them by purpose.
110
May 4, 2007
May 4, 2007
111
MARK = b'(' # push special markobject on stack
112
STOP = b'.' # every pickle ends with STOP
113
POP = b'0' # discard topmost stack item
114
POP_MARK = b'1' # discard stack top through topmost markobject
115
DUP = b'2' # duplicate top stack item
116
FLOAT = b'F' # push float object; decimal string argument
117
INT = b'I' # push integer or bool; decimal string argument
118
BININT = b'J' # push four-byte signed int
119
BININT1 = b'K' # push 1-byte unsigned int
120
LONG = b'L' # push long; decimal string argument
121
BININT2 = b'M' # push 2-byte unsigned int
122
NONE = b'N' # push None
123
PERSID = b'P' # push persistent object; id is taken from string arg
124
BINPERSID = b'Q' # " " " ; " " " " stack
125
REDUCE = b'R' # apply callable to argtuple, both on stack
126
STRING = b'S' # push string; NL-terminated string argument
127
BINSTRING = b'T' # push string; counted binary string argument
128
SHORT_BINSTRING= b'U' # " " ; " " " " < 256 bytes
129
UNICODE = b'V' # push Unicode string; raw-unicode-escaped'd argument
130
BINUNICODE = b'X' # " " " ; counted UTF-8 string argument
131
APPEND = b'a' # append stack top to list below it
132
BUILD = b'b' # call __setstate__ or __dict__.update()
133
GLOBAL = b'c' # push self.find_class(modname, name); 2 string args
134
DICT = b'd' # build a dict from stack items
135
EMPTY_DICT = b'}' # push empty dict
136
APPENDS = b'e' # extend list on stack by topmost stack slice
137
GET = b'g' # push item from memo on stack; index is string arg
138
BINGET = b'h' # " " " " " " ; " " 1-byte arg
139
INST = b'i' # build & push class instance
140
LONG_BINGET = b'j' # push item from memo on stack; index is 4-byte arg
141
LIST = b'l' # build list from topmost stack items
142
EMPTY_LIST = b']' # push empty list
143
OBJ = b'o' # build & push class instance
144
PUT = b'p' # store stack top in memo; index is string arg
145
BINPUT = b'q' # " " " " " ; " " 1-byte arg
146
LONG_BINPUT = b'r' # " " " " " ; " " 4-byte arg
147
SETITEM = b's' # add key+value pair to dict
148
TUPLE = b't' # build tuple from topmost stack items
149
EMPTY_TUPLE = b')' # push empty tuple
150
SETITEMS = b'u' # modify dict by adding topmost key+value pairs
151
BINFLOAT = b'G' # push float; arg is 8-byte float encoding
152
153
TRUE = b'I01\n' # not an opcode; see INT docs in pickletools.py
154
FALSE = b'I00\n' # not an opcode; see INT docs in pickletools.py
Apr 3, 2002
Apr 3, 2002
155
Jan 29, 2003
Jan 29, 2003
156
# Protocol 2
Jan 28, 2003
Jan 28, 2003
157
May 4, 2007
May 4, 2007
158
PROTO = b'\x80' # identify pickle protocol
159
NEWOBJ = b'\x81' # build object by applying cls.__new__ to argtuple
160
EXT1 = b'\x82' # push object from extension registry; 1-byte index
161
EXT2 = b'\x83' # ditto, but 2-byte index
162
EXT4 = b'\x84' # ditto, but 4-byte index
163
TUPLE1 = b'\x85' # build 1-tuple from stack top
164
TUPLE2 = b'\x86' # build 2-tuple from two topmost stack items
165
TUPLE3 = b'\x87' # build 3-tuple from three topmost stack items
166
NEWTRUE = b'\x88' # push True
167
NEWFALSE = b'\x89' # push False
168
LONG1 = b'\x8a' # push long from < 256 bytes
169
LONG4 = b'\x8b' # push really big long
Jan 27, 2003
Jan 27, 2003
170
Jan 28, 2003
Jan 28, 2003
171
_tuplesize2code = [EMPTY_TUPLE, TUPLE1, TUPLE2, TUPLE3]
172
Mar 17, 2008
Mar 17, 2008
173
# Protocol 3 (Python 3.x)
174
175
BINBYTES = b'B' # push bytes; counted binary string argument
176
SHORT_BINBYTES = b'C' # " " ; " " " " < 256 bytes
Nov 23, 2013
Nov 23, 2013
178
# Protocol 4
May 26, 2019
May 26, 2019
179
Nov 23, 2013
Nov 23, 2013
180
SHORT_BINUNICODE = b'\x8c' # push short string; UTF-8 length < 256 bytes
181
BINUNICODE8 = b'\x8d' # push very long string
182
BINBYTES8 = b'\x8e' # push very long bytes string
183
EMPTY_SET = b'\x8f' # push empty set on the stack
184
ADDITEMS = b'\x90' # modify set by adding topmost stack items
185
FROZENSET = b'\x91' # build frozenset from topmost stack items
186
NEWOBJ_EX = b'\x92' # like NEWOBJ but work with keyword only arguments
187
STACK_GLOBAL = b'\x93' # same as GLOBAL but using names on the stacks
188
MEMOIZE = b'\x94' # store top of the stack in memo
189
FRAME = b'\x95' # indicate the beginning of a new frame
190
May 26, 2019
May 26, 2019
191
# Protocol 5
192
193
BYTEARRAY8 = b'\x96' # push bytearray
194
NEXT_BUFFER = b'\x97' # push next out-of-band buffer
195
READONLY_BUFFER = b'\x98' # make top of stack readonly
196
Nov 23, 2013
Nov 23, 2013
197
__all__.extend([x for x in dir() if re.match("[A-Z][A-Z0-9_]+$", x)])
198
199
200
class _Framer:
201
Jan 20, 2018
Jan 20, 2018
202
_FRAME_SIZE_MIN = 4
Nov 23, 2013
Nov 23, 2013
203
_FRAME_SIZE_TARGET = 64 * 1024
204
205
def __init__(self, file_write):
206
self.file_write = file_write
207
self.current_frame = None
208
209
def start_framing(self):
210
self.current_frame = io.BytesIO()
211
212
def end_framing(self):
Nov 24, 2013
Nov 24, 2013
213
if self.current_frame and self.current_frame.tell() > 0:
214
self.commit_frame(force=True)
Nov 23, 2013
Nov 23, 2013
215
self.current_frame = None
216
Nov 24, 2013
Nov 24, 2013
217
def commit_frame(self, force=False):
218
if self.current_frame:
219
f = self.current_frame
220
if f.tell() >= self._FRAME_SIZE_TARGET or force:
Jan 6, 2018
Jan 6, 2018
221
data = f.getbuffer()
222
write = self.file_write
Jan 20, 2018
Jan 20, 2018
223
if len(data) >= self._FRAME_SIZE_MIN:
224
# Issue a single call to the write method of the underlying
225
# file object for the frame opcode with the size of the
226
# frame. The concatenation is expected to be less expensive
227
# than issuing an additional call to write.
228
write(FRAME + pack("<Q", len(data)))
Jan 6, 2018
Jan 6, 2018
229
230
# Issue a separate call to write to append the frame
231
# contents without concatenation to the above to avoid a
232
# memory copy.
233
write(data)
234
235
# Start the new frame with a new io.BytesIO instance so that
236
# the file object can have delayed access to the previous frame
237
# contents via an unreleased memoryview of the previous
238
# io.BytesIO instance.
239
self.current_frame = io.BytesIO()
Nov 24, 2013
Nov 24, 2013
240
Nov 23, 2013
Nov 23, 2013
241
def write(self, data):
Nov 24, 2013
Nov 24, 2013
242
if self.current_frame:
243
return self.current_frame.write(data)
Nov 23, 2013
Nov 23, 2013
244
else:
Nov 24, 2013
Nov 24, 2013
245
return self.file_write(data)
246
Jan 6, 2018
Jan 6, 2018
247
def write_large_bytes(self, header, payload):
248
write = self.file_write
249
if self.current_frame:
250
# Terminate the current frame and flush it to the file.
251
self.commit_frame(force=True)
252
253
# Perform direct write of the header and payload of the large binary
254
# object. Be careful not to concatenate the header and the payload
255
# prior to calling 'write' as we do not want to allocate a large
256
# temporary bytes object.
257
# We intentionally do not insert a protocol 4 frame opcode to make
258
# it possible to optimize file.read calls in the loader.
259
write(header)
260
write(payload)
261
Nov 23, 2013
Nov 23, 2013
262
263
class _Unframer:
264
265
def __init__(self, file_read, file_readline, file_tell=None):
266
self.file_read = file_read
267
self.file_readline = file_readline
268
self.current_frame = None
269
May 26, 2019
May 26, 2019
270
def readinto(self, buf):
271
if self.current_frame:
272
n = self.current_frame.readinto(buf)
273
if n == 0 and len(buf) != 0:
274
self.current_frame = None
275
n = len(buf)
276
buf[:] = self.file_read(n)
277
return n
278
if n < len(buf):
279
raise UnpicklingError(
280
"pickle exhausted before end of frame")
281
return n
282
else:
283
n = len(buf)
284
buf[:] = self.file_read(n)
285
return n
286
Nov 23, 2013
Nov 23, 2013
287
def read(self, n):
Nov 24, 2013
Nov 24, 2013
288
if self.current_frame:
289
data = self.current_frame.read(n)
290
if not data and n != 0:
291
self.current_frame = None
292
return self.file_read(n)
293
if len(data) < n:
294
raise UnpicklingError(
295
"pickle exhausted before end of frame")
296
return data
297
else:
298
return self.file_read(n)
Nov 23, 2013
Nov 23, 2013
299
300
def readline(self):
Nov 24, 2013
Nov 24, 2013
301
if self.current_frame:
302
data = self.current_frame.readline()
303
if not data:
304
self.current_frame = None
305
return self.file_readline()
Jan 26, 2015
Jan 26, 2015
306
if data[-1] != b'\n'[0]:
Nov 24, 2013
Nov 24, 2013
307
raise UnpicklingError(
308
"pickle exhausted before end of frame")
309
return data
Nov 23, 2013
Nov 23, 2013
310
else:
Nov 24, 2013
Nov 24, 2013
311
return self.file_readline()
Nov 23, 2013
Nov 23, 2013
312
Nov 24, 2013
Nov 24, 2013
313
def load_frame(self, frame_size):
314
if self.current_frame and self.current_frame.read() != b'':
315
raise UnpicklingError(
316
"beginning of a new frame before end of current frame")
317
self.current_frame = io.BytesIO(self.file_read(frame_size))
Nov 23, 2013
Nov 23, 2013
318
319
320
# Tools used for pickling.
321
Mar 31, 2015
Mar 31, 2015
322
def _getattribute(obj, name):
323
for subpath in name.split('.'):
Nov 23, 2013
Nov 23, 2013
324
if subpath == '<locals>':
325
raise AttributeError("Can't get local attribute {!r} on {!r}"
326
.format(name, obj))
327
try:
Mar 31, 2015
Mar 31, 2015
328
parent = obj
Nov 23, 2013
Nov 23, 2013
329
obj = getattr(obj, subpath)
330
except AttributeError:
331
raise AttributeError("Can't get attribute {!r} on {!r}"
Apr 5, 2017
Apr 5, 2017
332
.format(name, obj)) from None
Mar 31, 2015
Mar 31, 2015
333
return obj, parent
Nov 23, 2013
Nov 23, 2013
334
Mar 31, 2015
Mar 31, 2015
335
def whichmodule(obj, name):
Nov 23, 2013
Nov 23, 2013
336
"""Find the module an object belong to."""
337
module_name = getattr(obj, '__module__', None)
338
if module_name is not None:
339
return module_name
Oct 4, 2014
Oct 4, 2014
340
# Protect the iteration by using a list copy of sys.modules against dynamic
341
# modules that trigger imports of other modules upon calls to getattr.
Apr 21, 2020
Apr 21, 2020
342
for module_name, module in sys.modules.copy().items():
Nov 29, 2020
Nov 29, 2020
343
if (module_name == '__main__'
344
or module_name == '__mp_main__' # bpo-42406
345
or module is None):
Nov 23, 2013
Nov 23, 2013
346
continue
347
try:
Mar 31, 2015
Mar 31, 2015
348
if _getattribute(module, name)[0] is obj:
Nov 23, 2013
Nov 23, 2013
349
return module_name
350
except AttributeError:
351
pass
352
return '__main__'
353
354
def encode_long(x):
355
r"""Encode a long to a two's complement little-endian binary string.
356
Note that 0 is a special case, returning an empty string, to save a
357
byte in the LONG1 pickling context.
358
359
>>> encode_long(0)
360
b''
361
>>> encode_long(255)
362
b'\xff\x00'
363
>>> encode_long(32767)
364
b'\xff\x7f'
365
>>> encode_long(-256)
366
b'\x00\xff'
367
>>> encode_long(-32768)
368
b'\x00\x80'
369
>>> encode_long(-128)
370
b'\x80'
371
>>> encode_long(127)
372
b'\x7f'
373
>>>
374
"""
375
if x == 0:
376
return b''
377
nbytes = (x.bit_length() >> 3) + 1
378
result = x.to_bytes(nbytes, byteorder='little', signed=True)
379
if x < 0 and nbytes > 1:
380
if result[-1] == 0xff and (result[-2] & 0x80) != 0:
381
result = result[:-1]
382
return result
383
384
def decode_long(data):
385
r"""Decode a long from a two's complement little-endian binary string.
386
387
>>> decode_long(b'')
388
0
389
>>> decode_long(b"\xff\x00")
390
255
391
>>> decode_long(b"\xff\x7f")
392
32767
393
>>> decode_long(b"\x00\xff")
394
-256
395
>>> decode_long(b"\x00\x80")
396
-32768
397
>>> decode_long(b"\x80")
398
-128
399
>>> decode_long(b"\x7f")
400
127
401
"""
402
return int.from_bytes(data, byteorder='little', signed=True)
403
Feb 18, 2001
Feb 18, 2001
404
Jan 28, 2003
Jan 28, 2003
405
# Pickling machinery
406
Jun 12, 2008
Jun 12, 2008
407
class _Pickler:
May 26, 2019
May 26, 2019
409
def __init__(self, file, protocol=None, *, fix_imports=True,
410
buffer_callback=None):
May 4, 2007
May 4, 2007
411
"""This takes a binary file for writing a pickle data stream.
412
Dec 7, 2013
Dec 7, 2013
413
The optional *protocol* argument tells the pickler to use the
Jan 24, 2020
Jan 24, 2020
414
given protocol; supported protocols are 0, 1, 2, 3, 4 and 5.
415
The default protocol is 4. It was introduced in Python 3.4, and
416
is incompatible with previous versions.
Jan 27, 2003
Jan 27, 2003
417
Jan 31, 2003
Jan 31, 2003
418
Specifying a negative protocol version selects the highest
Feb 1, 2003
Feb 1, 2003
419
protocol version supported. The higher the protocol used, the
420
more recent the version of Python needed to read the pickle
421
produced.
May 29, 2002
May 29, 2002
422
Dec 7, 2013
Dec 7, 2013
423
The *file* argument must have a write() method that accepts a
424
single bytes argument. It can thus be a file object opened for
Nov 2, 2015
Nov 2, 2015
425
binary writing, an io.BytesIO instance, or any other custom
Dec 7, 2013
Dec 7, 2013
426
object that meets this interface.
Jun 4, 2009
Jun 4, 2009
427
Dec 7, 2013
Dec 7, 2013
428
If *fix_imports* is True and *protocol* is less than 3, pickle
429
will try to map the new Python 3 names to the old module names
430
used in Python 2, so that the pickle data stream is readable
431
with Python 2.
May 26, 2019
May 26, 2019
432
433
If *buffer_callback* is None (the default), buffer views are
434
serialized into *file* as part of the pickle stream.
435
436
If *buffer_callback* is not None, then it can be called any number
437
of times with a buffer view. If the callback returns a false value
438
(such as None), the given buffer is out-of-band; otherwise the
439
buffer is serialized in-band, i.e. inside the pickle stream.
440
441
It is an error if *buffer_callback* is not None and *protocol*
442
is None or smaller than 5.
May 29, 2002
May 29, 2002
443
"""
Feb 9, 2003
Feb 9, 2003
444
if protocol is None:
May 4, 2007
May 4, 2007
445
protocol = DEFAULT_PROTOCOL
Feb 9, 2003
Feb 9, 2003
446
if protocol < 0:
Feb 13, 2003
Feb 13, 2003
447
protocol = HIGHEST_PROTOCOL
448
elif not 0 <= protocol <= HIGHEST_PROTOCOL:
449
raise ValueError("pickle protocol must be <= %d" % HIGHEST_PROTOCOL)
May 26, 2019
May 26, 2019
450
if buffer_callback is not None and protocol < 5:
451
raise ValueError("buffer_callback needs protocol >= 5")
452
self._buffer_callback = buffer_callback
Jun 12, 2008
Jun 12, 2008
453
try:
Nov 23, 2013
Nov 23, 2013
454
self._file_write = file.write
Jun 12, 2008
Jun 12, 2008
455
except AttributeError:
456
raise TypeError("file must have a 'write' attribute")
Nov 24, 2013
Nov 24, 2013
457
self.framer = _Framer(self._file_write)
458
self.write = self.framer.write
Jan 6, 2018
Jan 6, 2018
459
self._write_large_bytes = self.framer.write_large_bytes
Apr 9, 1997
Apr 9, 1997
460
self.memo = {}
Feb 9, 2003
Feb 9, 2003
461
self.proto = int(protocol)
462
self.bin = protocol >= 1
Jan 29, 2003
Jan 29, 2003
463
self.fast = 0
Jun 4, 2009
Jun 4, 2009
464
self.fix_imports = fix_imports and protocol < 3
Apr 9, 1997
Apr 9, 1997
465
May 1, 2002
May 1, 2002
466
def clear_memo(self):
May 29, 2002
May 29, 2002
467
"""Clears the pickler's "memo".
468
469
The memo is the data structure that remembers which objects the
Dec 7, 2013
Dec 7, 2013
470
pickler has already seen, so that shared or recursive objects
471
are pickled by reference and not by value. This method is
472
useful when re-using picklers.
May 29, 2002
May 29, 2002
473
"""
May 1, 2002
May 1, 2002
474
self.memo.clear()
475
Jan 28, 2003
Jan 28, 2003
476
def dump(self, obj):
Feb 1, 2003
Feb 1, 2003
477
"""Write a pickled representation of obj to the open file."""
Dec 27, 2008
Dec 27, 2008
478
# Check whether Pickler was initialized correctly. This is
479
# only needed to mimic the behavior of _pickle.Pickler.dump().
Nov 23, 2013
Nov 23, 2013
480
if not hasattr(self, "_file_write"):
Dec 27, 2008
Dec 27, 2008
481
raise PicklingError("Pickler.__init__() was not called by "
482
"%s.__init__()" % (self.__class__.__name__,))
Jan 28, 2003
Jan 28, 2003
483
if self.proto >= 2:
Nov 24, 2013
Nov 24, 2013
484
self.write(PROTO + pack("<B", self.proto))
Nov 23, 2013
Nov 23, 2013
485
if self.proto >= 4:
Nov 24, 2013
Nov 24, 2013
486
self.framer.start_framing()
Jan 28, 2003
Jan 28, 2003
487
self.save(obj)
Apr 9, 1997
Apr 9, 1997
488
self.write(STOP)
Nov 24, 2013
Nov 24, 2013
489
self.framer.end_framing()
Apr 9, 1997
Apr 9, 1997
490
Jan 24, 2003
Jan 24, 2003
491
def memoize(self, obj):
492
"""Store an object in the memo."""
493
Jan 27, 2003
Jan 27, 2003
494
# The Pickler memo is a dictionary mapping object ids to 2-tuples
495
# that contain the Unpickler memo key and the object being memoized.
496
# The memo key is written to the pickle and will become
Jan 24, 2003
Jan 24, 2003
497
# the key in the Unpickler's memo. The object is stored in the
Jan 27, 2003
Jan 27, 2003
498
# Pickler memo so that transient objects are kept alive during
499
# pickling.
500
501
# The use of the Unpickler memo length as the memo key is just a
502
# convention. The only requirement is that the memo values be unique.
503
# But there appears no advantage to any other scheme, and this
Jan 28, 2003
Jan 28, 2003
504
# scheme allows the Unpickler memo to be implemented as a plain (but
Jan 27, 2003
Jan 27, 2003
505
# growable) array, indexed by memo key.
Jan 29, 2003
Jan 29, 2003
506
if self.fast:
507
return
Jan 30, 2003
Jan 30, 2003
508
assert id(obj) not in self.memo
Nov 23, 2013
Nov 23, 2013
509
idx = len(self.memo)
510
self.write(self.put(idx))
511
self.memo[id(obj)] = idx, obj
Jan 24, 2003
Jan 24, 2003
512
Jan 27, 2003
Jan 27, 2003
513
# Return a PUT (BINPUT, LONG_BINPUT) opcode string, with argument i.
Nov 23, 2013
Nov 23, 2013
514
def put(self, idx):
515
if self.proto >= 4:
516
return MEMOIZE
517
elif self.bin:
518
if idx < 256:
519
return BINPUT + pack("<B", idx)
Jan 28, 2003
Jan 28, 2003
520
else:
Nov 23, 2013
Nov 23, 2013
521
return LONG_BINPUT + pack("<I", idx)
522
else:
523
return PUT + repr(idx).encode("ascii") + b'\n'
Apr 9, 1997
Apr 9, 1997
524
Jan 27, 2003
Jan 27, 2003
525
# Return a GET (BINGET, LONG_BINGET) opcode string, with argument i.
Apr 14, 2013
Apr 14, 2013
526
def get(self, i):
Apr 10, 2001
Apr 10, 2001
527
if self.bin:
528
if i < 256:
Apr 14, 2013
Apr 14, 2013
529
return BINGET + pack("<B", i)
Jan 28, 2003
Jan 28, 2003
530
else:
Nov 24, 2012
Nov 24, 2012
531
return LONG_BINGET + pack("<I", i)
Apr 9, 1997
Apr 9, 1997
532
Aug 27, 2007
Aug 27, 2007
533
return GET + repr(i).encode("ascii") + b'\n'
Jan 15, 2001
Jan 15, 2001
534
Jun 12, 2008
Jun 12, 2008
535
def save(self, obj, save_persistent_id=True):
Nov 24, 2013
Nov 24, 2013
536
self.framer.commit_frame()
537
Jan 28, 2003
Jan 28, 2003
538
# Check for persistent id (defined by a subclass)
Jan 28, 2003
Jan 28, 2003
539
pid = self.persistent_id(obj)
Jun 12, 2008
Jun 12, 2008
540
if pid is not None and save_persistent_id:
Nov 13, 2002
Nov 13, 2002
541
self.save_pers(pid)
542
return
Apr 9, 1997
Apr 9, 1997
543
Jan 28, 2003
Jan 28, 2003
544
# Check the memo
545
x = self.memo.get(id(obj))
Apr 14, 2013
Apr 14, 2013
546
if x is not None:
Jan 28, 2003
Jan 28, 2003
547
self.write(self.get(x[0]))
Apr 9, 1997
Apr 9, 1997
548
return
549
May 8, 2019
May 8, 2019
550
rv = NotImplemented
551
reduce = getattr(self, "reducer_override", None)
Apr 14, 2013
Apr 14, 2013
552
if reduce is not None:
Feb 18, 2003
Feb 18, 2003
553
rv = reduce(obj)
May 8, 2019
May 8, 2019
554
555
if rv is NotImplemented:
556
# Check the type dispatch table
557
t = type(obj)
558
f = self.dispatch.get(t)
559
if f is not None:
560
f(self, obj) # Call unbound method with explicit self
Oct 4, 2011
Oct 4, 2011
561
return
562
May 8, 2019
May 8, 2019
563
# Check private dispatch table if any, or else
564
# copyreg.dispatch_table
565
reduce = getattr(self, 'dispatch_table', dispatch_table).get(t)
Apr 14, 2013
Apr 14, 2013
566
if reduce is not None:
May 8, 2019
May 8, 2019
567
rv = reduce(obj)
Feb 18, 2003
Feb 18, 2003
568
else:
May 8, 2019
May 8, 2019
569
# Check for a class with a custom metaclass; treat as regular
570
# class
571
if issubclass(t, type):
572
self.save_global(obj)
573
return
574
575
# Check for a __reduce_ex__ method, fall back to __reduce__
576
reduce = getattr(obj, "__reduce_ex__", None)
Apr 14, 2013
Apr 14, 2013
577
if reduce is not None:
May 8, 2019
May 8, 2019
578
rv = reduce(self.proto)
Feb 18, 2003
Feb 18, 2003
579
else:
May 8, 2019
May 8, 2019
580
reduce = getattr(obj, "__reduce__", None)
581
if reduce is not None:
582
rv = reduce()
583
else:
584
raise PicklingError("Can't pickle %r object: %r" %
585
(t.__name__, obj))
Jan 28, 2003
Jan 28, 2003
586
587
# Check for string returned by reduce(), meaning "save as global"
Oct 16, 2007
Oct 16, 2007
588
if isinstance(rv, str):
Jan 28, 2003
Jan 28, 2003
589
self.save_global(obj, rv)
Jan 28, 2003
Jan 28, 2003
590
return
Apr 9, 1997
Apr 9, 1997
591
Jan 28, 2003
Jan 28, 2003
592
# Assert that reduce() returned a tuple
Jun 7, 2007
Jun 7, 2007
593
if not isinstance(rv, tuple):
Jan 28, 2003
Jan 28, 2003
594
raise PicklingError("%s must return string or tuple" % reduce)
Jan 15, 2001
Jan 15, 2001
595
Jan 31, 2003
Jan 31, 2003
596
# Assert that it returned an appropriately sized tuple
Jan 28, 2003
Jan 28, 2003
597
l = len(rv)
May 8, 2019
May 8, 2019
598
if not (2 <= l <= 6):
Jan 28, 2003
Jan 28, 2003
599
raise PicklingError("Tuple returned by %s must have "
May 8, 2019
May 8, 2019
600
"two to six elements" % reduce)
Apr 9, 1997
Apr 9, 1997
601
Jan 28, 2003
Jan 28, 2003
602
# Save the reduce() output and finally memoize the object
Jan 31, 2003
Jan 31, 2003
603
self.save_reduce(obj=obj, *rv)
Apr 9, 1997
Apr 9, 1997
604
Jan 28, 2003
Jan 28, 2003
605
def persistent_id(self, obj):
Jan 28, 2003
Jan 28, 2003
606
# This exists so a subclass can override it
Apr 9, 1997
Apr 9, 1997
607
return None
608
609
def save_pers(self, pid):
Jan 28, 2003
Jan 28, 2003
610
# Save a persistent id reference
Jan 28, 2003
Jan 28, 2003
611
if self.bin:
Jun 12, 2008
Jun 12, 2008
612
self.save(pid, save_persistent_id=False)
Apr 9, 1997
Apr 9, 1997
613
self.write(BINPERSID)
Jan 28, 2003
Jan 28, 2003
614
else:
Jul 17, 2016
Jul 17, 2016
615
try:
616
self.write(PERSID + str(pid).encode("ascii") + b'\n')
617
except UnicodeEncodeError:
618
raise PicklingError(
619
"persistent IDs in protocol 0 must be ASCII strings")
Apr 9, 1997
Apr 9, 1997
620
Nov 23, 2013
Nov 23, 2013
621
def save_reduce(self, func, args, state=None, listitems=None,
Jun 9, 2022
Jun 9, 2022
622
dictitems=None, state_setter=None, *, obj=None):
Jun 29, 2003
Jun 29, 2003
623
# This API is called by some subclasses
Apr 9, 1997
Apr 9, 1997
624
Jun 7, 2007
Jun 7, 2007
625
if not isinstance(args, tuple):
Nov 23, 2013
Nov 23, 2013
626
raise PicklingError("args from save_reduce() must be a tuple")
Oct 28, 2011
Oct 28, 2011
627
if not callable(func):
Nov 23, 2013
Nov 23, 2013
628
raise PicklingError("func from save_reduce() must be callable")
Jan 28, 2003
Jan 28, 2003
629
630
save = self.save
631
write = self.write
632
Nov 23, 2013
Nov 23, 2013
633
func_name = getattr(func, "__name__", "")
Oct 10, 2015
Oct 10, 2015
634
if self.proto >= 2 and func_name == "__newobj_ex__":
Nov 23, 2013
Nov 23, 2013
635
cls, args, kwargs = args
636
if not hasattr(cls, "__new__"):
637
raise PicklingError("args[0] from {} args has no __new__"
638
.format(func_name))
639
if obj is not None and cls is not obj.__class__:
640
raise PicklingError("args[0] from {} args has the wrong class"
641
.format(func_name))
Oct 10, 2015
Oct 10, 2015
642
if self.proto >= 4:
643
save(cls)
644
save(args)
645
save(kwargs)
646
write(NEWOBJ_EX)
647
else:
648
func = partial(cls.__new__, cls, *args, **kwargs)
649
save(func)
650
save(())
651
write(REDUCE)
Nov 23, 2013
Nov 23, 2013
652
elif self.proto >= 2 and func_name == "__newobj__":
653
# A __reduce__ implementation can direct protocol 2 or newer to
Jan 31, 2003
Jan 31, 2003
654
# use the more efficient NEWOBJ opcode, while still
655
# allowing protocol 0 and 1 to work normally. For this to
656
# work, the function returned by __reduce__ should be
657
# called __newobj__, and its first argument should be a
Dec 12, 2011
Dec 12, 2011
658
# class. The implementation for __newobj__
Jan 31, 2003
Jan 31, 2003
659
# should be as follows, although pickle has no way to
660
# verify this:
661
#
662
# def __newobj__(cls, *args):
663
# return cls.__new__(cls, *args)
664
#
665
# Protocols 0 and 1 will pickle a reference to __newobj__,
666
# while protocol 2 (and above) will pickle a reference to
667
# cls, the remaining args tuple, and the NEWOBJ code,
668
# which calls cls.__new__(cls, *args) at unpickling time
669
# (see load_newobj below). If __reduce__ returns a
670
# three-tuple, the state from the third tuple item will be
671
# pickled regardless of the protocol, calling __setstate__
672
# at unpickling time (see load_build below).
673
#
674
# Note that no standard __newobj__ implementation exists;
675
# you have to provide your own. This is to enforce
676
# compatibility with Python 2.2 (pickles written using
677
# protocol 0 or 1 in Python 2.3 should be unpicklable by
678
# Python 2.2).
679
cls = args[0]
680
if not hasattr(cls, "__new__"):
681
raise PicklingError(
682
"args[0] from __newobj__ args has no __new__")
Jan 31, 2003
Jan 31, 2003
683
if obj is not None and cls is not obj.__class__:
684
raise PicklingError(
685
"args[0] from __newobj__ args has the wrong class")
Jan 31, 2003
Jan 31, 2003
686
args = args[1:]
687
save(cls)
688
save(args)
689
write(NEWOBJ)
690
else:
691
save(func)
692
save(args)
693
write(REDUCE)
Jan 15, 2001
Jan 15, 2001
694
Jan 31, 2003
Jan 31, 2003
695
if obj is not None:
Nov 23, 2013
Nov 23, 2013
696
# If the object is already in the memo, this means it is
697
# recursive. In this case, throw away everything we put on the
698
# stack, and fetch the object back from the memo.
699
if id(obj) in self.memo:
700
write(POP + self.get(self.memo[id(obj)][0]))
701
else:
702
self.memoize(obj)
Jan 31, 2003
Jan 31, 2003
703
Jan 31, 2003
Jan 31, 2003
704
# More new special cases (that work with older protocols as
705
# well): when __reduce__ returns a tuple with 4 or 5 items,
706
# the 4th and 5th item should be iterators that provide list
707
# items and dict items (as (key, value) tuples), or None.
708
709
if listitems is not None:
710
self._batch_appends(listitems)
711
712
if dictitems is not None:
713
self._batch_setitems(dictitems)
714
Apr 10, 2001
Apr 10, 2001
715
if state is not None:
May 8, 2019
May 8, 2019
716
if state_setter is None:
717
save(state)
718
write(BUILD)
719
else:
720
# If a state_setter is specified, call it instead of load_build
721
# to update obj's with its previous state.
722
# First, push state_setter and its tuple of expected arguments
723
# (obj, state) onto the stack.
724
save(state_setter)
725
save(obj) # simple BINGET opcode as obj is already memoized.
726
save(state)
727
write(TUPLE2)
728
# Trigger a state_setter(obj, state) function call.
729
write(REDUCE)
730
# The purpose of state_setter is to carry-out an
731
# inplace modification of obj. We do not care about what the
732
# method might return, so its output is eventually removed from
733
# the stack.
734
write(POP)
Apr 9, 1997
Apr 9, 1997
735
Jan 28, 2003
Jan 28, 2003
736
# Methods below this point are dispatched through the dispatch table
737
Apr 9, 1997
Apr 9, 1997
738
dispatch = {}
739
Jan 28, 2003
Jan 28, 2003
740
def save_none(self, obj):
Apr 9, 1997
Apr 9, 1997
741
self.write(NONE)
Jun 7, 2007
Jun 7, 2007
742
dispatch[type(None)] = save_none
Apr 9, 1997
Apr 9, 1997
743
Jan 28, 2003
Jan 28, 2003
744
def save_bool(self, obj):
Jan 28, 2003
Jan 28, 2003
745
if self.proto >= 2:
Apr 14, 2013
Apr 14, 2013
746
self.write(NEWTRUE if obj else NEWFALSE)
Jan 28, 2003
Jan 28, 2003
747
else:
Apr 14, 2013
Apr 14, 2013
748
self.write(TRUE if obj else FALSE)
Apr 3, 2002
Apr 3, 2002
749
dispatch[bool] = save_bool
750
Apr 14, 2013
Apr 14, 2013
751
def save_long(self, obj):
Jan 14, 2007
Jan 14, 2007
752
if self.bin:
753
# If the int is small enough to fit in a signed 4-byte 2's-comp
754
# format, we can store it more efficiently than the general
755
# case.
756
# First one- and two-byte unsigned ints:
757
if obj >= 0:
758
if obj <= 0xff:
Apr 14, 2013
Apr 14, 2013
759
self.write(BININT1 + pack("<B", obj))
Jan 14, 2007
Jan 14, 2007
760
return
761
if obj <= 0xffff:
Apr 14, 2013
Apr 14, 2013
762
self.write(BININT2 + pack("<H", obj))
Jan 14, 2007
Jan 14, 2007
763
return
764
# Next check for 4-byte signed ints:
Apr 14, 2013
Apr 14, 2013
765
if -0x80000000 <= obj <= 0x7fffffff:
Jan 14, 2007
Jan 14, 2007
766
self.write(BININT + pack("<i", obj))
767
return
Jan 28, 2003
Jan 28, 2003
768
if self.proto >= 2:
May 4, 2007
May 4, 2007
769
encoded = encode_long(obj)
770
n = len(encoded)
Jan 28, 2003
Jan 28, 2003
771
if n < 256:
Apr 14, 2013
Apr 14, 2013
772
self.write(LONG1 + pack("<B", n) + encoded)
Jan 28, 2003
Jan 28, 2003
773
else:
May 4, 2007
May 4, 2007
774
self.write(LONG4 + pack("<i", n) + encoded)
Feb 2, 2003
Feb 2, 2003
775
return
Nov 16, 2017
Nov 16, 2017
776
if -0x80000000 <= obj <= 0x7fffffff:
777
self.write(INT + repr(obj).encode("ascii") + b'\n')
778
else:
779
self.write(LONG + repr(obj).encode("ascii") + b'L\n')
Jun 7, 2007
Jun 7, 2007
780
dispatch[int] = save_long
Apr 9, 1997
Apr 9, 1997
781
Apr 14, 2013
Apr 14, 2013
782
def save_float(self, obj):
Oct 22, 1998
Oct 22, 1998
783
if self.bin:
Jan 28, 2003
Jan 28, 2003
784
self.write(BINFLOAT + pack('>d', obj))
Oct 22, 1998
Oct 22, 1998
785
else:
Aug 27, 2007
Aug 27, 2007
786
self.write(FLOAT + repr(obj).encode("ascii") + b'\n')
Jun 7, 2007
Jun 7, 2007
787
dispatch[float] = save_float
Apr 9, 1997
Apr 9, 1997
788
Apr 14, 2013
Apr 14, 2013
789
def save_bytes(self, obj):
Mar 17, 2008
Mar 17, 2008
790
if self.proto < 3:
Apr 14, 2013
Apr 14, 2013
791
if not obj: # bytes object is empty
Dec 13, 2011
Dec 13, 2011
792
self.save_reduce(bytes, (), obj=obj)
793
else:
794
self.save_reduce(codecs.encode,
795
(str(obj, 'latin1'), 'latin1'), obj=obj)
Mar 17, 2008
Mar 17, 2008
796
return
797
n = len(obj)
Nov 23, 2013
Nov 23, 2013
798
if n <= 0xff:
Apr 14, 2013
Apr 14, 2013
799
self.write(SHORT_BINBYTES + pack("<B", n) + obj)
Nov 23, 2013
Nov 23, 2013
800
elif n > 0xffffffff and self.proto >= 4:
Jan 6, 2018
Jan 6, 2018
801
self._write_large_bytes(BINBYTES8 + pack("<Q", n), obj)
802
elif n >= self.framer._FRAME_SIZE_TARGET:
803
self._write_large_bytes(BINBYTES + pack("<I", n), obj)
Apr 9, 1997
Apr 9, 1997
804
else:
Apr 14, 2013
Apr 14, 2013
805
self.write(BINBYTES + pack("<I", n) + obj)
Jan 28, 2003
Jan 28, 2003
806
self.memoize(obj)
Mar 17, 2008
Mar 17, 2008
807
dispatch[bytes] = save_bytes
Apr 9, 1997
Apr 9, 1997
808
May 26, 2019
May 26, 2019
809
def save_bytearray(self, obj):
810
if self.proto < 5:
811
if not obj: # bytearray is empty
812
self.save_reduce(bytearray, (), obj=obj)
813
else:
814
self.save_reduce(bytearray, (bytes(obj),), obj=obj)
815
return
816
n = len(obj)
817
if n >= self.framer._FRAME_SIZE_TARGET:
818
self._write_large_bytes(BYTEARRAY8 + pack("<Q", n), obj)
819
else:
820
self.write(BYTEARRAY8 + pack("<Q", n) + obj)
Apr 23, 2021
Apr 23, 2021
821
self.memoize(obj)
May 26, 2019
May 26, 2019
822
dispatch[bytearray] = save_bytearray
823
Jun 13, 2019
Jun 13, 2019
824
if _HAVE_PICKLE_BUFFER:
825
def save_picklebuffer(self, obj):
826
if self.proto < 5:
827
raise PicklingError("PickleBuffer can only pickled with "
828
"protocol >= 5")
829
with obj.raw() as m:
830
if not m.contiguous:
831
raise PicklingError("PickleBuffer can not be pickled when "
832
"pointing to a non-contiguous buffer")
833
in_band = True
834
if self._buffer_callback is not None:
835
in_band = bool(self._buffer_callback(obj))
836
if in_band:
837
# Write data in-band
838
# XXX The C implementation avoids a copy here
839
if m.readonly:
840
self.save_bytes(m.tobytes())
841
else:
842
self.save_bytearray(m.tobytes())
May 26, 2019
May 26, 2019
843
else:
Jun 13, 2019
Jun 13, 2019
844
# Write data out-of-band
845
self.write(NEXT_BUFFER)
846
if m.readonly:
847
self.write(READONLY_BUFFER)
May 26, 2019
May 26, 2019
848
Jun 13, 2019
Jun 13, 2019
849
dispatch[PickleBuffer] = save_picklebuffer
May 26, 2019
May 26, 2019
850
Apr 14, 2013
Apr 14, 2013
851
def save_str(self, obj):
Apr 10, 2001
Apr 10, 2001
852
if self.bin:
Apr 13, 2010
Apr 13, 2010
853
encoded = obj.encode('utf-8', 'surrogatepass')
May 4, 2007
May 4, 2007
854
n = len(encoded)
Nov 23, 2013
Nov 23, 2013
855
if n <= 0xff and self.proto >= 4:
856
self.write(SHORT_BINUNICODE + pack("<B", n) + encoded)
857
elif n > 0xffffffff and self.proto >= 4:
Jan 6, 2018
Jan 6, 2018
858
self._write_large_bytes(BINUNICODE8 + pack("<Q", n), encoded)
859
elif n >= self.framer._FRAME_SIZE_TARGET:
860
self._write_large_bytes(BINUNICODE + pack("<I", n), encoded)
Nov 23, 2013
Nov 23, 2013
861
else:
862
self.write(BINUNICODE + pack("<I", n) + encoded)
Mar 10, 2000
Mar 10, 2000
863
else:
Jan 28, 2003
Jan 28, 2003
864
obj = obj.replace("\\", "\\u005c")
May 31, 2019
May 31, 2019
865
obj = obj.replace("\0", "\\u0000")
Jan 28, 2003
Jan 28, 2003
866
obj = obj.replace("\n", "\\u000a")
May 31, 2019
May 31, 2019
867
obj = obj.replace("\r", "\\u000d")
868
obj = obj.replace("\x1a", "\\u001a") # EOF on DOS
Nov 23, 2013
Nov 23, 2013
869
self.write(UNICODE + obj.encode('raw-unicode-escape') +
870
b'\n')
Jan 28, 2003
Jan 28, 2003
871
self.memoize(obj)
Mar 17, 2008
Mar 17, 2008
872
dispatch[str] = save_str
Feb 9, 2001
Feb 9, 2001
873
Jan 28, 2003
Jan 28, 2003
874
def save_tuple(self, obj):
Apr 14, 2013
Apr 14, 2013
875
if not obj: # tuple is empty
876
if self.bin:
877
self.write(EMPTY_TUPLE)
Feb 2, 2003
Feb 2, 2003
878
else:
Apr 14, 2013
Apr 14, 2013
879
self.write(MARK + TUPLE)
Jan 28, 2003
Jan 28, 2003
880
return
881
Apr 14, 2013
Apr 14, 2013
882
n = len(obj)
Jan 28, 2003
Jan 28, 2003
883
save = self.save
884
memo = self.memo
Apr 14, 2013
Apr 14, 2013
885
if n <= 3 and self.proto >= 2:
Jan 28, 2003
Jan 28, 2003
886
for element in obj:
Jan 28, 2003
Jan 28, 2003
887
save(element)
888
# Subtle. Same as in the big comment below.
Jan 28, 2003
Jan 28, 2003
889
if id(obj) in memo:
890
get = self.get(memo[id(obj)][0])
Apr 14, 2013
Apr 14, 2013
891
self.write(POP * n + get)
Jan 28, 2003
Jan 28, 2003
892
else:
Apr 14, 2013
Apr 14, 2013
893
self.write(_tuplesize2code[n])
Jan 28, 2003
Jan 28, 2003
894
self.memoize(obj)
Jan 28, 2003
Jan 28, 2003
895
return
Apr 9, 1997
Apr 9, 1997
896
Feb 2, 2003
Feb 2, 2003
897
# proto 0 or proto 1 and tuple isn't empty, or proto > 1 and tuple
Jan 28, 2003
Jan 28, 2003
898
# has more than 3 elements.
Apr 14, 2013
Apr 14, 2013
899
write = self.write
Apr 9, 1997
Apr 9, 1997
900
write(MARK)
Jan 28, 2003
Jan 28, 2003
901
for element in obj:
Apr 9, 1997
Apr 9, 1997
902
save(element)
903
Feb 2, 2003
Feb 2, 2003
904
if id(obj) in memo:
Jan 28, 2003
Jan 28, 2003
905
# Subtle. d was not in memo when we entered save_tuple(), so
906
# the process of saving the tuple's elements must have saved
907
# the tuple itself: the tuple is recursive. The proper action
908
# now is to throw away everything we put on the stack, and
909
# simply GET the tuple (it's already constructed). This check
910
# could have been done in the "for element" loop instead, but
911
# recursive tuples are a rare thing.
Jan 28, 2003
Jan 28, 2003
912
get = self.get(memo[id(obj)][0])
Apr 14, 2013
Apr 14, 2013
913
if self.bin:
Jan 28, 2003
Jan 28, 2003
914
write(POP_MARK + get)
915
else: # proto 0 -- POP_MARK not available
Jan 28, 2003
Jan 28, 2003
916
write(POP * (n+1) + get)
Apr 9, 1997
Apr 9, 1997
917
return
918
Feb 2, 2003
Feb 2, 2003
919
# No recursion.
Apr 14, 2013
Apr 14, 2013
920
write(TUPLE)
Feb 2, 2003
Feb 2, 2003
921
self.memoize(obj)
Jan 24, 2003
Jan 24, 2003
922
Jun 7, 2007
Jun 7, 2007
923
dispatch[tuple] = save_tuple
Apr 9, 1997
Apr 9, 1997
924
Jan 28, 2003
Jan 28, 2003
925
def save_list(self, obj):
Apr 10, 2001
Apr 10, 2001
926
if self.bin:
Apr 14, 2013
Apr 14, 2013
927
self.write(EMPTY_LIST)
Jan 31, 2003
Jan 31, 2003
928
else: # proto 0 -- can't use EMPTY_LIST
Apr 14, 2013
Apr 14, 2013
929
self.write(MARK + LIST)
Jan 31, 2003
Jan 31, 2003
930
931
self.memoize(obj)
May 14, 2008
May 14, 2008
932
self._batch_appends(obj)
Jan 31, 2003
Jan 31, 2003
933
Jun 7, 2007
Jun 7, 2007
934
dispatch[list] = save_list
Jan 31, 2003
Jan 31, 2003
935
936
_BATCHSIZE = 1000
937
938
def _batch_appends(self, items):
939
# Helper to batch up APPENDS sequences
940
save = self.save
941
write = self.write
942
943
if not self.bin:
944
for x in items:
945
save(x)
946
write(APPEND)
947
return
948
Apr 14, 2013
Apr 14, 2013
949
it = iter(items)
950
while True:
951
tmp = list(islice(it, self._BATCHSIZE))
Jan 31, 2003
Jan 31, 2003
952
n = len(tmp)
Jan 28, 2003
Jan 28, 2003
953
if n > 1:
954
write(MARK)
Jan 31, 2003
Jan 31, 2003
955
for x in tmp:
956
save(x)
Jan 28, 2003
Jan 28, 2003
957
write(APPENDS)
958
elif n:
Jan 31, 2003
Jan 31, 2003
959
save(tmp[0])
Jan 28, 2003
Jan 28, 2003
960
write(APPEND)
Jan 31, 2003
Jan 31, 2003
961
# else tmp is empty, and we're done
Apr 14, 2013
Apr 14, 2013
962
if n < self._BATCHSIZE:
963
return
Apr 9, 1997
Apr 9, 1997
964
Jan 28, 2003
Jan 28, 2003
965
def save_dict(self, obj):
Apr 10, 2001
Apr 10, 2001
966
if self.bin:
Apr 14, 2013
Apr 14, 2013
967
self.write(EMPTY_DICT)
Jan 31, 2003
Jan 31, 2003
968
else: # proto 0 -- can't use EMPTY_DICT
Apr 14, 2013
Apr 14, 2013
969
self.write(MARK + DICT)
Apr 9, 1997
Apr 9, 1997
970
Jan 31, 2003
Jan 31, 2003
971
self.memoize(obj)
May 14, 2008
May 14, 2008
972
self._batch_setitems(obj.items())
Apr 9, 1997
Apr 9, 1997
973
Jun 7, 2007
Jun 7, 2007
974
dispatch[dict] = save_dict
975
if PyStringMap is not None:
May 27, 1998
May 27, 1998
976
dispatch[PyStringMap] = save_dict
Apr 9, 1997
Apr 9, 1997
977
Jan 31, 2003
Jan 31, 2003
978
def _batch_setitems(self, items):
979
# Helper to batch up SETITEMS sequences; proto >= 1 only
980
save = self.save
981
write = self.write
982
983
if not self.bin:
984
for k, v in items:
985
save(k)
986
save(v)
987
write(SETITEM)
988
return
989
Apr 14, 2013
Apr 14, 2013
990
it = iter(items)
991
while True:
992
tmp = list(islice(it, self._BATCHSIZE))
Jan 31, 2003
Jan 31, 2003
993
n = len(tmp)
994
if n > 1:
995
write(MARK)
996
for k, v in tmp:
997
save(k)
998
save(v)
999
write(SETITEMS)
1000
elif n: