blob: 301e8cf55893dda7560ee978bff5c96bb77bf52e [file] [log] [blame]
Guido van Rossum54f22ed2000-02-04 15:10:34 +00001"""Create portable serialized representations of Python objects.
Guido van Rossuma48061a1995-01-10 00:31:14 +00002
Alexandre Vassalottif7fa63d2008-05-11 08:55:36 +00003See module copyreg for a mechanism for registering custom picklers.
Tim Peters22a449a2003-01-27 20:16:36 +00004See module pickletools source for extensive comments.
Guido van Rossuma48061a1995-01-10 00:31:14 +00005
Guido van Rossume467be61997-12-05 19:42:42 +00006Classes:
Guido van Rossuma48061a1995-01-10 00:31:14 +00007
Guido van Rossume467be61997-12-05 19:42:42 +00008 Pickler
9 Unpickler
Guido van Rossuma48061a1995-01-10 00:31:14 +000010
Guido van Rossume467be61997-12-05 19:42:42 +000011Functions:
Guido van Rossuma48061a1995-01-10 00:31:14 +000012
Guido van Rossume467be61997-12-05 19:42:42 +000013 dump(object, file)
14 dumps(object) -> string
15 load(file) -> object
16 loads(string) -> object
Guido van Rossuma48061a1995-01-10 00:31:14 +000017
Guido van Rossume467be61997-12-05 19:42:42 +000018Misc variables:
Guido van Rossuma48061a1995-01-10 00:31:14 +000019
Fred Drakefe82acc1998-02-13 03:24:48 +000020 __version__
Guido van Rossume467be61997-12-05 19:42:42 +000021 format_version
22 compatible_formats
Guido van Rossuma48061a1995-01-10 00:31:14 +000023
Guido van Rossuma48061a1995-01-10 00:31:14 +000024"""
25
Victor Stinner7fa767e2014-03-20 09:16:38 +010026from types import FunctionType
Alexandre Vassalottif7fa63d2008-05-11 08:55:36 +000027from copyreg import dispatch_table
28from copyreg import _extension_registry, _inverted_registry, _extension_cache
Serhiy Storchakaa3e32c92013-04-14 13:37:02 +030029from itertools import islice
Serhiy Storchaka0d554d72015-10-10 22:42:18 +030030from functools import partial
Guido van Rossumd3703791998-10-22 20:15:36 +000031import sys
Serhiy Storchakaa3e32c92013-04-14 13:37:02 +030032from sys import maxsize
33from struct import pack, unpack
Skip Montanaro23bafc62001-02-18 03:10:09 +000034import re
Guido van Rossum2e6a4b32007-05-04 19:56:22 +000035import io
Walter Dörwald42748a82007-06-12 16:40:17 +000036import codecs
Antoine Pitroud9dfaa92009-06-04 20:32:06 +000037import _compat_pickle
Guido van Rossuma48061a1995-01-10 00:31:14 +000038
Skip Montanaro352674d2001-02-07 23:14:30 +000039__all__ = ["PickleError", "PicklingError", "UnpicklingError", "Pickler",
40 "Unpickler", "dump", "dumps", "load", "loads"]
41
Guido van Rossum98297ee2007-11-06 21:34:58 +000042# Shortcut for use in isinstance testing
Alexandre Vassalotti8cb02b62008-05-03 01:42:49 +000043bytes_types = (bytes, bytearray)
Guido van Rossum98297ee2007-11-06 21:34:58 +000044
Tim Petersc0c12b52003-01-29 00:56:17 +000045# These are purely informational; no code uses these.
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +010046format_version = "4.0" # File format version we write
Guido van Rossumf29d3d62003-01-27 22:47:53 +000047compatible_formats = ["1.0", # Original protocol 0
Guido van Rossumbc64e222003-01-28 16:34:19 +000048 "1.1", # Protocol 0 with INST added
Guido van Rossumf29d3d62003-01-27 22:47:53 +000049 "1.2", # Original protocol 1
50 "1.3", # Protocol 1 with BINFLOAT added
51 "2.0", # Protocol 2
Guido van Rossumf4169812008-03-17 22:56:06 +000052 "3.0", # Protocol 3
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +010053 "4.0", # Protocol 4
Guido van Rossumf29d3d62003-01-27 22:47:53 +000054 ] # Old format versions we can read
Guido van Rossumb72cf2d1997-04-09 17:32:51 +000055
Guido van Rossum99603b02007-07-20 00:22:32 +000056# This is the highest protocol number we know how to read.
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +010057HIGHEST_PROTOCOL = 4
Tim Peters8587b3c2003-02-13 15:44:41 +000058
Guido van Rossum2e6a4b32007-05-04 19:56:22 +000059# The protocol we write by default. May be less than HIGHEST_PROTOCOL.
Guido van Rossumf4169812008-03-17 22:56:06 +000060# We intentionally write a protocol that Python 2.x cannot read;
61# there are too many issues with that.
62DEFAULT_PROTOCOL = 3
Guido van Rossum2e6a4b32007-05-04 19:56:22 +000063
Raymond Hettingeraef22fb2002-05-29 16:18:42 +000064class PickleError(Exception):
Neal Norwitzefbb67b2002-05-30 12:12:04 +000065 """A common base class for the other pickling exceptions."""
Raymond Hettingeraef22fb2002-05-29 16:18:42 +000066 pass
67
68class PicklingError(PickleError):
69 """This exception is raised when an unpicklable object is passed to the
70 dump() method.
71
72 """
73 pass
74
75class UnpicklingError(PickleError):
76 """This exception is raised when there is a problem unpickling an object,
77 such as a security violation.
78
79 Note that other exceptions may also be raised during unpickling, including
80 (but not necessarily limited to) AttributeError, EOFError, ImportError,
81 and IndexError.
82
83 """
84 pass
Guido van Rossum7849da81995-03-09 14:08:35 +000085
Tim Petersc0c12b52003-01-29 00:56:17 +000086# An instance of _Stop is raised by Unpickler.load_stop() in response to
87# the STOP opcode, passing the object that is the result of unpickling.
Guido van Rossumff871742000-12-13 18:11:56 +000088class _Stop(Exception):
89 def __init__(self, value):
90 self.value = value
91
Guido van Rossum533dbcf2003-01-28 17:55:05 +000092# Jython has PyStringMap; it's a dict subclass with string keys
Jeremy Hylton2b9d0291998-05-27 22:38:22 +000093try:
94 from org.python.core import PyStringMap
Brett Cannoncd171c82013-07-04 17:43:24 -040095except ImportError:
Jeremy Hylton2b9d0291998-05-27 22:38:22 +000096 PyStringMap = None
97
Tim Peters22a449a2003-01-27 20:16:36 +000098# Pickle opcodes. See pickletools.py for extensive docs. The listing
99# here is in kind-of alphabetical order of 1-character pickle code.
100# pickletools groups them by purpose.
Guido van Rossumdbb718f2001-09-21 19:22:34 +0000101
Guido van Rossum2e6a4b32007-05-04 19:56:22 +0000102MARK = b'(' # push special markobject on stack
103STOP = b'.' # every pickle ends with STOP
104POP = b'0' # discard topmost stack item
105POP_MARK = b'1' # discard stack top through topmost markobject
106DUP = b'2' # duplicate top stack item
107FLOAT = b'F' # push float object; decimal string argument
108INT = b'I' # push integer or bool; decimal string argument
109BININT = b'J' # push four-byte signed int
110BININT1 = b'K' # push 1-byte unsigned int
111LONG = b'L' # push long; decimal string argument
112BININT2 = b'M' # push 2-byte unsigned int
113NONE = b'N' # push None
114PERSID = b'P' # push persistent object; id is taken from string arg
115BINPERSID = b'Q' # " " " ; " " " " stack
116REDUCE = b'R' # apply callable to argtuple, both on stack
117STRING = b'S' # push string; NL-terminated string argument
118BINSTRING = b'T' # push string; counted binary string argument
119SHORT_BINSTRING= b'U' # " " ; " " " " < 256 bytes
120UNICODE = b'V' # push Unicode string; raw-unicode-escaped'd argument
121BINUNICODE = b'X' # " " " ; counted UTF-8 string argument
122APPEND = b'a' # append stack top to list below it
123BUILD = b'b' # call __setstate__ or __dict__.update()
124GLOBAL = b'c' # push self.find_class(modname, name); 2 string args
125DICT = b'd' # build a dict from stack items
126EMPTY_DICT = b'}' # push empty dict
127APPENDS = b'e' # extend list on stack by topmost stack slice
128GET = b'g' # push item from memo on stack; index is string arg
129BINGET = b'h' # " " " " " " ; " " 1-byte arg
130INST = b'i' # build & push class instance
131LONG_BINGET = b'j' # push item from memo on stack; index is 4-byte arg
132LIST = b'l' # build list from topmost stack items
133EMPTY_LIST = b']' # push empty list
134OBJ = b'o' # build & push class instance
135PUT = b'p' # store stack top in memo; index is string arg
136BINPUT = b'q' # " " " " " ; " " 1-byte arg
137LONG_BINPUT = b'r' # " " " " " ; " " 4-byte arg
138SETITEM = b's' # add key+value pair to dict
139TUPLE = b't' # build tuple from topmost stack items
140EMPTY_TUPLE = b')' # push empty tuple
141SETITEMS = b'u' # modify dict by adding topmost key+value pairs
142BINFLOAT = b'G' # push float; arg is 8-byte float encoding
Tim Peters22a449a2003-01-27 20:16:36 +0000143
Guido van Rossum2e6a4b32007-05-04 19:56:22 +0000144TRUE = b'I01\n' # not an opcode; see INT docs in pickletools.py
145FALSE = b'I00\n' # not an opcode; see INT docs in pickletools.py
Guido van Rossum77f6a652002-04-03 22:41:51 +0000146
Guido van Rossum586c9e82003-01-29 06:16:12 +0000147# Protocol 2
Guido van Rossum5a2d8f52003-01-27 21:44:25 +0000148
Guido van Rossum2e6a4b32007-05-04 19:56:22 +0000149PROTO = b'\x80' # identify pickle protocol
150NEWOBJ = b'\x81' # build object by applying cls.__new__ to argtuple
151EXT1 = b'\x82' # push object from extension registry; 1-byte index
152EXT2 = b'\x83' # ditto, but 2-byte index
153EXT4 = b'\x84' # ditto, but 4-byte index
154TUPLE1 = b'\x85' # build 1-tuple from stack top
155TUPLE2 = b'\x86' # build 2-tuple from two topmost stack items
156TUPLE3 = b'\x87' # build 3-tuple from three topmost stack items
157NEWTRUE = b'\x88' # push True
158NEWFALSE = b'\x89' # push False
159LONG1 = b'\x8a' # push long from < 256 bytes
160LONG4 = b'\x8b' # push really big long
Guido van Rossum5a2d8f52003-01-27 21:44:25 +0000161
Guido van Rossum44f0ea52003-01-28 04:14:51 +0000162_tuplesize2code = [EMPTY_TUPLE, TUPLE1, TUPLE2, TUPLE3]
163
Guido van Rossumf4169812008-03-17 22:56:06 +0000164# Protocol 3 (Python 3.x)
165
166BINBYTES = b'B' # push bytes; counted binary string argument
167SHORT_BINBYTES = b'C' # " " ; " " " " < 256 bytes
Guido van Rossuma48061a1995-01-10 00:31:14 +0000168
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +0100169# Protocol 4
170SHORT_BINUNICODE = b'\x8c' # push short string; UTF-8 length < 256 bytes
171BINUNICODE8 = b'\x8d' # push very long string
172BINBYTES8 = b'\x8e' # push very long bytes string
173EMPTY_SET = b'\x8f' # push empty set on the stack
174ADDITEMS = b'\x90' # modify set by adding topmost stack items
175FROZENSET = b'\x91' # build frozenset from topmost stack items
176NEWOBJ_EX = b'\x92' # like NEWOBJ but work with keyword only arguments
177STACK_GLOBAL = b'\x93' # same as GLOBAL but using names on the stacks
178MEMOIZE = b'\x94' # store top of the stack in memo
179FRAME = b'\x95' # indicate the beginning of a new frame
180
181__all__.extend([x for x in dir() if re.match("[A-Z][A-Z0-9_]+$", x)])
182
183
184class _Framer:
185
186 _FRAME_SIZE_TARGET = 64 * 1024
187
188 def __init__(self, file_write):
189 self.file_write = file_write
190 self.current_frame = None
191
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +0100192 def start_framing(self):
193 self.current_frame = io.BytesIO()
194
195 def end_framing(self):
Alexandre Vassalottib6a2f2a2013-11-23 20:30:03 -0800196 if self.current_frame and self.current_frame.tell() > 0:
197 self.commit_frame(force=True)
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +0100198 self.current_frame = None
199
Alexandre Vassalottib6a2f2a2013-11-23 20:30:03 -0800200 def commit_frame(self, force=False):
201 if self.current_frame:
202 f = self.current_frame
203 if f.tell() >= self._FRAME_SIZE_TARGET or force:
Olivier Grisel3cd7c6e2018-01-06 16:18:54 +0100204 data = f.getbuffer()
205 write = self.file_write
206 # Issue a single call to the write method of the underlying
207 # file object for the frame opcode with the size of the
208 # frame. The concatenation is expected to be less expensive
209 # than issuing an additional call to write.
210 write(FRAME + pack("<Q", len(data)))
211
212 # Issue a separate call to write to append the frame
213 # contents without concatenation to the above to avoid a
214 # memory copy.
215 write(data)
216
217 # Start the new frame with a new io.BytesIO instance so that
218 # the file object can have delayed access to the previous frame
219 # contents via an unreleased memoryview of the previous
220 # io.BytesIO instance.
221 self.current_frame = io.BytesIO()
Alexandre Vassalottib6a2f2a2013-11-23 20:30:03 -0800222
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +0100223 def write(self, data):
Alexandre Vassalottib6a2f2a2013-11-23 20:30:03 -0800224 if self.current_frame:
225 return self.current_frame.write(data)
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +0100226 else:
Alexandre Vassalottib6a2f2a2013-11-23 20:30:03 -0800227 return self.file_write(data)
228
Olivier Grisel3cd7c6e2018-01-06 16:18:54 +0100229 def write_large_bytes(self, header, payload):
230 write = self.file_write
231 if self.current_frame:
232 # Terminate the current frame and flush it to the file.
233 self.commit_frame(force=True)
234
235 # Perform direct write of the header and payload of the large binary
236 # object. Be careful not to concatenate the header and the payload
237 # prior to calling 'write' as we do not want to allocate a large
238 # temporary bytes object.
239 # We intentionally do not insert a protocol 4 frame opcode to make
240 # it possible to optimize file.read calls in the loader.
241 write(header)
242 write(payload)
243
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +0100244
245class _Unframer:
246
247 def __init__(self, file_read, file_readline, file_tell=None):
248 self.file_read = file_read
249 self.file_readline = file_readline
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +0100250 self.current_frame = None
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +0100251
252 def read(self, n):
Alexandre Vassalottib6a2f2a2013-11-23 20:30:03 -0800253 if self.current_frame:
254 data = self.current_frame.read(n)
255 if not data and n != 0:
256 self.current_frame = None
257 return self.file_read(n)
258 if len(data) < n:
259 raise UnpicklingError(
260 "pickle exhausted before end of frame")
261 return data
262 else:
263 return self.file_read(n)
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +0100264
265 def readline(self):
Alexandre Vassalottib6a2f2a2013-11-23 20:30:03 -0800266 if self.current_frame:
267 data = self.current_frame.readline()
268 if not data:
269 self.current_frame = None
270 return self.file_readline()
Serhiy Storchaka21d75332015-01-26 10:37:01 +0200271 if data[-1] != b'\n'[0]:
Alexandre Vassalottib6a2f2a2013-11-23 20:30:03 -0800272 raise UnpicklingError(
273 "pickle exhausted before end of frame")
274 return data
275 else:
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +0100276 return self.file_readline()
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +0100277
Alexandre Vassalottib6a2f2a2013-11-23 20:30:03 -0800278 def load_frame(self, frame_size):
279 if self.current_frame and self.current_frame.read() != b'':
280 raise UnpicklingError(
281 "beginning of a new frame before end of current frame")
282 self.current_frame = io.BytesIO(self.file_read(frame_size))
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +0100283
284
285# Tools used for pickling.
286
Serhiy Storchaka58e41342015-03-31 14:07:24 +0300287def _getattribute(obj, name):
288 for subpath in name.split('.'):
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +0100289 if subpath == '<locals>':
290 raise AttributeError("Can't get local attribute {!r} on {!r}"
291 .format(name, obj))
292 try:
Serhiy Storchaka58e41342015-03-31 14:07:24 +0300293 parent = obj
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +0100294 obj = getattr(obj, subpath)
295 except AttributeError:
296 raise AttributeError("Can't get attribute {!r} on {!r}"
Serhiy Storchaka5affd232017-04-05 09:37:24 +0300297 .format(name, obj)) from None
Serhiy Storchaka58e41342015-03-31 14:07:24 +0300298 return obj, parent
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +0100299
Serhiy Storchaka58e41342015-03-31 14:07:24 +0300300def whichmodule(obj, name):
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +0100301 """Find the module an object belong to."""
302 module_name = getattr(obj, '__module__', None)
303 if module_name is not None:
304 return module_name
Antoine Pitroue1618492014-10-04 22:15:27 +0200305 # Protect the iteration by using a list copy of sys.modules against dynamic
306 # modules that trigger imports of other modules upon calls to getattr.
307 for module_name, module in list(sys.modules.items()):
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +0100308 if module_name == '__main__' or module is None:
309 continue
310 try:
Serhiy Storchaka58e41342015-03-31 14:07:24 +0300311 if _getattribute(module, name)[0] is obj:
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +0100312 return module_name
313 except AttributeError:
314 pass
315 return '__main__'
316
317def encode_long(x):
318 r"""Encode a long to a two's complement little-endian binary string.
319 Note that 0 is a special case, returning an empty string, to save a
320 byte in the LONG1 pickling context.
321
322 >>> encode_long(0)
323 b''
324 >>> encode_long(255)
325 b'\xff\x00'
326 >>> encode_long(32767)
327 b'\xff\x7f'
328 >>> encode_long(-256)
329 b'\x00\xff'
330 >>> encode_long(-32768)
331 b'\x00\x80'
332 >>> encode_long(-128)
333 b'\x80'
334 >>> encode_long(127)
335 b'\x7f'
336 >>>
337 """
338 if x == 0:
339 return b''
340 nbytes = (x.bit_length() >> 3) + 1
341 result = x.to_bytes(nbytes, byteorder='little', signed=True)
342 if x < 0 and nbytes > 1:
343 if result[-1] == 0xff and (result[-2] & 0x80) != 0:
344 result = result[:-1]
345 return result
346
347def decode_long(data):
348 r"""Decode a long from a two's complement little-endian binary string.
349
350 >>> decode_long(b'')
351 0
352 >>> decode_long(b"\xff\x00")
353 255
354 >>> decode_long(b"\xff\x7f")
355 32767
356 >>> decode_long(b"\x00\xff")
357 -256
358 >>> decode_long(b"\x00\x80")
359 -32768
360 >>> decode_long(b"\x80")
361 -128
362 >>> decode_long(b"\x7f")
363 127
364 """
365 return int.from_bytes(data, byteorder='little', signed=True)
366
Skip Montanaro23bafc62001-02-18 03:10:09 +0000367
Guido van Rossum1be31752003-01-28 15:19:53 +0000368# Pickling machinery
369
Alexandre Vassalottica2d6102008-06-12 18:26:05 +0000370class _Pickler:
Guido van Rossuma48061a1995-01-10 00:31:14 +0000371
Antoine Pitroud9dfaa92009-06-04 20:32:06 +0000372 def __init__(self, file, protocol=None, *, fix_imports=True):
Guido van Rossum2e6a4b32007-05-04 19:56:22 +0000373 """This takes a binary file for writing a pickle data stream.
374
Alexandre Vassalottid05c9ff2013-12-07 01:09:27 -0800375 The optional *protocol* argument tells the pickler to use the
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +0100376 given protocol; supported protocols are 0, 1, 2, 3 and 4. The
Alexandre Vassalottid05c9ff2013-12-07 01:09:27 -0800377 default protocol is 3; a backward-incompatible protocol designed
378 for Python 3.
Guido van Rossumf29d3d62003-01-27 22:47:53 +0000379
Guido van Rossum7eff63a2003-01-31 19:42:31 +0000380 Specifying a negative protocol version selects the highest
Tim Peters5bd2a792003-02-01 16:45:06 +0000381 protocol version supported. The higher the protocol used, the
382 more recent the version of Python needed to read the pickle
383 produced.
Raymond Hettingeraef22fb2002-05-29 16:18:42 +0000384
Alexandre Vassalottid05c9ff2013-12-07 01:09:27 -0800385 The *file* argument must have a write() method that accepts a
386 single bytes argument. It can thus be a file object opened for
Martin Panter7462b6492015-11-02 03:37:02 +0000387 binary writing, an io.BytesIO instance, or any other custom
Alexandre Vassalottid05c9ff2013-12-07 01:09:27 -0800388 object that meets this interface.
Antoine Pitroud9dfaa92009-06-04 20:32:06 +0000389
Alexandre Vassalottid05c9ff2013-12-07 01:09:27 -0800390 If *fix_imports* is True and *protocol* is less than 3, pickle
391 will try to map the new Python 3 names to the old module names
392 used in Python 2, so that the pickle data stream is readable
393 with Python 2.
Raymond Hettingeraef22fb2002-05-29 16:18:42 +0000394 """
Guido van Rossumcf117b02003-02-09 17:19:41 +0000395 if protocol is None:
Guido van Rossum2e6a4b32007-05-04 19:56:22 +0000396 protocol = DEFAULT_PROTOCOL
Guido van Rossumcf117b02003-02-09 17:19:41 +0000397 if protocol < 0:
Tim Peters8587b3c2003-02-13 15:44:41 +0000398 protocol = HIGHEST_PROTOCOL
399 elif not 0 <= protocol <= HIGHEST_PROTOCOL:
400 raise ValueError("pickle protocol must be <= %d" % HIGHEST_PROTOCOL)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +0000401 try:
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +0100402 self._file_write = file.write
Alexandre Vassalottica2d6102008-06-12 18:26:05 +0000403 except AttributeError:
404 raise TypeError("file must have a 'write' attribute")
Alexandre Vassalottib6a2f2a2013-11-23 20:30:03 -0800405 self.framer = _Framer(self._file_write)
406 self.write = self.framer.write
Olivier Grisel3cd7c6e2018-01-06 16:18:54 +0100407 self._write_large_bytes = self.framer.write_large_bytes
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000408 self.memo = {}
Guido van Rossumcf117b02003-02-09 17:19:41 +0000409 self.proto = int(protocol)
410 self.bin = protocol >= 1
Guido van Rossum5d9113d2003-01-29 17:58:45 +0000411 self.fast = 0
Antoine Pitroud9dfaa92009-06-04 20:32:06 +0000412 self.fix_imports = fix_imports and protocol < 3
Guido van Rossuma48061a1995-01-10 00:31:14 +0000413
Fred Drake7f781c92002-05-01 20:33:53 +0000414 def clear_memo(self):
Raymond Hettingeraef22fb2002-05-29 16:18:42 +0000415 """Clears the pickler's "memo".
416
417 The memo is the data structure that remembers which objects the
Alexandre Vassalottid05c9ff2013-12-07 01:09:27 -0800418 pickler has already seen, so that shared or recursive objects
419 are pickled by reference and not by value. This method is
420 useful when re-using picklers.
Raymond Hettingeraef22fb2002-05-29 16:18:42 +0000421 """
Fred Drake7f781c92002-05-01 20:33:53 +0000422 self.memo.clear()
423
Guido van Rossum3a41c612003-01-28 15:10:22 +0000424 def dump(self, obj):
Tim Peters5bd2a792003-02-01 16:45:06 +0000425 """Write a pickled representation of obj to the open file."""
Alexandre Vassalotti3cfcab92008-12-27 09:30:39 +0000426 # Check whether Pickler was initialized correctly. This is
427 # only needed to mimic the behavior of _pickle.Pickler.dump().
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +0100428 if not hasattr(self, "_file_write"):
Alexandre Vassalotti3cfcab92008-12-27 09:30:39 +0000429 raise PicklingError("Pickler.__init__() was not called by "
430 "%s.__init__()" % (self.__class__.__name__,))
Guido van Rossumd6c9e632003-01-28 03:49:52 +0000431 if self.proto >= 2:
Alexandre Vassalottib6a2f2a2013-11-23 20:30:03 -0800432 self.write(PROTO + pack("<B", self.proto))
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +0100433 if self.proto >= 4:
Alexandre Vassalottib6a2f2a2013-11-23 20:30:03 -0800434 self.framer.start_framing()
Guido van Rossum3a41c612003-01-28 15:10:22 +0000435 self.save(obj)
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000436 self.write(STOP)
Alexandre Vassalottib6a2f2a2013-11-23 20:30:03 -0800437 self.framer.end_framing()
Guido van Rossuma48061a1995-01-10 00:31:14 +0000438
Jeremy Hylton3422c992003-01-24 19:29:52 +0000439 def memoize(self, obj):
440 """Store an object in the memo."""
441
Tim Peterse46b73f2003-01-27 21:22:10 +0000442 # The Pickler memo is a dictionary mapping object ids to 2-tuples
443 # that contain the Unpickler memo key and the object being memoized.
444 # The memo key is written to the pickle and will become
Jeremy Hylton3422c992003-01-24 19:29:52 +0000445 # the key in the Unpickler's memo. The object is stored in the
Tim Peterse46b73f2003-01-27 21:22:10 +0000446 # Pickler memo so that transient objects are kept alive during
447 # pickling.
Jeremy Hylton3422c992003-01-24 19:29:52 +0000448
Tim Peterse46b73f2003-01-27 21:22:10 +0000449 # The use of the Unpickler memo length as the memo key is just a
450 # convention. The only requirement is that the memo values be unique.
451 # But there appears no advantage to any other scheme, and this
Tim Peterscbd0a322003-01-28 00:24:43 +0000452 # scheme allows the Unpickler memo to be implemented as a plain (but
Tim Peterse46b73f2003-01-27 21:22:10 +0000453 # growable) array, indexed by memo key.
Guido van Rossum5d9113d2003-01-29 17:58:45 +0000454 if self.fast:
455 return
Guido van Rossum9b40e802003-01-30 06:37:41 +0000456 assert id(obj) not in self.memo
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +0100457 idx = len(self.memo)
458 self.write(self.put(idx))
459 self.memo[id(obj)] = idx, obj
Jeremy Hylton3422c992003-01-24 19:29:52 +0000460
Tim Petersbb38e302003-01-27 21:25:41 +0000461 # Return a PUT (BINPUT, LONG_BINPUT) opcode string, with argument i.
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +0100462 def put(self, idx):
463 if self.proto >= 4:
464 return MEMOIZE
465 elif self.bin:
466 if idx < 256:
467 return BINPUT + pack("<B", idx)
Guido van Rossum5c938d02003-01-28 03:03:08 +0000468 else:
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +0100469 return LONG_BINPUT + pack("<I", idx)
470 else:
471 return PUT + repr(idx).encode("ascii") + b'\n'
Guido van Rossuma48061a1995-01-10 00:31:14 +0000472
Tim Petersbb38e302003-01-27 21:25:41 +0000473 # Return a GET (BINGET, LONG_BINGET) opcode string, with argument i.
Serhiy Storchakaa3e32c92013-04-14 13:37:02 +0300474 def get(self, i):
Tim Petersc32d8242001-04-10 02:48:53 +0000475 if self.bin:
Tim Petersc32d8242001-04-10 02:48:53 +0000476 if i < 256:
Serhiy Storchakaa3e32c92013-04-14 13:37:02 +0300477 return BINGET + pack("<B", i)
Guido van Rossum5c938d02003-01-28 03:03:08 +0000478 else:
Antoine Pitroubf6ecf92012-11-24 20:40:21 +0100479 return LONG_BINGET + pack("<I", i)
Guido van Rossuma48061a1995-01-10 00:31:14 +0000480
Guido van Rossum39478e82007-08-27 17:23:59 +0000481 return GET + repr(i).encode("ascii") + b'\n'
Tim Peters2344fae2001-01-15 00:50:52 +0000482
Alexandre Vassalottica2d6102008-06-12 18:26:05 +0000483 def save(self, obj, save_persistent_id=True):
Alexandre Vassalottib6a2f2a2013-11-23 20:30:03 -0800484 self.framer.commit_frame()
485
Guido van Rossumbc64e222003-01-28 16:34:19 +0000486 # Check for persistent id (defined by a subclass)
Guido van Rossum3a41c612003-01-28 15:10:22 +0000487 pid = self.persistent_id(obj)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +0000488 if pid is not None and save_persistent_id:
Jeremy Hylton5e0f4e72002-11-13 22:01:27 +0000489 self.save_pers(pid)
490 return
Guido van Rossuma48061a1995-01-10 00:31:14 +0000491
Guido van Rossumbc64e222003-01-28 16:34:19 +0000492 # Check the memo
493 x = self.memo.get(id(obj))
Serhiy Storchakaa3e32c92013-04-14 13:37:02 +0300494 if x is not None:
Guido van Rossumbc64e222003-01-28 16:34:19 +0000495 self.write(self.get(x[0]))
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000496 return
497
Guido van Rossumbc64e222003-01-28 16:34:19 +0000498 # Check the type dispatch table
Guido van Rossum3a41c612003-01-28 15:10:22 +0000499 t = type(obj)
Guido van Rossumbc64e222003-01-28 16:34:19 +0000500 f = self.dispatch.get(t)
Serhiy Storchakaa3e32c92013-04-14 13:37:02 +0300501 if f is not None:
Guido van Rossumbc64e222003-01-28 16:34:19 +0000502 f(self, obj) # Call unbound method with explicit self
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000503 return
504
Antoine Pitrou8d3c2902012-03-04 18:31:48 +0100505 # Check private dispatch table if any, or else copyreg.dispatch_table
506 reduce = getattr(self, 'dispatch_table', dispatch_table).get(t)
Serhiy Storchakaa3e32c92013-04-14 13:37:02 +0300507 if reduce is not None:
Guido van Rossumc53f0092003-02-18 22:05:12 +0000508 rv = reduce(obj)
509 else:
Antoine Pitrouffd41d92011-10-04 09:23:04 +0200510 # Check for a class with a custom metaclass; treat as regular class
511 try:
512 issc = issubclass(t, type)
513 except TypeError: # t is not a class (old Boost; see SF #502085)
514 issc = False
515 if issc:
516 self.save_global(obj)
517 return
518
Guido van Rossumc53f0092003-02-18 22:05:12 +0000519 # Check for a __reduce_ex__ method, fall back to __reduce__
520 reduce = getattr(obj, "__reduce_ex__", None)
Serhiy Storchakaa3e32c92013-04-14 13:37:02 +0300521 if reduce is not None:
Guido van Rossumc53f0092003-02-18 22:05:12 +0000522 rv = reduce(self.proto)
523 else:
524 reduce = getattr(obj, "__reduce__", None)
Serhiy Storchakaa3e32c92013-04-14 13:37:02 +0300525 if reduce is not None:
Guido van Rossumc53f0092003-02-18 22:05:12 +0000526 rv = reduce()
527 else:
528 raise PicklingError("Can't pickle %r object: %r" %
529 (t.__name__, obj))
Tim Petersb32a8312003-01-28 00:48:09 +0000530
Guido van Rossumbc64e222003-01-28 16:34:19 +0000531 # Check for string returned by reduce(), meaning "save as global"
Guido van Rossum3172c5d2007-10-16 18:12:55 +0000532 if isinstance(rv, str):
Guido van Rossumbc64e222003-01-28 16:34:19 +0000533 self.save_global(obj, rv)
Tim Petersb32a8312003-01-28 00:48:09 +0000534 return
535
Guido van Rossumbc64e222003-01-28 16:34:19 +0000536 # Assert that reduce() returned a tuple
Guido van Rossum13257902007-06-07 23:15:56 +0000537 if not isinstance(rv, tuple):
Guido van Rossumbc64e222003-01-28 16:34:19 +0000538 raise PicklingError("%s must return string or tuple" % reduce)
Tim Petersb32a8312003-01-28 00:48:09 +0000539
Guido van Rossum25cb7df2003-01-31 18:53:21 +0000540 # Assert that it returned an appropriately sized tuple
Guido van Rossumbc64e222003-01-28 16:34:19 +0000541 l = len(rv)
Guido van Rossum25cb7df2003-01-31 18:53:21 +0000542 if not (2 <= l <= 5):
Guido van Rossumbc64e222003-01-28 16:34:19 +0000543 raise PicklingError("Tuple returned by %s must have "
Guido van Rossum25cb7df2003-01-31 18:53:21 +0000544 "two to five elements" % reduce)
Tim Petersb32a8312003-01-28 00:48:09 +0000545
Guido van Rossumbc64e222003-01-28 16:34:19 +0000546 # Save the reduce() output and finally memoize the object
Guido van Rossum25cb7df2003-01-31 18:53:21 +0000547 self.save_reduce(obj=obj, *rv)
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000548
Guido van Rossum3a41c612003-01-28 15:10:22 +0000549 def persistent_id(self, obj):
Guido van Rossumbc64e222003-01-28 16:34:19 +0000550 # This exists so a subclass can override it
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000551 return None
552
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000553 def save_pers(self, pid):
Guido van Rossumbc64e222003-01-28 16:34:19 +0000554 # Save a persistent id reference
Tim Petersbd1cdb92003-01-28 01:03:10 +0000555 if self.bin:
Alexandre Vassalottica2d6102008-06-12 18:26:05 +0000556 self.save(pid, save_persistent_id=False)
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000557 self.write(BINPERSID)
Tim Petersbd1cdb92003-01-28 01:03:10 +0000558 else:
Serhiy Storchakadec25af2016-07-17 11:24:17 +0300559 try:
560 self.write(PERSID + str(pid).encode("ascii") + b'\n')
561 except UnicodeEncodeError:
562 raise PicklingError(
563 "persistent IDs in protocol 0 must be ASCII strings")
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000564
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +0100565 def save_reduce(self, func, args, state=None, listitems=None,
566 dictitems=None, obj=None):
Jeremy Hyltone3a565e2003-06-29 16:59:59 +0000567 # This API is called by some subclasses
Guido van Rossumbc64e222003-01-28 16:34:19 +0000568
Guido van Rossum13257902007-06-07 23:15:56 +0000569 if not isinstance(args, tuple):
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +0100570 raise PicklingError("args from save_reduce() must be a tuple")
Florent Xicluna5d1155c2011-10-28 14:45:05 +0200571 if not callable(func):
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +0100572 raise PicklingError("func from save_reduce() must be callable")
Guido van Rossumbc64e222003-01-28 16:34:19 +0000573
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000574 save = self.save
Guido van Rossumbc64e222003-01-28 16:34:19 +0000575 write = self.write
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000576
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +0100577 func_name = getattr(func, "__name__", "")
Serhiy Storchaka0d554d72015-10-10 22:42:18 +0300578 if self.proto >= 2 and func_name == "__newobj_ex__":
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +0100579 cls, args, kwargs = args
580 if not hasattr(cls, "__new__"):
581 raise PicklingError("args[0] from {} args has no __new__"
582 .format(func_name))
583 if obj is not None and cls is not obj.__class__:
584 raise PicklingError("args[0] from {} args has the wrong class"
585 .format(func_name))
Serhiy Storchaka0d554d72015-10-10 22:42:18 +0300586 if self.proto >= 4:
587 save(cls)
588 save(args)
589 save(kwargs)
590 write(NEWOBJ_EX)
591 else:
592 func = partial(cls.__new__, cls, *args, **kwargs)
593 save(func)
594 save(())
595 write(REDUCE)
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +0100596 elif self.proto >= 2 and func_name == "__newobj__":
597 # A __reduce__ implementation can direct protocol 2 or newer to
Guido van Rossumd053b4b2003-01-31 16:51:45 +0000598 # use the more efficient NEWOBJ opcode, while still
599 # allowing protocol 0 and 1 to work normally. For this to
600 # work, the function returned by __reduce__ should be
601 # called __newobj__, and its first argument should be a
Florent Xiclunaaa6c1d22011-12-12 18:54:29 +0100602 # class. The implementation for __newobj__
Guido van Rossumd053b4b2003-01-31 16:51:45 +0000603 # should be as follows, although pickle has no way to
604 # verify this:
605 #
606 # def __newobj__(cls, *args):
607 # return cls.__new__(cls, *args)
608 #
609 # Protocols 0 and 1 will pickle a reference to __newobj__,
610 # while protocol 2 (and above) will pickle a reference to
611 # cls, the remaining args tuple, and the NEWOBJ code,
612 # which calls cls.__new__(cls, *args) at unpickling time
613 # (see load_newobj below). If __reduce__ returns a
614 # three-tuple, the state from the third tuple item will be
615 # pickled regardless of the protocol, calling __setstate__
616 # at unpickling time (see load_build below).
617 #
618 # Note that no standard __newobj__ implementation exists;
619 # you have to provide your own. This is to enforce
620 # compatibility with Python 2.2 (pickles written using
621 # protocol 0 or 1 in Python 2.3 should be unpicklable by
622 # Python 2.2).
623 cls = args[0]
624 if not hasattr(cls, "__new__"):
625 raise PicklingError(
626 "args[0] from __newobj__ args has no __new__")
Guido van Rossumf7f45172003-01-31 17:17:49 +0000627 if obj is not None and cls is not obj.__class__:
628 raise PicklingError(
629 "args[0] from __newobj__ args has the wrong class")
Guido van Rossumd053b4b2003-01-31 16:51:45 +0000630 args = args[1:]
631 save(cls)
632 save(args)
633 write(NEWOBJ)
634 else:
635 save(func)
636 save(args)
637 write(REDUCE)
Tim Peters2344fae2001-01-15 00:50:52 +0000638
Guido van Rossumf7f45172003-01-31 17:17:49 +0000639 if obj is not None:
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +0100640 # If the object is already in the memo, this means it is
641 # recursive. In this case, throw away everything we put on the
642 # stack, and fetch the object back from the memo.
643 if id(obj) in self.memo:
644 write(POP + self.get(self.memo[id(obj)][0]))
645 else:
646 self.memoize(obj)
Guido van Rossumf7f45172003-01-31 17:17:49 +0000647
Guido van Rossum25cb7df2003-01-31 18:53:21 +0000648 # More new special cases (that work with older protocols as
649 # well): when __reduce__ returns a tuple with 4 or 5 items,
650 # the 4th and 5th item should be iterators that provide list
651 # items and dict items (as (key, value) tuples), or None.
652
653 if listitems is not None:
654 self._batch_appends(listitems)
655
656 if dictitems is not None:
657 self._batch_setitems(dictitems)
658
Tim Petersc32d8242001-04-10 02:48:53 +0000659 if state is not None:
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000660 save(state)
661 write(BUILD)
662
Guido van Rossumbc64e222003-01-28 16:34:19 +0000663 # Methods below this point are dispatched through the dispatch table
664
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000665 dispatch = {}
666
Guido van Rossum3a41c612003-01-28 15:10:22 +0000667 def save_none(self, obj):
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000668 self.write(NONE)
Guido van Rossum13257902007-06-07 23:15:56 +0000669 dispatch[type(None)] = save_none
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000670
Guido van Rossum3a41c612003-01-28 15:10:22 +0000671 def save_bool(self, obj):
Guido van Rossum7d97d312003-01-28 04:25:27 +0000672 if self.proto >= 2:
Serhiy Storchakaa3e32c92013-04-14 13:37:02 +0300673 self.write(NEWTRUE if obj else NEWFALSE)
Guido van Rossum7d97d312003-01-28 04:25:27 +0000674 else:
Serhiy Storchakaa3e32c92013-04-14 13:37:02 +0300675 self.write(TRUE if obj else FALSE)
Guido van Rossum77f6a652002-04-03 22:41:51 +0000676 dispatch[bool] = save_bool
677
Serhiy Storchakaa3e32c92013-04-14 13:37:02 +0300678 def save_long(self, obj):
Guido van Rossumddefaf32007-01-14 03:31:43 +0000679 if self.bin:
680 # If the int is small enough to fit in a signed 4-byte 2's-comp
681 # format, we can store it more efficiently than the general
682 # case.
683 # First one- and two-byte unsigned ints:
684 if obj >= 0:
685 if obj <= 0xff:
Serhiy Storchakaa3e32c92013-04-14 13:37:02 +0300686 self.write(BININT1 + pack("<B", obj))
Guido van Rossumddefaf32007-01-14 03:31:43 +0000687 return
688 if obj <= 0xffff:
Serhiy Storchakaa3e32c92013-04-14 13:37:02 +0300689 self.write(BININT2 + pack("<H", obj))
Guido van Rossumddefaf32007-01-14 03:31:43 +0000690 return
691 # Next check for 4-byte signed ints:
Serhiy Storchakaa3e32c92013-04-14 13:37:02 +0300692 if -0x80000000 <= obj <= 0x7fffffff:
Guido van Rossumddefaf32007-01-14 03:31:43 +0000693 self.write(BININT + pack("<i", obj))
694 return
Guido van Rossumd6c9e632003-01-28 03:49:52 +0000695 if self.proto >= 2:
Guido van Rossum2e6a4b32007-05-04 19:56:22 +0000696 encoded = encode_long(obj)
697 n = len(encoded)
Guido van Rossumd6c9e632003-01-28 03:49:52 +0000698 if n < 256:
Serhiy Storchakaa3e32c92013-04-14 13:37:02 +0300699 self.write(LONG1 + pack("<B", n) + encoded)
Guido van Rossumd6c9e632003-01-28 03:49:52 +0000700 else:
Guido van Rossum2e6a4b32007-05-04 19:56:22 +0000701 self.write(LONG4 + pack("<i", n) + encoded)
Tim Petersee1a53c2003-02-02 02:57:53 +0000702 return
Serhiy Storchaka3daaafb2017-11-16 09:44:43 +0200703 if -0x80000000 <= obj <= 0x7fffffff:
704 self.write(INT + repr(obj).encode("ascii") + b'\n')
705 else:
706 self.write(LONG + repr(obj).encode("ascii") + b'L\n')
Guido van Rossum13257902007-06-07 23:15:56 +0000707 dispatch[int] = save_long
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000708
Serhiy Storchakaa3e32c92013-04-14 13:37:02 +0300709 def save_float(self, obj):
Guido van Rossumd3703791998-10-22 20:15:36 +0000710 if self.bin:
Guido van Rossum3a41c612003-01-28 15:10:22 +0000711 self.write(BINFLOAT + pack('>d', obj))
Guido van Rossumd3703791998-10-22 20:15:36 +0000712 else:
Guido van Rossum39478e82007-08-27 17:23:59 +0000713 self.write(FLOAT + repr(obj).encode("ascii") + b'\n')
Guido van Rossum13257902007-06-07 23:15:56 +0000714 dispatch[float] = save_float
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000715
Serhiy Storchakaa3e32c92013-04-14 13:37:02 +0300716 def save_bytes(self, obj):
Guido van Rossumf4169812008-03-17 22:56:06 +0000717 if self.proto < 3:
Serhiy Storchakaa3e32c92013-04-14 13:37:02 +0300718 if not obj: # bytes object is empty
Alexandre Vassalotti3bfc65a2011-12-13 13:08:09 -0500719 self.save_reduce(bytes, (), obj=obj)
720 else:
721 self.save_reduce(codecs.encode,
722 (str(obj, 'latin1'), 'latin1'), obj=obj)
Guido van Rossumf4169812008-03-17 22:56:06 +0000723 return
724 n = len(obj)
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +0100725 if n <= 0xff:
Serhiy Storchakaa3e32c92013-04-14 13:37:02 +0300726 self.write(SHORT_BINBYTES + pack("<B", n) + obj)
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +0100727 elif n > 0xffffffff and self.proto >= 4:
Olivier Grisel3cd7c6e2018-01-06 16:18:54 +0100728 self._write_large_bytes(BINBYTES8 + pack("<Q", n), obj)
729 elif n >= self.framer._FRAME_SIZE_TARGET:
730 self._write_large_bytes(BINBYTES + pack("<I", n), obj)
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000731 else:
Serhiy Storchakaa3e32c92013-04-14 13:37:02 +0300732 self.write(BINBYTES + pack("<I", n) + obj)
Guido van Rossum3a41c612003-01-28 15:10:22 +0000733 self.memoize(obj)
Guido van Rossumf4169812008-03-17 22:56:06 +0000734 dispatch[bytes] = save_bytes
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000735
Serhiy Storchakaa3e32c92013-04-14 13:37:02 +0300736 def save_str(self, obj):
Tim Petersc32d8242001-04-10 02:48:53 +0000737 if self.bin:
Victor Stinner485fb562010-04-13 11:07:24 +0000738 encoded = obj.encode('utf-8', 'surrogatepass')
Guido van Rossum2e6a4b32007-05-04 19:56:22 +0000739 n = len(encoded)
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +0100740 if n <= 0xff and self.proto >= 4:
741 self.write(SHORT_BINUNICODE + pack("<B", n) + encoded)
742 elif n > 0xffffffff and self.proto >= 4:
Olivier Grisel3cd7c6e2018-01-06 16:18:54 +0100743 self._write_large_bytes(BINUNICODE8 + pack("<Q", n), encoded)
744 elif n >= self.framer._FRAME_SIZE_TARGET:
745 self._write_large_bytes(BINUNICODE + pack("<I", n), encoded)
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +0100746 else:
747 self.write(BINUNICODE + pack("<I", n) + encoded)
Guido van Rossumb5f2f1b2000-03-10 23:20:09 +0000748 else:
Guido van Rossum3a41c612003-01-28 15:10:22 +0000749 obj = obj.replace("\\", "\\u005c")
750 obj = obj.replace("\n", "\\u000a")
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +0100751 self.write(UNICODE + obj.encode('raw-unicode-escape') +
752 b'\n')
Guido van Rossum3a41c612003-01-28 15:10:22 +0000753 self.memoize(obj)
Guido van Rossumf4169812008-03-17 22:56:06 +0000754 dispatch[str] = save_str
Tim Peters658cba62001-02-09 20:06:00 +0000755
Guido van Rossum3a41c612003-01-28 15:10:22 +0000756 def save_tuple(self, obj):
Serhiy Storchakaa3e32c92013-04-14 13:37:02 +0300757 if not obj: # tuple is empty
758 if self.bin:
759 self.write(EMPTY_TUPLE)
Tim Peters1d63c9f2003-02-02 20:29:39 +0000760 else:
Serhiy Storchakaa3e32c92013-04-14 13:37:02 +0300761 self.write(MARK + TUPLE)
Tim Petersd97da802003-01-28 05:48:29 +0000762 return
763
Serhiy Storchakaa3e32c92013-04-14 13:37:02 +0300764 n = len(obj)
Tim Petersd97da802003-01-28 05:48:29 +0000765 save = self.save
766 memo = self.memo
Serhiy Storchakaa3e32c92013-04-14 13:37:02 +0300767 if n <= 3 and self.proto >= 2:
Guido van Rossum3a41c612003-01-28 15:10:22 +0000768 for element in obj:
Tim Petersd97da802003-01-28 05:48:29 +0000769 save(element)
770 # Subtle. Same as in the big comment below.
Guido van Rossum3a41c612003-01-28 15:10:22 +0000771 if id(obj) in memo:
772 get = self.get(memo[id(obj)][0])
Serhiy Storchakaa3e32c92013-04-14 13:37:02 +0300773 self.write(POP * n + get)
Tim Petersd97da802003-01-28 05:48:29 +0000774 else:
Serhiy Storchakaa3e32c92013-04-14 13:37:02 +0300775 self.write(_tuplesize2code[n])
Guido van Rossum3a41c612003-01-28 15:10:22 +0000776 self.memoize(obj)
Tim Petersd97da802003-01-28 05:48:29 +0000777 return
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000778
Tim Peters1d63c9f2003-02-02 20:29:39 +0000779 # proto 0 or proto 1 and tuple isn't empty, or proto > 1 and tuple
Tim Petersff57bff2003-01-28 05:34:53 +0000780 # has more than 3 elements.
Serhiy Storchakaa3e32c92013-04-14 13:37:02 +0300781 write = self.write
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000782 write(MARK)
Guido van Rossum3a41c612003-01-28 15:10:22 +0000783 for element in obj:
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000784 save(element)
785
Tim Peters1d63c9f2003-02-02 20:29:39 +0000786 if id(obj) in memo:
Tim Petersf558da02003-01-28 02:09:55 +0000787 # Subtle. d was not in memo when we entered save_tuple(), so
788 # the process of saving the tuple's elements must have saved
789 # the tuple itself: the tuple is recursive. The proper action
790 # now is to throw away everything we put on the stack, and
791 # simply GET the tuple (it's already constructed). This check
792 # could have been done in the "for element" loop instead, but
793 # recursive tuples are a rare thing.
Guido van Rossum3a41c612003-01-28 15:10:22 +0000794 get = self.get(memo[id(obj)][0])
Serhiy Storchakaa3e32c92013-04-14 13:37:02 +0300795 if self.bin:
Tim Petersf558da02003-01-28 02:09:55 +0000796 write(POP_MARK + get)
797 else: # proto 0 -- POP_MARK not available
Tim Petersd97da802003-01-28 05:48:29 +0000798 write(POP * (n+1) + get)
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000799 return
800
Tim Peters1d63c9f2003-02-02 20:29:39 +0000801 # No recursion.
Serhiy Storchakaa3e32c92013-04-14 13:37:02 +0300802 write(TUPLE)
Tim Peters1d63c9f2003-02-02 20:29:39 +0000803 self.memoize(obj)
Jeremy Hylton3422c992003-01-24 19:29:52 +0000804
Guido van Rossum13257902007-06-07 23:15:56 +0000805 dispatch[tuple] = save_tuple
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000806
Guido van Rossum3a41c612003-01-28 15:10:22 +0000807 def save_list(self, obj):
Tim Petersc32d8242001-04-10 02:48:53 +0000808 if self.bin:
Serhiy Storchakaa3e32c92013-04-14 13:37:02 +0300809 self.write(EMPTY_LIST)
Guido van Rossum25cb7df2003-01-31 18:53:21 +0000810 else: # proto 0 -- can't use EMPTY_LIST
Serhiy Storchakaa3e32c92013-04-14 13:37:02 +0300811 self.write(MARK + LIST)
Guido van Rossum25cb7df2003-01-31 18:53:21 +0000812
813 self.memoize(obj)
Alexandre Vassalottic7db1d62008-05-14 21:57:18 +0000814 self._batch_appends(obj)
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000815
Guido van Rossum13257902007-06-07 23:15:56 +0000816 dispatch[list] = save_list
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000817
Guido van Rossum25cb7df2003-01-31 18:53:21 +0000818 _BATCHSIZE = 1000
819
820 def _batch_appends(self, items):
821 # Helper to batch up APPENDS sequences
822 save = self.save
823 write = self.write
824
825 if not self.bin:
826 for x in items:
827 save(x)
828 write(APPEND)
829 return
830
Serhiy Storchakaa3e32c92013-04-14 13:37:02 +0300831 it = iter(items)
832 while True:
833 tmp = list(islice(it, self._BATCHSIZE))
Guido van Rossum25cb7df2003-01-31 18:53:21 +0000834 n = len(tmp)
835 if n > 1:
836 write(MARK)
837 for x in tmp:
838 save(x)
839 write(APPENDS)
840 elif n:
841 save(tmp[0])
842 write(APPEND)
843 # else tmp is empty, and we're done
Serhiy Storchakaa3e32c92013-04-14 13:37:02 +0300844 if n < self._BATCHSIZE:
845 return
Guido van Rossum25cb7df2003-01-31 18:53:21 +0000846
Guido van Rossum3a41c612003-01-28 15:10:22 +0000847 def save_dict(self, obj):
Tim Petersc32d8242001-04-10 02:48:53 +0000848 if self.bin:
Serhiy Storchakaa3e32c92013-04-14 13:37:02 +0300849 self.write(EMPTY_DICT)
Guido van Rossum25cb7df2003-01-31 18:53:21 +0000850 else: # proto 0 -- can't use EMPTY_DICT
Serhiy Storchakaa3e32c92013-04-14 13:37:02 +0300851 self.write(MARK + DICT)
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000852
Guido van Rossum25cb7df2003-01-31 18:53:21 +0000853 self.memoize(obj)
Alexandre Vassalottic7db1d62008-05-14 21:57:18 +0000854 self._batch_setitems(obj.items())
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000855
Guido van Rossum13257902007-06-07 23:15:56 +0000856 dispatch[dict] = save_dict
857 if PyStringMap is not None:
Jeremy Hylton2b9d0291998-05-27 22:38:22 +0000858 dispatch[PyStringMap] = save_dict
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000859
Guido van Rossum25cb7df2003-01-31 18:53:21 +0000860 def _batch_setitems(self, items):
861 # Helper to batch up SETITEMS sequences; proto >= 1 only
862 save = self.save
863 write = self.write
864
865 if not self.bin:
866 for k, v in items:
867 save(k)
868 save(v)
869 write(SETITEM)
870 return
871
Serhiy Storchakaa3e32c92013-04-14 13:37:02 +0300872 it = iter(items)
873 while True:
874 tmp = list(islice(it, self._BATCHSIZE))
Guido van Rossum25cb7df2003-01-31 18:53:21 +0000875 n = len(tmp)
876 if n > 1:
877 write(MARK)
878 for k, v in tmp:
879 save(k)
880 save(v)
881 write(SETITEMS)
882 elif n:
883 k, v = tmp[0]
884 save(k)
885 save(v)
886 write(SETITEM)
887 # else tmp is empty, and we're done
Serhiy Storchakaa3e32c92013-04-14 13:37:02 +0300888 if n < self._BATCHSIZE:
889 return
Guido van Rossum25cb7df2003-01-31 18:53:21 +0000890
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +0100891 def save_set(self, obj):
892 save = self.save
893 write = self.write
894
895 if self.proto < 4:
896 self.save_reduce(set, (list(obj),), obj=obj)
897 return
898
899 write(EMPTY_SET)
900 self.memoize(obj)
901
902 it = iter(obj)
903 while True:
904 batch = list(islice(it, self._BATCHSIZE))
905 n = len(batch)
906 if n > 0:
907 write(MARK)
908 for item in batch:
909 save(item)
910 write(ADDITEMS)
911 if n < self._BATCHSIZE:
912 return
913 dispatch[set] = save_set
914
915 def save_frozenset(self, obj):
916 save = self.save
917 write = self.write
918
919 if self.proto < 4:
920 self.save_reduce(frozenset, (list(obj),), obj=obj)
921 return
922
923 write(MARK)
924 for item in obj:
925 save(item)
926
927 if id(obj) in self.memo:
928 # If the object is already in the memo, this means it is
929 # recursive. In this case, throw away everything we put on the
930 # stack, and fetch the object back from the memo.
931 write(POP_MARK + self.get(self.memo[id(obj)][0]))
932 return
933
934 write(FROZENSET)
935 self.memoize(obj)
936 dispatch[frozenset] = save_frozenset
937
Serhiy Storchakaa3e32c92013-04-14 13:37:02 +0300938 def save_global(self, obj, name=None):
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000939 write = self.write
940 memo = self.memo
941
Serhiy Storchaka58e41342015-03-31 14:07:24 +0300942 if name is None:
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +0100943 name = getattr(obj, '__qualname__', None)
Tim Petersc32d8242001-04-10 02:48:53 +0000944 if name is None:
Guido van Rossum3a41c612003-01-28 15:10:22 +0000945 name = obj.__name__
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000946
Serhiy Storchaka58e41342015-03-31 14:07:24 +0300947 module_name = whichmodule(obj, name)
Guido van Rossumb0a98e92001-08-17 18:49:52 +0000948 try:
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +0100949 __import__(module_name, level=0)
950 module = sys.modules[module_name]
Serhiy Storchaka58e41342015-03-31 14:07:24 +0300951 obj2, parent = _getattribute(module, name)
Guido van Rossumb0a98e92001-08-17 18:49:52 +0000952 except (ImportError, KeyError, AttributeError):
953 raise PicklingError(
954 "Can't pickle %r: it's not found as %s.%s" %
Serhiy Storchaka5affd232017-04-05 09:37:24 +0300955 (obj, module_name, name)) from None
Guido van Rossumb0a98e92001-08-17 18:49:52 +0000956 else:
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +0100957 if obj2 is not obj:
Guido van Rossumb0a98e92001-08-17 18:49:52 +0000958 raise PicklingError(
959 "Can't pickle %r: it's not the same object as %s.%s" %
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +0100960 (obj, module_name, name))
Guido van Rossumb0a98e92001-08-17 18:49:52 +0000961
Guido van Rossum255f3ee2003-01-29 06:14:11 +0000962 if self.proto >= 2:
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +0100963 code = _extension_registry.get((module_name, name))
Guido van Rossum255f3ee2003-01-29 06:14:11 +0000964 if code:
965 assert code > 0
966 if code <= 0xff:
Serhiy Storchakaa3e32c92013-04-14 13:37:02 +0300967 write(EXT1 + pack("<B", code))
Guido van Rossum255f3ee2003-01-29 06:14:11 +0000968 elif code <= 0xffff:
Serhiy Storchakaa3e32c92013-04-14 13:37:02 +0300969 write(EXT2 + pack("<H", code))
Guido van Rossum255f3ee2003-01-29 06:14:11 +0000970 else:
971 write(EXT4 + pack("<i", code))
972 return
Serhiy Storchaka58e41342015-03-31 14:07:24 +0300973 lastname = name.rpartition('.')[2]
974 if parent is module:
975 name = lastname
Alexandre Vassalottica2d6102008-06-12 18:26:05 +0000976 # Non-ASCII identifiers are supported only with protocols >= 3.
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +0100977 if self.proto >= 4:
978 self.save(module_name)
979 self.save(name)
980 write(STACK_GLOBAL)
Serhiy Storchaka58e41342015-03-31 14:07:24 +0300981 elif parent is not module:
982 self.save_reduce(getattr, (parent, lastname))
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +0100983 elif self.proto >= 3:
984 write(GLOBAL + bytes(module_name, "utf-8") + b'\n' +
Alexandre Vassalottica2d6102008-06-12 18:26:05 +0000985 bytes(name, "utf-8") + b'\n')
986 else:
Antoine Pitroud9dfaa92009-06-04 20:32:06 +0000987 if self.fix_imports:
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +0100988 r_name_mapping = _compat_pickle.REVERSE_NAME_MAPPING
989 r_import_mapping = _compat_pickle.REVERSE_IMPORT_MAPPING
990 if (module_name, name) in r_name_mapping:
991 module_name, name = r_name_mapping[(module_name, name)]
Serhiy Storchakabfe18242015-03-31 13:12:37 +0300992 elif module_name in r_import_mapping:
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +0100993 module_name = r_import_mapping[module_name]
Alexandre Vassalottica2d6102008-06-12 18:26:05 +0000994 try:
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +0100995 write(GLOBAL + bytes(module_name, "ascii") + b'\n' +
Alexandre Vassalottica2d6102008-06-12 18:26:05 +0000996 bytes(name, "ascii") + b'\n')
997 except UnicodeEncodeError:
998 raise PicklingError(
999 "can't pickle global identifier '%s.%s' using "
Serhiy Storchaka5affd232017-04-05 09:37:24 +03001000 "pickle protocol %i" % (module, name, self.proto)) from None
Guido van Rossum255f3ee2003-01-29 06:14:11 +00001001
Guido van Rossum3a41c612003-01-28 15:10:22 +00001002 self.memoize(obj)
Tim Peters3b769832003-01-28 03:51:36 +00001003
Alexandre Vassalotti19b6fa62013-11-30 16:06:39 -08001004 def save_type(self, obj):
1005 if obj is type(None):
1006 return self.save_reduce(type, (None,), obj=obj)
1007 elif obj is type(NotImplemented):
1008 return self.save_reduce(type, (NotImplemented,), obj=obj)
1009 elif obj is type(...):
1010 return self.save_reduce(type, (...,), obj=obj)
1011 return self.save_global(obj)
1012
Guido van Rossumb72cf2d1997-04-09 17:32:51 +00001013 dispatch[FunctionType] = save_global
Alexandre Vassalotti19b6fa62013-11-30 16:06:39 -08001014 dispatch[type] = save_type
Guido van Rossum0c891ce1995-03-14 15:09:05 +00001015
Guido van Rossuma48061a1995-01-10 00:31:14 +00001016
Guido van Rossum1be31752003-01-28 15:19:53 +00001017# Unpickling machinery
1018
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001019class _Unpickler:
Guido van Rossuma48061a1995-01-10 00:31:14 +00001020
Antoine Pitroud9dfaa92009-06-04 20:32:06 +00001021 def __init__(self, file, *, fix_imports=True,
1022 encoding="ASCII", errors="strict"):
Guido van Rossum2e6a4b32007-05-04 19:56:22 +00001023 """This takes a binary file for reading a pickle data stream.
Raymond Hettingeraef22fb2002-05-29 16:18:42 +00001024
Alexandre Vassalottid05c9ff2013-12-07 01:09:27 -08001025 The protocol version of the pickle is detected automatically, so
1026 no proto argument is needed.
1027
1028 The argument *file* must have two methods, a read() method that
1029 takes an integer argument, and a readline() method that requires
1030 no arguments. Both methods should return bytes. Thus *file*
Martin Panter7462b6492015-11-02 03:37:02 +00001031 can be a binary file object opened for reading, an io.BytesIO
Alexandre Vassalottid05c9ff2013-12-07 01:09:27 -08001032 object, or any other custom object that meets this interface.
Raymond Hettingeraef22fb2002-05-29 16:18:42 +00001033
Guido van Rossumfeea0782007-10-10 18:00:50 +00001034 The file-like object must have two methods, a read() method
1035 that takes an integer argument, and a readline() method that
1036 requires no arguments. Both methods should return bytes.
1037 Thus file-like object can be a binary file object opened for
1038 reading, a BytesIO object, or any other custom object that
1039 meets this interface.
Guido van Rossumf4169812008-03-17 22:56:06 +00001040
Alexandre Vassalottid05c9ff2013-12-07 01:09:27 -08001041 Optional keyword arguments are *fix_imports*, *encoding* and
Martin Panter46f50722016-05-26 05:35:26 +00001042 *errors*, which are used to control compatibility support for
Alexandre Vassalottid05c9ff2013-12-07 01:09:27 -08001043 pickle stream generated by Python 2. If *fix_imports* is True,
1044 pickle will try to map the old Python 2 names to the new names
1045 used in Python 3. The *encoding* and *errors* tell pickle how
1046 to decode 8-bit string instances pickled by Python 2; these
1047 default to 'ASCII' and 'strict', respectively. *encoding* can be
1048 'bytes' to read theses 8-bit string instances as bytes objects.
Raymond Hettingeraef22fb2002-05-29 16:18:42 +00001049 """
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01001050 self._file_readline = file.readline
1051 self._file_read = file.read
Guido van Rossumb72cf2d1997-04-09 17:32:51 +00001052 self.memo = {}
Guido van Rossumf4169812008-03-17 22:56:06 +00001053 self.encoding = encoding
1054 self.errors = errors
Antoine Pitroud9dfaa92009-06-04 20:32:06 +00001055 self.proto = 0
1056 self.fix_imports = fix_imports
Guido van Rossuma48061a1995-01-10 00:31:14 +00001057
Guido van Rossumb72cf2d1997-04-09 17:32:51 +00001058 def load(self):
Guido van Rossum3a41c612003-01-28 15:10:22 +00001059 """Read a pickled object representation from the open file.
Raymond Hettingeraef22fb2002-05-29 16:18:42 +00001060
Guido van Rossum3a41c612003-01-28 15:10:22 +00001061 Return the reconstituted object hierarchy specified in the file.
Raymond Hettingeraef22fb2002-05-29 16:18:42 +00001062 """
Alexandre Vassalotti3cfcab92008-12-27 09:30:39 +00001063 # Check whether Unpickler was initialized correctly. This is
1064 # only needed to mimic the behavior of _pickle.Unpickler.dump().
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01001065 if not hasattr(self, "_file_read"):
Alexandre Vassalotti3cfcab92008-12-27 09:30:39 +00001066 raise UnpicklingError("Unpickler.__init__() was not called by "
1067 "%s.__init__()" % (self.__class__.__name__,))
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01001068 self._unframer = _Unframer(self._file_read, self._file_readline)
1069 self.read = self._unframer.read
1070 self.readline = self._unframer.readline
Serhiy Storchaka59fb6342015-12-06 22:01:35 +02001071 self.metastack = []
Guido van Rossumb72cf2d1997-04-09 17:32:51 +00001072 self.stack = []
1073 self.append = self.stack.append
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01001074 self.proto = 0
Guido van Rossumb72cf2d1997-04-09 17:32:51 +00001075 read = self.read
1076 dispatch = self.dispatch
1077 try:
Serhiy Storchakaa3e32c92013-04-14 13:37:02 +03001078 while True:
Guido van Rossumb72cf2d1997-04-09 17:32:51 +00001079 key = read(1)
Guido van Rossum2e6a4b32007-05-04 19:56:22 +00001080 if not key:
1081 raise EOFError
Guido van Rossum98297ee2007-11-06 21:34:58 +00001082 assert isinstance(key, bytes_types)
Guido van Rossum2e6a4b32007-05-04 19:56:22 +00001083 dispatch[key[0]](self)
Guido van Rossumb940e112007-01-10 16:19:56 +00001084 except _Stop as stopinst:
Guido van Rossumff871742000-12-13 18:11:56 +00001085 return stopinst.value
Guido van Rossumb72cf2d1997-04-09 17:32:51 +00001086
Serhiy Storchaka59fb6342015-12-06 22:01:35 +02001087 # Return a list of items pushed in the stack after last MARK instruction.
1088 def pop_mark(self):
1089 items = self.stack
1090 self.stack = self.metastack.pop()
1091 self.append = self.stack.append
1092 return items
Guido van Rossumb72cf2d1997-04-09 17:32:51 +00001093
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001094 def persistent_load(self, pid):
Benjamin Peterson49956b22009-01-10 17:05:44 +00001095 raise UnpicklingError("unsupported persistent id encountered")
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001096
Guido van Rossumb72cf2d1997-04-09 17:32:51 +00001097 dispatch = {}
1098
Guido van Rossumd6c9e632003-01-28 03:49:52 +00001099 def load_proto(self):
Serhiy Storchakaa3e32c92013-04-14 13:37:02 +03001100 proto = self.read(1)[0]
Guido van Rossumf4169812008-03-17 22:56:06 +00001101 if not 0 <= proto <= HIGHEST_PROTOCOL:
Guido van Rossum26d95c32007-08-27 23:18:54 +00001102 raise ValueError("unsupported pickle protocol: %d" % proto)
Antoine Pitroud9dfaa92009-06-04 20:32:06 +00001103 self.proto = proto
Guido van Rossum2e6a4b32007-05-04 19:56:22 +00001104 dispatch[PROTO[0]] = load_proto
Guido van Rossumd6c9e632003-01-28 03:49:52 +00001105
Alexandre Vassalottib6a2f2a2013-11-23 20:30:03 -08001106 def load_frame(self):
1107 frame_size, = unpack('<Q', self.read(8))
1108 if frame_size > sys.maxsize:
1109 raise ValueError("frame size > sys.maxsize: %d" % frame_size)
1110 self._unframer.load_frame(frame_size)
1111 dispatch[FRAME[0]] = load_frame
1112
Guido van Rossumb72cf2d1997-04-09 17:32:51 +00001113 def load_persid(self):
Serhiy Storchakadec25af2016-07-17 11:24:17 +03001114 try:
1115 pid = self.readline()[:-1].decode("ascii")
1116 except UnicodeDecodeError:
1117 raise UnpicklingError(
1118 "persistent IDs in protocol 0 must be ASCII strings")
Guido van Rossumb72cf2d1997-04-09 17:32:51 +00001119 self.append(self.persistent_load(pid))
Guido van Rossum2e6a4b32007-05-04 19:56:22 +00001120 dispatch[PERSID[0]] = load_persid
Guido van Rossumb72cf2d1997-04-09 17:32:51 +00001121
1122 def load_binpersid(self):
Raymond Hettinger46ac8eb2002-06-30 03:39:14 +00001123 pid = self.stack.pop()
Guido van Rossumb72cf2d1997-04-09 17:32:51 +00001124 self.append(self.persistent_load(pid))
Guido van Rossum2e6a4b32007-05-04 19:56:22 +00001125 dispatch[BINPERSID[0]] = load_binpersid
Guido van Rossumb72cf2d1997-04-09 17:32:51 +00001126
1127 def load_none(self):
1128 self.append(None)
Guido van Rossum2e6a4b32007-05-04 19:56:22 +00001129 dispatch[NONE[0]] = load_none
Guido van Rossumb72cf2d1997-04-09 17:32:51 +00001130
Guido van Rossum7d97d312003-01-28 04:25:27 +00001131 def load_false(self):
1132 self.append(False)
Guido van Rossum2e6a4b32007-05-04 19:56:22 +00001133 dispatch[NEWFALSE[0]] = load_false
Guido van Rossum7d97d312003-01-28 04:25:27 +00001134
1135 def load_true(self):
1136 self.append(True)
Guido van Rossum2e6a4b32007-05-04 19:56:22 +00001137 dispatch[NEWTRUE[0]] = load_true
Guido van Rossum7d97d312003-01-28 04:25:27 +00001138
Guido van Rossumb72cf2d1997-04-09 17:32:51 +00001139 def load_int(self):
Tim Peters19ef62d2001-08-28 22:21:18 +00001140 data = self.readline()
Guido van Rossume2763392002-04-05 19:30:08 +00001141 if data == FALSE[1:]:
1142 val = False
1143 elif data == TRUE[1:]:
1144 val = True
1145 else:
Serhiy Storchakaa3e32c92013-04-14 13:37:02 +03001146 val = int(data, 0)
Guido van Rossume2763392002-04-05 19:30:08 +00001147 self.append(val)
Guido van Rossum2e6a4b32007-05-04 19:56:22 +00001148 dispatch[INT[0]] = load_int
Guido van Rossumb72cf2d1997-04-09 17:32:51 +00001149
1150 def load_binint(self):
Serhiy Storchakaa3e32c92013-04-14 13:37:02 +03001151 self.append(unpack('<i', self.read(4))[0])
Guido van Rossum2e6a4b32007-05-04 19:56:22 +00001152 dispatch[BININT[0]] = load_binint
Guido van Rossumb72cf2d1997-04-09 17:32:51 +00001153
1154 def load_binint1(self):
Serhiy Storchakaa3e32c92013-04-14 13:37:02 +03001155 self.append(self.read(1)[0])
Guido van Rossum2e6a4b32007-05-04 19:56:22 +00001156 dispatch[BININT1[0]] = load_binint1
Guido van Rossumb72cf2d1997-04-09 17:32:51 +00001157
1158 def load_binint2(self):
Serhiy Storchakaa3e32c92013-04-14 13:37:02 +03001159 self.append(unpack('<H', self.read(2))[0])
Guido van Rossum2e6a4b32007-05-04 19:56:22 +00001160 dispatch[BININT2[0]] = load_binint2
Tim Peters2344fae2001-01-15 00:50:52 +00001161
Guido van Rossumb72cf2d1997-04-09 17:32:51 +00001162 def load_long(self):
Serhiy Storchakaa3e32c92013-04-14 13:37:02 +03001163 val = self.readline()[:-1]
1164 if val and val[-1] == b'L'[0]:
Mark Dickinson8dd05142009-01-20 20:43:58 +00001165 val = val[:-1]
Guido van Rossumfeea0782007-10-10 18:00:50 +00001166 self.append(int(val, 0))
Guido van Rossum2e6a4b32007-05-04 19:56:22 +00001167 dispatch[LONG[0]] = load_long
Guido van Rossumb72cf2d1997-04-09 17:32:51 +00001168
Guido van Rossumd6c9e632003-01-28 03:49:52 +00001169 def load_long1(self):
Serhiy Storchakaa3e32c92013-04-14 13:37:02 +03001170 n = self.read(1)[0]
Guido van Rossum2e6a4b32007-05-04 19:56:22 +00001171 data = self.read(n)
1172 self.append(decode_long(data))
1173 dispatch[LONG1[0]] = load_long1
Guido van Rossumd6c9e632003-01-28 03:49:52 +00001174
1175 def load_long4(self):
Serhiy Storchakaa3e32c92013-04-14 13:37:02 +03001176 n, = unpack('<i', self.read(4))
Antoine Pitroubf6ecf92012-11-24 20:40:21 +01001177 if n < 0:
1178 # Corrupt or hostile pickle -- we never write one like this
Alexandre Vassalotticc757172013-04-14 02:25:10 -07001179 raise UnpicklingError("LONG pickle has negative byte count")
Guido van Rossum2e6a4b32007-05-04 19:56:22 +00001180 data = self.read(n)
1181 self.append(decode_long(data))
1182 dispatch[LONG4[0]] = load_long4
Guido van Rossumd6c9e632003-01-28 03:49:52 +00001183
Guido van Rossumb72cf2d1997-04-09 17:32:51 +00001184 def load_float(self):
Guido van Rossumff871742000-12-13 18:11:56 +00001185 self.append(float(self.readline()[:-1]))
Guido van Rossum2e6a4b32007-05-04 19:56:22 +00001186 dispatch[FLOAT[0]] = load_float
Guido van Rossumb72cf2d1997-04-09 17:32:51 +00001187
Serhiy Storchakaa3e32c92013-04-14 13:37:02 +03001188 def load_binfloat(self):
Guido van Rossumd3703791998-10-22 20:15:36 +00001189 self.append(unpack('>d', self.read(8))[0])
Guido van Rossum2e6a4b32007-05-04 19:56:22 +00001190 dispatch[BINFLOAT[0]] = load_binfloat
Guido van Rossumd3703791998-10-22 20:15:36 +00001191
Alexandre Vassalottid05c9ff2013-12-07 01:09:27 -08001192 def _decode_string(self, value):
1193 # Used to allow strings from Python 2 to be decoded either as
1194 # bytes or Unicode strings. This should be used only with the
1195 # STRING, BINSTRING and SHORT_BINSTRING opcodes.
1196 if self.encoding == "bytes":
1197 return value
1198 else:
1199 return value.decode(self.encoding, self.errors)
1200
Guido van Rossumb72cf2d1997-04-09 17:32:51 +00001201 def load_string(self):
Alexandre Vassalotti7c5e0942013-04-15 23:14:55 -07001202 data = self.readline()[:-1]
Serhiy Storchakaa3e32c92013-04-14 13:37:02 +03001203 # Strip outermost quotes
Alexandre Vassalotti7c5e0942013-04-15 23:14:55 -07001204 if len(data) >= 2 and data[0] == data[-1] and data[0] in b'"\'':
1205 data = data[1:-1]
Martin v. Löwis8a8da792002-08-14 07:46:28 +00001206 else:
Alexandre Vassalotti7c5e0942013-04-15 23:14:55 -07001207 raise UnpicklingError("the STRING opcode argument must be quoted")
Alexandre Vassalottid05c9ff2013-12-07 01:09:27 -08001208 self.append(self._decode_string(codecs.escape_decode(data)[0]))
Guido van Rossum2e6a4b32007-05-04 19:56:22 +00001209 dispatch[STRING[0]] = load_string
Guido van Rossumb72cf2d1997-04-09 17:32:51 +00001210
1211 def load_binstring(self):
Antoine Pitroubf6ecf92012-11-24 20:40:21 +01001212 # Deprecated BINSTRING uses signed 32-bit length
Serhiy Storchakaa3e32c92013-04-14 13:37:02 +03001213 len, = unpack('<i', self.read(4))
Antoine Pitroubf6ecf92012-11-24 20:40:21 +01001214 if len < 0:
Alexandre Vassalotticc757172013-04-14 02:25:10 -07001215 raise UnpicklingError("BINSTRING pickle has negative byte count")
Guido van Rossumf4169812008-03-17 22:56:06 +00001216 data = self.read(len)
Alexandre Vassalottid05c9ff2013-12-07 01:09:27 -08001217 self.append(self._decode_string(data))
Guido van Rossum2e6a4b32007-05-04 19:56:22 +00001218 dispatch[BINSTRING[0]] = load_binstring
Guido van Rossumb72cf2d1997-04-09 17:32:51 +00001219
Serhiy Storchakaa3e32c92013-04-14 13:37:02 +03001220 def load_binbytes(self):
Antoine Pitroubf6ecf92012-11-24 20:40:21 +01001221 len, = unpack('<I', self.read(4))
1222 if len > maxsize:
Alexandre Vassalotticc757172013-04-14 02:25:10 -07001223 raise UnpicklingError("BINBYTES exceeds system's maximum size "
1224 "of %d bytes" % maxsize)
Guido van Rossumf4169812008-03-17 22:56:06 +00001225 self.append(self.read(len))
1226 dispatch[BINBYTES[0]] = load_binbytes
1227
Guido van Rossumb5f2f1b2000-03-10 23:20:09 +00001228 def load_unicode(self):
Guido van Rossum2e6a4b32007-05-04 19:56:22 +00001229 self.append(str(self.readline()[:-1], 'raw-unicode-escape'))
1230 dispatch[UNICODE[0]] = load_unicode
Guido van Rossumb5f2f1b2000-03-10 23:20:09 +00001231
Serhiy Storchakaa3e32c92013-04-14 13:37:02 +03001232 def load_binunicode(self):
Antoine Pitroubf6ecf92012-11-24 20:40:21 +01001233 len, = unpack('<I', self.read(4))
1234 if len > maxsize:
Alexandre Vassalotticc757172013-04-14 02:25:10 -07001235 raise UnpicklingError("BINUNICODE exceeds system's maximum size "
1236 "of %d bytes" % maxsize)
Victor Stinner485fb562010-04-13 11:07:24 +00001237 self.append(str(self.read(len), 'utf-8', 'surrogatepass'))
Guido van Rossum2e6a4b32007-05-04 19:56:22 +00001238 dispatch[BINUNICODE[0]] = load_binunicode
Guido van Rossumb5f2f1b2000-03-10 23:20:09 +00001239
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01001240 def load_binunicode8(self):
1241 len, = unpack('<Q', self.read(8))
1242 if len > maxsize:
1243 raise UnpicklingError("BINUNICODE8 exceeds system's maximum size "
1244 "of %d bytes" % maxsize)
1245 self.append(str(self.read(len), 'utf-8', 'surrogatepass'))
1246 dispatch[BINUNICODE8[0]] = load_binunicode8
1247
Serhiy Storchakae0606192015-09-29 22:10:07 +03001248 def load_binbytes8(self):
1249 len, = unpack('<Q', self.read(8))
1250 if len > maxsize:
1251 raise UnpicklingError("BINBYTES8 exceeds system's maximum size "
1252 "of %d bytes" % maxsize)
1253 self.append(self.read(len))
1254 dispatch[BINBYTES8[0]] = load_binbytes8
1255
Guido van Rossumb72cf2d1997-04-09 17:32:51 +00001256 def load_short_binstring(self):
Serhiy Storchakaa3e32c92013-04-14 13:37:02 +03001257 len = self.read(1)[0]
1258 data = self.read(len)
Alexandre Vassalottid05c9ff2013-12-07 01:09:27 -08001259 self.append(self._decode_string(data))
Guido van Rossum2e6a4b32007-05-04 19:56:22 +00001260 dispatch[SHORT_BINSTRING[0]] = load_short_binstring
Guido van Rossumb72cf2d1997-04-09 17:32:51 +00001261
Guido van Rossumf4169812008-03-17 22:56:06 +00001262 def load_short_binbytes(self):
Serhiy Storchakaa3e32c92013-04-14 13:37:02 +03001263 len = self.read(1)[0]
1264 self.append(self.read(len))
Guido van Rossumf4169812008-03-17 22:56:06 +00001265 dispatch[SHORT_BINBYTES[0]] = load_short_binbytes
1266
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01001267 def load_short_binunicode(self):
1268 len = self.read(1)[0]
1269 self.append(str(self.read(len), 'utf-8', 'surrogatepass'))
1270 dispatch[SHORT_BINUNICODE[0]] = load_short_binunicode
1271
Guido van Rossumb72cf2d1997-04-09 17:32:51 +00001272 def load_tuple(self):
Serhiy Storchaka59fb6342015-12-06 22:01:35 +02001273 items = self.pop_mark()
1274 self.append(tuple(items))
Guido van Rossum2e6a4b32007-05-04 19:56:22 +00001275 dispatch[TUPLE[0]] = load_tuple
Guido van Rossumb72cf2d1997-04-09 17:32:51 +00001276
1277 def load_empty_tuple(self):
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001278 self.append(())
Guido van Rossum2e6a4b32007-05-04 19:56:22 +00001279 dispatch[EMPTY_TUPLE[0]] = load_empty_tuple
Guido van Rossumb72cf2d1997-04-09 17:32:51 +00001280
Guido van Rossum44f0ea52003-01-28 04:14:51 +00001281 def load_tuple1(self):
1282 self.stack[-1] = (self.stack[-1],)
Guido van Rossum2e6a4b32007-05-04 19:56:22 +00001283 dispatch[TUPLE1[0]] = load_tuple1
Guido van Rossum44f0ea52003-01-28 04:14:51 +00001284
1285 def load_tuple2(self):
1286 self.stack[-2:] = [(self.stack[-2], self.stack[-1])]
Guido van Rossum2e6a4b32007-05-04 19:56:22 +00001287 dispatch[TUPLE2[0]] = load_tuple2
Guido van Rossum44f0ea52003-01-28 04:14:51 +00001288
1289 def load_tuple3(self):
1290 self.stack[-3:] = [(self.stack[-3], self.stack[-2], self.stack[-1])]
Guido van Rossum2e6a4b32007-05-04 19:56:22 +00001291 dispatch[TUPLE3[0]] = load_tuple3
Guido van Rossum44f0ea52003-01-28 04:14:51 +00001292
Guido van Rossumb72cf2d1997-04-09 17:32:51 +00001293 def load_empty_list(self):
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001294 self.append([])
Guido van Rossum2e6a4b32007-05-04 19:56:22 +00001295 dispatch[EMPTY_LIST[0]] = load_empty_list
Guido van Rossumb72cf2d1997-04-09 17:32:51 +00001296
1297 def load_empty_dictionary(self):
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001298 self.append({})
Guido van Rossum2e6a4b32007-05-04 19:56:22 +00001299 dispatch[EMPTY_DICT[0]] = load_empty_dictionary
Guido van Rossumb72cf2d1997-04-09 17:32:51 +00001300
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01001301 def load_empty_set(self):
1302 self.append(set())
1303 dispatch[EMPTY_SET[0]] = load_empty_set
1304
1305 def load_frozenset(self):
Serhiy Storchaka59fb6342015-12-06 22:01:35 +02001306 items = self.pop_mark()
1307 self.append(frozenset(items))
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01001308 dispatch[FROZENSET[0]] = load_frozenset
1309
Guido van Rossumb72cf2d1997-04-09 17:32:51 +00001310 def load_list(self):
Serhiy Storchaka59fb6342015-12-06 22:01:35 +02001311 items = self.pop_mark()
1312 self.append(items)
Guido van Rossum2e6a4b32007-05-04 19:56:22 +00001313 dispatch[LIST[0]] = load_list
Guido van Rossumb72cf2d1997-04-09 17:32:51 +00001314
1315 def load_dict(self):
Serhiy Storchaka59fb6342015-12-06 22:01:35 +02001316 items = self.pop_mark()
Serhiy Storchakaa3e32c92013-04-14 13:37:02 +03001317 d = {items[i]: items[i+1]
1318 for i in range(0, len(items), 2)}
Serhiy Storchaka59fb6342015-12-06 22:01:35 +02001319 self.append(d)
Guido van Rossum2e6a4b32007-05-04 19:56:22 +00001320 dispatch[DICT[0]] = load_dict
Guido van Rossumb72cf2d1997-04-09 17:32:51 +00001321
Tim Petersd01c1e92003-01-30 15:41:46 +00001322 # INST and OBJ differ only in how they get a class object. It's not
1323 # only sensible to do the rest in a common routine, the two routines
1324 # previously diverged and grew different bugs.
1325 # klass is the class to instantiate, and k points to the topmost mark
1326 # object, following which are the arguments for klass.__init__.
Serhiy Storchaka59fb6342015-12-06 22:01:35 +02001327 def _instantiate(self, klass, args):
Alexander Belopolskyd92f0402010-07-17 22:50:45 +00001328 if (args or not isinstance(klass, type) or
1329 hasattr(klass, "__getinitargs__")):
Guido van Rossum743d17e1998-09-15 20:25:57 +00001330 try:
Guido van Rossumb26a97a2003-01-28 22:29:13 +00001331 value = klass(*args)
Guido van Rossumb940e112007-01-10 16:19:56 +00001332 except TypeError as err:
Guido van Rossum26d95c32007-08-27 23:18:54 +00001333 raise TypeError("in constructor for %s: %s" %
1334 (klass.__name__, str(err)), sys.exc_info()[2])
Alexander Belopolskyd92f0402010-07-17 22:50:45 +00001335 else:
1336 value = klass.__new__(klass)
Guido van Rossumb72cf2d1997-04-09 17:32:51 +00001337 self.append(value)
Tim Petersd01c1e92003-01-30 15:41:46 +00001338
1339 def load_inst(self):
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001340 module = self.readline()[:-1].decode("ascii")
1341 name = self.readline()[:-1].decode("ascii")
Tim Petersd01c1e92003-01-30 15:41:46 +00001342 klass = self.find_class(module, name)
Serhiy Storchaka59fb6342015-12-06 22:01:35 +02001343 self._instantiate(klass, self.pop_mark())
Guido van Rossum2e6a4b32007-05-04 19:56:22 +00001344 dispatch[INST[0]] = load_inst
Guido van Rossumb72cf2d1997-04-09 17:32:51 +00001345
1346 def load_obj(self):
Tim Petersd01c1e92003-01-30 15:41:46 +00001347 # Stack is ... markobject classobject arg1 arg2 ...
Serhiy Storchaka59fb6342015-12-06 22:01:35 +02001348 args = self.pop_mark()
1349 cls = args.pop(0)
1350 self._instantiate(cls, args)
Guido van Rossum2e6a4b32007-05-04 19:56:22 +00001351 dispatch[OBJ[0]] = load_obj
Guido van Rossumb72cf2d1997-04-09 17:32:51 +00001352
Guido van Rossum3a41c612003-01-28 15:10:22 +00001353 def load_newobj(self):
1354 args = self.stack.pop()
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01001355 cls = self.stack.pop()
Guido van Rossum3a41c612003-01-28 15:10:22 +00001356 obj = cls.__new__(cls, *args)
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01001357 self.append(obj)
Guido van Rossum2e6a4b32007-05-04 19:56:22 +00001358 dispatch[NEWOBJ[0]] = load_newobj
Guido van Rossum3a41c612003-01-28 15:10:22 +00001359
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01001360 def load_newobj_ex(self):
1361 kwargs = self.stack.pop()
1362 args = self.stack.pop()
1363 cls = self.stack.pop()
1364 obj = cls.__new__(cls, *args, **kwargs)
1365 self.append(obj)
1366 dispatch[NEWOBJ_EX[0]] = load_newobj_ex
1367
Guido van Rossumb72cf2d1997-04-09 17:32:51 +00001368 def load_global(self):
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001369 module = self.readline()[:-1].decode("utf-8")
1370 name = self.readline()[:-1].decode("utf-8")
Guido van Rossumb72cf2d1997-04-09 17:32:51 +00001371 klass = self.find_class(module, name)
1372 self.append(klass)
Guido van Rossum2e6a4b32007-05-04 19:56:22 +00001373 dispatch[GLOBAL[0]] = load_global
Guido van Rossumb72cf2d1997-04-09 17:32:51 +00001374
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01001375 def load_stack_global(self):
1376 name = self.stack.pop()
1377 module = self.stack.pop()
1378 if type(name) is not str or type(module) is not str:
1379 raise UnpicklingError("STACK_GLOBAL requires str")
1380 self.append(self.find_class(module, name))
1381 dispatch[STACK_GLOBAL[0]] = load_stack_global
1382
Guido van Rossum255f3ee2003-01-29 06:14:11 +00001383 def load_ext1(self):
Serhiy Storchakaa3e32c92013-04-14 13:37:02 +03001384 code = self.read(1)[0]
Guido van Rossum255f3ee2003-01-29 06:14:11 +00001385 self.get_extension(code)
Guido van Rossum2e6a4b32007-05-04 19:56:22 +00001386 dispatch[EXT1[0]] = load_ext1
Guido van Rossum255f3ee2003-01-29 06:14:11 +00001387
1388 def load_ext2(self):
Serhiy Storchakaa3e32c92013-04-14 13:37:02 +03001389 code, = unpack('<H', self.read(2))
Guido van Rossum255f3ee2003-01-29 06:14:11 +00001390 self.get_extension(code)
Guido van Rossum2e6a4b32007-05-04 19:56:22 +00001391 dispatch[EXT2[0]] = load_ext2
Guido van Rossum255f3ee2003-01-29 06:14:11 +00001392
1393 def load_ext4(self):
Serhiy Storchakaa3e32c92013-04-14 13:37:02 +03001394 code, = unpack('<i', self.read(4))
Guido van Rossum255f3ee2003-01-29 06:14:11 +00001395 self.get_extension(code)
Guido van Rossum2e6a4b32007-05-04 19:56:22 +00001396 dispatch[EXT4[0]] = load_ext4
Guido van Rossum255f3ee2003-01-29 06:14:11 +00001397
1398 def get_extension(self, code):
1399 nil = []
Guido van Rossumd4b920c2003-02-04 01:54:49 +00001400 obj = _extension_cache.get(code, nil)
Guido van Rossum255f3ee2003-01-29 06:14:11 +00001401 if obj is not nil:
1402 self.append(obj)
1403 return
Guido van Rossumd4b920c2003-02-04 01:54:49 +00001404 key = _inverted_registry.get(code)
Guido van Rossum255f3ee2003-01-29 06:14:11 +00001405 if not key:
Antoine Pitroubf6ecf92012-11-24 20:40:21 +01001406 if code <= 0: # note that 0 is forbidden
1407 # Corrupt or hostile pickle.
Alexandre Vassalotticc757172013-04-14 02:25:10 -07001408 raise UnpicklingError("EXT specifies code <= 0")
Guido van Rossum255f3ee2003-01-29 06:14:11 +00001409 raise ValueError("unregistered extension code %d" % code)
1410 obj = self.find_class(*key)
Guido van Rossumd4b920c2003-02-04 01:54:49 +00001411 _extension_cache[code] = obj
Guido van Rossum255f3ee2003-01-29 06:14:11 +00001412 self.append(obj)
1413
Guido van Rossumb72cf2d1997-04-09 17:32:51 +00001414 def find_class(self, module, name):
Antoine Pitroud9dfaa92009-06-04 20:32:06 +00001415 # Subclasses may override this.
1416 if self.proto < 3 and self.fix_imports:
1417 if (module, name) in _compat_pickle.NAME_MAPPING:
1418 module, name = _compat_pickle.NAME_MAPPING[(module, name)]
Serhiy Storchakabfe18242015-03-31 13:12:37 +03001419 elif module in _compat_pickle.IMPORT_MAPPING:
Antoine Pitroud9dfaa92009-06-04 20:32:06 +00001420 module = _compat_pickle.IMPORT_MAPPING[module]
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001421 __import__(module, level=0)
Serhiy Storchaka58e41342015-03-31 14:07:24 +03001422 if self.proto >= 4:
1423 return _getattribute(sys.modules[module], name)[0]
1424 else:
1425 return getattr(sys.modules[module], name)
Guido van Rossumb72cf2d1997-04-09 17:32:51 +00001426
1427 def load_reduce(self):
1428 stack = self.stack
Guido van Rossumb26a97a2003-01-28 22:29:13 +00001429 args = stack.pop()
1430 func = stack[-1]
Serhiy Storchakaa8d83f52015-12-01 00:39:25 +02001431 stack[-1] = func(*args)
Guido van Rossum2e6a4b32007-05-04 19:56:22 +00001432 dispatch[REDUCE[0]] = load_reduce
Guido van Rossuma48061a1995-01-10 00:31:14 +00001433
Guido van Rossumb72cf2d1997-04-09 17:32:51 +00001434 def load_pop(self):
Serhiy Storchaka59fb6342015-12-06 22:01:35 +02001435 if self.stack:
1436 del self.stack[-1]
1437 else:
1438 self.pop_mark()
Guido van Rossum2e6a4b32007-05-04 19:56:22 +00001439 dispatch[POP[0]] = load_pop
Guido van Rossum7b5430f1995-03-04 22:25:21 +00001440
Guido van Rossumb72cf2d1997-04-09 17:32:51 +00001441 def load_pop_mark(self):
Serhiy Storchaka59fb6342015-12-06 22:01:35 +02001442 self.pop_mark()
Guido van Rossum2e6a4b32007-05-04 19:56:22 +00001443 dispatch[POP_MARK[0]] = load_pop_mark
Guido van Rossuma48061a1995-01-10 00:31:14 +00001444
Guido van Rossumb72cf2d1997-04-09 17:32:51 +00001445 def load_dup(self):
Guido van Rossumb1062fc1998-03-31 17:00:46 +00001446 self.append(self.stack[-1])
Guido van Rossum2e6a4b32007-05-04 19:56:22 +00001447 dispatch[DUP[0]] = load_dup
Guido van Rossuma48061a1995-01-10 00:31:14 +00001448
Guido van Rossumb72cf2d1997-04-09 17:32:51 +00001449 def load_get(self):
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001450 i = int(self.readline()[:-1])
1451 self.append(self.memo[i])
Guido van Rossum2e6a4b32007-05-04 19:56:22 +00001452 dispatch[GET[0]] = load_get
Guido van Rossum78536471996-04-12 13:36:27 +00001453
Guido van Rossumb72cf2d1997-04-09 17:32:51 +00001454 def load_binget(self):
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001455 i = self.read(1)[0]
1456 self.append(self.memo[i])
Guido van Rossum2e6a4b32007-05-04 19:56:22 +00001457 dispatch[BINGET[0]] = load_binget
Guido van Rossum78536471996-04-12 13:36:27 +00001458
Serhiy Storchakaa3e32c92013-04-14 13:37:02 +03001459 def load_long_binget(self):
Antoine Pitroubf6ecf92012-11-24 20:40:21 +01001460 i, = unpack('<I', self.read(4))
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001461 self.append(self.memo[i])
Guido van Rossum2e6a4b32007-05-04 19:56:22 +00001462 dispatch[LONG_BINGET[0]] = load_long_binget
Guido van Rossum78536471996-04-12 13:36:27 +00001463
Guido van Rossumb72cf2d1997-04-09 17:32:51 +00001464 def load_put(self):
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001465 i = int(self.readline()[:-1])
Antoine Pitrou55549ec2011-08-30 00:27:10 +02001466 if i < 0:
1467 raise ValueError("negative PUT argument")
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001468 self.memo[i] = self.stack[-1]
Guido van Rossum2e6a4b32007-05-04 19:56:22 +00001469 dispatch[PUT[0]] = load_put
Guido van Rossuma48061a1995-01-10 00:31:14 +00001470
Guido van Rossumb72cf2d1997-04-09 17:32:51 +00001471 def load_binput(self):
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001472 i = self.read(1)[0]
Antoine Pitrou55549ec2011-08-30 00:27:10 +02001473 if i < 0:
1474 raise ValueError("negative BINPUT argument")
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001475 self.memo[i] = self.stack[-1]
Guido van Rossum2e6a4b32007-05-04 19:56:22 +00001476 dispatch[BINPUT[0]] = load_binput
Guido van Rossuma48061a1995-01-10 00:31:14 +00001477
Serhiy Storchakaa3e32c92013-04-14 13:37:02 +03001478 def load_long_binput(self):
Antoine Pitroubf6ecf92012-11-24 20:40:21 +01001479 i, = unpack('<I', self.read(4))
1480 if i > maxsize:
Antoine Pitrou55549ec2011-08-30 00:27:10 +02001481 raise ValueError("negative LONG_BINPUT argument")
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001482 self.memo[i] = self.stack[-1]
Guido van Rossum2e6a4b32007-05-04 19:56:22 +00001483 dispatch[LONG_BINPUT[0]] = load_long_binput
Guido van Rossuma48061a1995-01-10 00:31:14 +00001484
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01001485 def load_memoize(self):
1486 memo = self.memo
1487 memo[len(memo)] = self.stack[-1]
1488 dispatch[MEMOIZE[0]] = load_memoize
1489
Guido van Rossumb72cf2d1997-04-09 17:32:51 +00001490 def load_append(self):
1491 stack = self.stack
Raymond Hettinger46ac8eb2002-06-30 03:39:14 +00001492 value = stack.pop()
Guido van Rossumb72cf2d1997-04-09 17:32:51 +00001493 list = stack[-1]
1494 list.append(value)
Guido van Rossum2e6a4b32007-05-04 19:56:22 +00001495 dispatch[APPEND[0]] = load_append
Guido van Rossuma48061a1995-01-10 00:31:14 +00001496
Guido van Rossumb72cf2d1997-04-09 17:32:51 +00001497 def load_appends(self):
Serhiy Storchaka59fb6342015-12-06 22:01:35 +02001498 items = self.pop_mark()
1499 list_obj = self.stack[-1]
Serhiy Storchakabee09ae2017-02-02 11:12:47 +02001500 try:
1501 extend = list_obj.extend
1502 except AttributeError:
1503 pass
Alexandre Vassalotti1f7492c2013-04-20 13:19:46 -07001504 else:
Serhiy Storchakabee09ae2017-02-02 11:12:47 +02001505 extend(items)
1506 return
1507 # Even if the PEP 307 requires extend() and append() methods,
1508 # fall back on append() if the object has no extend() method
1509 # for backward compatibility.
1510 append = list_obj.append
1511 for item in items:
1512 append(item)
Guido van Rossum2e6a4b32007-05-04 19:56:22 +00001513 dispatch[APPENDS[0]] = load_appends
Tim Peters2344fae2001-01-15 00:50:52 +00001514
Guido van Rossumb72cf2d1997-04-09 17:32:51 +00001515 def load_setitem(self):
1516 stack = self.stack
Raymond Hettinger46ac8eb2002-06-30 03:39:14 +00001517 value = stack.pop()
1518 key = stack.pop()
Guido van Rossumb72cf2d1997-04-09 17:32:51 +00001519 dict = stack[-1]
1520 dict[key] = value
Guido van Rossum2e6a4b32007-05-04 19:56:22 +00001521 dispatch[SETITEM[0]] = load_setitem
Guido van Rossum0c891ce1995-03-14 15:09:05 +00001522
Guido van Rossumb72cf2d1997-04-09 17:32:51 +00001523 def load_setitems(self):
Serhiy Storchaka59fb6342015-12-06 22:01:35 +02001524 items = self.pop_mark()
1525 dict = self.stack[-1]
1526 for i in range(0, len(items), 2):
1527 dict[items[i]] = items[i + 1]
Guido van Rossum2e6a4b32007-05-04 19:56:22 +00001528 dispatch[SETITEMS[0]] = load_setitems
Guido van Rossuma48061a1995-01-10 00:31:14 +00001529
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01001530 def load_additems(self):
Serhiy Storchaka59fb6342015-12-06 22:01:35 +02001531 items = self.pop_mark()
1532 set_obj = self.stack[-1]
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01001533 if isinstance(set_obj, set):
1534 set_obj.update(items)
1535 else:
1536 add = set_obj.add
1537 for item in items:
1538 add(item)
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01001539 dispatch[ADDITEMS[0]] = load_additems
1540
Guido van Rossumb72cf2d1997-04-09 17:32:51 +00001541 def load_build(self):
1542 stack = self.stack
Guido van Rossumac5b5d22003-01-28 22:01:16 +00001543 state = stack.pop()
Guido van Rossumb72cf2d1997-04-09 17:32:51 +00001544 inst = stack[-1]
Guido van Rossumac5b5d22003-01-28 22:01:16 +00001545 setstate = getattr(inst, "__setstate__", None)
Serhiy Storchakaa3e32c92013-04-14 13:37:02 +03001546 if setstate is not None:
Guido van Rossumac5b5d22003-01-28 22:01:16 +00001547 setstate(state)
1548 return
1549 slotstate = None
1550 if isinstance(state, tuple) and len(state) == 2:
1551 state, slotstate = state
1552 if state:
Alexandre Vassalottiebfecfd2009-05-25 18:50:33 +00001553 inst_dict = inst.__dict__
Antoine Pitroua9f48a02009-05-02 21:41:14 +00001554 intern = sys.intern
Alexandre Vassalottiebfecfd2009-05-25 18:50:33 +00001555 for k, v in state.items():
1556 if type(k) is str:
1557 inst_dict[intern(k)] = v
1558 else:
1559 inst_dict[k] = v
Guido van Rossumac5b5d22003-01-28 22:01:16 +00001560 if slotstate:
1561 for k, v in slotstate.items():
1562 setattr(inst, k, v)
Guido van Rossum2e6a4b32007-05-04 19:56:22 +00001563 dispatch[BUILD[0]] = load_build
Guido van Rossuma48061a1995-01-10 00:31:14 +00001564
Guido van Rossumb72cf2d1997-04-09 17:32:51 +00001565 def load_mark(self):
Serhiy Storchaka59fb6342015-12-06 22:01:35 +02001566 self.metastack.append(self.stack)
1567 self.stack = []
1568 self.append = self.stack.append
Guido van Rossum2e6a4b32007-05-04 19:56:22 +00001569 dispatch[MARK[0]] = load_mark
Guido van Rossuma48061a1995-01-10 00:31:14 +00001570
Guido van Rossumb72cf2d1997-04-09 17:32:51 +00001571 def load_stop(self):
Raymond Hettinger46ac8eb2002-06-30 03:39:14 +00001572 value = self.stack.pop()
Guido van Rossumff871742000-12-13 18:11:56 +00001573 raise _Stop(value)
Guido van Rossum2e6a4b32007-05-04 19:56:22 +00001574 dispatch[STOP[0]] = load_stop
Guido van Rossuma48061a1995-01-10 00:31:14 +00001575
Guido van Rossumd6c9e632003-01-28 03:49:52 +00001576
Guido van Rossum0c891ce1995-03-14 15:09:05 +00001577# Shorthands
1578
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01001579def _dump(obj, file, protocol=None, *, fix_imports=True):
1580 _Pickler(file, protocol, fix_imports=fix_imports).dump(obj)
Guido van Rossum0c891ce1995-03-14 15:09:05 +00001581
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01001582def _dumps(obj, protocol=None, *, fix_imports=True):
Guido van Rossumcfe5f202007-05-08 21:26:54 +00001583 f = io.BytesIO()
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01001584 _Pickler(f, protocol, fix_imports=fix_imports).dump(obj)
Guido van Rossumcfe5f202007-05-08 21:26:54 +00001585 res = f.getvalue()
Guido van Rossum98297ee2007-11-06 21:34:58 +00001586 assert isinstance(res, bytes_types)
Guido van Rossumcfe5f202007-05-08 21:26:54 +00001587 return res
Guido van Rossum0c891ce1995-03-14 15:09:05 +00001588
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01001589def _load(file, *, fix_imports=True, encoding="ASCII", errors="strict"):
1590 return _Unpickler(file, fix_imports=fix_imports,
Antoine Pitroud9dfaa92009-06-04 20:32:06 +00001591 encoding=encoding, errors=errors).load()
Guido van Rossum0c891ce1995-03-14 15:09:05 +00001592
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01001593def _loads(s, *, fix_imports=True, encoding="ASCII", errors="strict"):
Guido van Rossumcfe5f202007-05-08 21:26:54 +00001594 if isinstance(s, str):
1595 raise TypeError("Can't load pickle from unicode string")
1596 file = io.BytesIO(s)
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01001597 return _Unpickler(file, fix_imports=fix_imports,
1598 encoding=encoding, errors=errors).load()
Guido van Rossumd6c9e632003-01-28 03:49:52 +00001599
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00001600# Use the faster _pickle if possible
1601try:
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01001602 from _pickle import (
1603 PickleError,
1604 PicklingError,
1605 UnpicklingError,
1606 Pickler,
1607 Unpickler,
1608 dump,
1609 dumps,
1610 load,
1611 loads
1612 )
Brett Cannoncd171c82013-07-04 17:43:24 -04001613except ImportError:
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00001614 Pickler, Unpickler = _Pickler, _Unpickler
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01001615 dump, dumps, load, loads = _dump, _dumps, _load, _loads
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00001616
Guido van Rossumd6c9e632003-01-28 03:49:52 +00001617# Doctest
Guido van Rossumd6c9e632003-01-28 03:49:52 +00001618def _test():
1619 import doctest
1620 return doctest.testmod()
1621
1622if __name__ == "__main__":
Florent Xicluna54540ec2011-11-04 08:29:17 +01001623 import argparse
Alexander Belopolsky455f7bd2010-07-27 23:02:38 +00001624 parser = argparse.ArgumentParser(
1625 description='display contents of the pickle files')
1626 parser.add_argument(
1627 'pickle_file', type=argparse.FileType('br'),
1628 nargs='*', help='the pickle file')
1629 parser.add_argument(
1630 '-t', '--test', action='store_true',
1631 help='run self-test suite')
1632 parser.add_argument(
1633 '-v', action='store_true',
1634 help='run verbosely; only affects self-test run')
1635 args = parser.parse_args()
1636 if args.test:
1637 _test()
1638 else:
1639 if not args.pickle_file:
1640 parser.print_help()
1641 else:
1642 import pprint
1643 for f in args.pickle_file:
1644 obj = load(f)
1645 pprint.pprint(obj)