blob: c8370c9f7e7ec60b1b608d7570ad6e3982ef025a [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:
204 with f.getbuffer() as data:
205 n = len(data)
206 write = self.file_write
207 write(FRAME)
208 write(pack("<Q", n))
209 write(data)
210 f.seek(0)
211 f.truncate()
212
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +0100213 def write(self, data):
Alexandre Vassalottib6a2f2a2013-11-23 20:30:03 -0800214 if self.current_frame:
215 return self.current_frame.write(data)
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +0100216 else:
Alexandre Vassalottib6a2f2a2013-11-23 20:30:03 -0800217 return self.file_write(data)
218
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +0100219
220class _Unframer:
221
222 def __init__(self, file_read, file_readline, file_tell=None):
223 self.file_read = file_read
224 self.file_readline = file_readline
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +0100225 self.current_frame = None
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +0100226
227 def read(self, n):
Alexandre Vassalottib6a2f2a2013-11-23 20:30:03 -0800228 if self.current_frame:
229 data = self.current_frame.read(n)
230 if not data and n != 0:
231 self.current_frame = None
232 return self.file_read(n)
233 if len(data) < n:
234 raise UnpicklingError(
235 "pickle exhausted before end of frame")
236 return data
237 else:
238 return self.file_read(n)
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +0100239
240 def readline(self):
Alexandre Vassalottib6a2f2a2013-11-23 20:30:03 -0800241 if self.current_frame:
242 data = self.current_frame.readline()
243 if not data:
244 self.current_frame = None
245 return self.file_readline()
Serhiy Storchaka21d75332015-01-26 10:37:01 +0200246 if data[-1] != b'\n'[0]:
Alexandre Vassalottib6a2f2a2013-11-23 20:30:03 -0800247 raise UnpicklingError(
248 "pickle exhausted before end of frame")
249 return data
250 else:
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +0100251 return self.file_readline()
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +0100252
Alexandre Vassalottib6a2f2a2013-11-23 20:30:03 -0800253 def load_frame(self, frame_size):
254 if self.current_frame and self.current_frame.read() != b'':
255 raise UnpicklingError(
256 "beginning of a new frame before end of current frame")
257 self.current_frame = io.BytesIO(self.file_read(frame_size))
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +0100258
259
260# Tools used for pickling.
261
Serhiy Storchaka58e41342015-03-31 14:07:24 +0300262def _getattribute(obj, name):
263 for subpath in name.split('.'):
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +0100264 if subpath == '<locals>':
265 raise AttributeError("Can't get local attribute {!r} on {!r}"
266 .format(name, obj))
267 try:
Serhiy Storchaka58e41342015-03-31 14:07:24 +0300268 parent = obj
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +0100269 obj = getattr(obj, subpath)
270 except AttributeError:
271 raise AttributeError("Can't get attribute {!r} on {!r}"
272 .format(name, obj))
Serhiy Storchaka58e41342015-03-31 14:07:24 +0300273 return obj, parent
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +0100274
Serhiy Storchaka58e41342015-03-31 14:07:24 +0300275def whichmodule(obj, name):
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +0100276 """Find the module an object belong to."""
277 module_name = getattr(obj, '__module__', None)
278 if module_name is not None:
279 return module_name
Antoine Pitroue1618492014-10-04 22:15:27 +0200280 # Protect the iteration by using a list copy of sys.modules against dynamic
281 # modules that trigger imports of other modules upon calls to getattr.
282 for module_name, module in list(sys.modules.items()):
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +0100283 if module_name == '__main__' or module is None:
284 continue
285 try:
Serhiy Storchaka58e41342015-03-31 14:07:24 +0300286 if _getattribute(module, name)[0] is obj:
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +0100287 return module_name
288 except AttributeError:
289 pass
290 return '__main__'
291
292def encode_long(x):
293 r"""Encode a long to a two's complement little-endian binary string.
294 Note that 0 is a special case, returning an empty string, to save a
295 byte in the LONG1 pickling context.
296
297 >>> encode_long(0)
298 b''
299 >>> encode_long(255)
300 b'\xff\x00'
301 >>> encode_long(32767)
302 b'\xff\x7f'
303 >>> encode_long(-256)
304 b'\x00\xff'
305 >>> encode_long(-32768)
306 b'\x00\x80'
307 >>> encode_long(-128)
308 b'\x80'
309 >>> encode_long(127)
310 b'\x7f'
311 >>>
312 """
313 if x == 0:
314 return b''
315 nbytes = (x.bit_length() >> 3) + 1
316 result = x.to_bytes(nbytes, byteorder='little', signed=True)
317 if x < 0 and nbytes > 1:
318 if result[-1] == 0xff and (result[-2] & 0x80) != 0:
319 result = result[:-1]
320 return result
321
322def decode_long(data):
323 r"""Decode a long from a two's complement little-endian binary string.
324
325 >>> decode_long(b'')
326 0
327 >>> decode_long(b"\xff\x00")
328 255
329 >>> decode_long(b"\xff\x7f")
330 32767
331 >>> decode_long(b"\x00\xff")
332 -256
333 >>> decode_long(b"\x00\x80")
334 -32768
335 >>> decode_long(b"\x80")
336 -128
337 >>> decode_long(b"\x7f")
338 127
339 """
340 return int.from_bytes(data, byteorder='little', signed=True)
341
Skip Montanaro23bafc62001-02-18 03:10:09 +0000342
Guido van Rossum1be31752003-01-28 15:19:53 +0000343# Pickling machinery
344
Alexandre Vassalottica2d6102008-06-12 18:26:05 +0000345class _Pickler:
Guido van Rossuma48061a1995-01-10 00:31:14 +0000346
Antoine Pitroud9dfaa92009-06-04 20:32:06 +0000347 def __init__(self, file, protocol=None, *, fix_imports=True):
Guido van Rossum2e6a4b32007-05-04 19:56:22 +0000348 """This takes a binary file for writing a pickle data stream.
349
Alexandre Vassalottid05c9ff2013-12-07 01:09:27 -0800350 The optional *protocol* argument tells the pickler to use the
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +0100351 given protocol; supported protocols are 0, 1, 2, 3 and 4. The
Alexandre Vassalottid05c9ff2013-12-07 01:09:27 -0800352 default protocol is 3; a backward-incompatible protocol designed
353 for Python 3.
Guido van Rossumf29d3d62003-01-27 22:47:53 +0000354
Guido van Rossum7eff63a2003-01-31 19:42:31 +0000355 Specifying a negative protocol version selects the highest
Tim Peters5bd2a792003-02-01 16:45:06 +0000356 protocol version supported. The higher the protocol used, the
357 more recent the version of Python needed to read the pickle
358 produced.
Raymond Hettingeraef22fb2002-05-29 16:18:42 +0000359
Alexandre Vassalottid05c9ff2013-12-07 01:09:27 -0800360 The *file* argument must have a write() method that accepts a
361 single bytes argument. It can thus be a file object opened for
Martin Panter7462b6492015-11-02 03:37:02 +0000362 binary writing, an io.BytesIO instance, or any other custom
Alexandre Vassalottid05c9ff2013-12-07 01:09:27 -0800363 object that meets this interface.
Antoine Pitroud9dfaa92009-06-04 20:32:06 +0000364
Alexandre Vassalottid05c9ff2013-12-07 01:09:27 -0800365 If *fix_imports* is True and *protocol* is less than 3, pickle
366 will try to map the new Python 3 names to the old module names
367 used in Python 2, so that the pickle data stream is readable
368 with Python 2.
Raymond Hettingeraef22fb2002-05-29 16:18:42 +0000369 """
Guido van Rossumcf117b02003-02-09 17:19:41 +0000370 if protocol is None:
Guido van Rossum2e6a4b32007-05-04 19:56:22 +0000371 protocol = DEFAULT_PROTOCOL
Guido van Rossumcf117b02003-02-09 17:19:41 +0000372 if protocol < 0:
Tim Peters8587b3c2003-02-13 15:44:41 +0000373 protocol = HIGHEST_PROTOCOL
374 elif not 0 <= protocol <= HIGHEST_PROTOCOL:
375 raise ValueError("pickle protocol must be <= %d" % HIGHEST_PROTOCOL)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +0000376 try:
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +0100377 self._file_write = file.write
Alexandre Vassalottica2d6102008-06-12 18:26:05 +0000378 except AttributeError:
379 raise TypeError("file must have a 'write' attribute")
Alexandre Vassalottib6a2f2a2013-11-23 20:30:03 -0800380 self.framer = _Framer(self._file_write)
381 self.write = self.framer.write
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000382 self.memo = {}
Guido van Rossumcf117b02003-02-09 17:19:41 +0000383 self.proto = int(protocol)
384 self.bin = protocol >= 1
Guido van Rossum5d9113d2003-01-29 17:58:45 +0000385 self.fast = 0
Antoine Pitroud9dfaa92009-06-04 20:32:06 +0000386 self.fix_imports = fix_imports and protocol < 3
Guido van Rossuma48061a1995-01-10 00:31:14 +0000387
Fred Drake7f781c92002-05-01 20:33:53 +0000388 def clear_memo(self):
Raymond Hettingeraef22fb2002-05-29 16:18:42 +0000389 """Clears the pickler's "memo".
390
391 The memo is the data structure that remembers which objects the
Alexandre Vassalottid05c9ff2013-12-07 01:09:27 -0800392 pickler has already seen, so that shared or recursive objects
393 are pickled by reference and not by value. This method is
394 useful when re-using picklers.
Raymond Hettingeraef22fb2002-05-29 16:18:42 +0000395 """
Fred Drake7f781c92002-05-01 20:33:53 +0000396 self.memo.clear()
397
Guido van Rossum3a41c612003-01-28 15:10:22 +0000398 def dump(self, obj):
Tim Peters5bd2a792003-02-01 16:45:06 +0000399 """Write a pickled representation of obj to the open file."""
Alexandre Vassalotti3cfcab92008-12-27 09:30:39 +0000400 # Check whether Pickler was initialized correctly. This is
401 # only needed to mimic the behavior of _pickle.Pickler.dump().
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +0100402 if not hasattr(self, "_file_write"):
Alexandre Vassalotti3cfcab92008-12-27 09:30:39 +0000403 raise PicklingError("Pickler.__init__() was not called by "
404 "%s.__init__()" % (self.__class__.__name__,))
Guido van Rossumd6c9e632003-01-28 03:49:52 +0000405 if self.proto >= 2:
Alexandre Vassalottib6a2f2a2013-11-23 20:30:03 -0800406 self.write(PROTO + pack("<B", self.proto))
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +0100407 if self.proto >= 4:
Alexandre Vassalottib6a2f2a2013-11-23 20:30:03 -0800408 self.framer.start_framing()
Guido van Rossum3a41c612003-01-28 15:10:22 +0000409 self.save(obj)
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000410 self.write(STOP)
Alexandre Vassalottib6a2f2a2013-11-23 20:30:03 -0800411 self.framer.end_framing()
Guido van Rossuma48061a1995-01-10 00:31:14 +0000412
Jeremy Hylton3422c992003-01-24 19:29:52 +0000413 def memoize(self, obj):
414 """Store an object in the memo."""
415
Tim Peterse46b73f2003-01-27 21:22:10 +0000416 # The Pickler memo is a dictionary mapping object ids to 2-tuples
417 # that contain the Unpickler memo key and the object being memoized.
418 # The memo key is written to the pickle and will become
Jeremy Hylton3422c992003-01-24 19:29:52 +0000419 # the key in the Unpickler's memo. The object is stored in the
Tim Peterse46b73f2003-01-27 21:22:10 +0000420 # Pickler memo so that transient objects are kept alive during
421 # pickling.
Jeremy Hylton3422c992003-01-24 19:29:52 +0000422
Tim Peterse46b73f2003-01-27 21:22:10 +0000423 # The use of the Unpickler memo length as the memo key is just a
424 # convention. The only requirement is that the memo values be unique.
425 # But there appears no advantage to any other scheme, and this
Tim Peterscbd0a322003-01-28 00:24:43 +0000426 # scheme allows the Unpickler memo to be implemented as a plain (but
Tim Peterse46b73f2003-01-27 21:22:10 +0000427 # growable) array, indexed by memo key.
Guido van Rossum5d9113d2003-01-29 17:58:45 +0000428 if self.fast:
429 return
Guido van Rossum9b40e802003-01-30 06:37:41 +0000430 assert id(obj) not in self.memo
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +0100431 idx = len(self.memo)
432 self.write(self.put(idx))
433 self.memo[id(obj)] = idx, obj
Jeremy Hylton3422c992003-01-24 19:29:52 +0000434
Tim Petersbb38e302003-01-27 21:25:41 +0000435 # Return a PUT (BINPUT, LONG_BINPUT) opcode string, with argument i.
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +0100436 def put(self, idx):
437 if self.proto >= 4:
438 return MEMOIZE
439 elif self.bin:
440 if idx < 256:
441 return BINPUT + pack("<B", idx)
Guido van Rossum5c938d02003-01-28 03:03:08 +0000442 else:
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +0100443 return LONG_BINPUT + pack("<I", idx)
444 else:
445 return PUT + repr(idx).encode("ascii") + b'\n'
Guido van Rossuma48061a1995-01-10 00:31:14 +0000446
Tim Petersbb38e302003-01-27 21:25:41 +0000447 # Return a GET (BINGET, LONG_BINGET) opcode string, with argument i.
Serhiy Storchakaa3e32c92013-04-14 13:37:02 +0300448 def get(self, i):
Tim Petersc32d8242001-04-10 02:48:53 +0000449 if self.bin:
Tim Petersc32d8242001-04-10 02:48:53 +0000450 if i < 256:
Serhiy Storchakaa3e32c92013-04-14 13:37:02 +0300451 return BINGET + pack("<B", i)
Guido van Rossum5c938d02003-01-28 03:03:08 +0000452 else:
Antoine Pitroubf6ecf92012-11-24 20:40:21 +0100453 return LONG_BINGET + pack("<I", i)
Guido van Rossuma48061a1995-01-10 00:31:14 +0000454
Guido van Rossum39478e82007-08-27 17:23:59 +0000455 return GET + repr(i).encode("ascii") + b'\n'
Tim Peters2344fae2001-01-15 00:50:52 +0000456
Alexandre Vassalottica2d6102008-06-12 18:26:05 +0000457 def save(self, obj, save_persistent_id=True):
Alexandre Vassalottib6a2f2a2013-11-23 20:30:03 -0800458 self.framer.commit_frame()
459
Guido van Rossumbc64e222003-01-28 16:34:19 +0000460 # Check for persistent id (defined by a subclass)
Guido van Rossum3a41c612003-01-28 15:10:22 +0000461 pid = self.persistent_id(obj)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +0000462 if pid is not None and save_persistent_id:
Jeremy Hylton5e0f4e72002-11-13 22:01:27 +0000463 self.save_pers(pid)
464 return
Guido van Rossuma48061a1995-01-10 00:31:14 +0000465
Guido van Rossumbc64e222003-01-28 16:34:19 +0000466 # Check the memo
467 x = self.memo.get(id(obj))
Serhiy Storchakaa3e32c92013-04-14 13:37:02 +0300468 if x is not None:
Guido van Rossumbc64e222003-01-28 16:34:19 +0000469 self.write(self.get(x[0]))
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000470 return
471
Guido van Rossumbc64e222003-01-28 16:34:19 +0000472 # Check the type dispatch table
Guido van Rossum3a41c612003-01-28 15:10:22 +0000473 t = type(obj)
Guido van Rossumbc64e222003-01-28 16:34:19 +0000474 f = self.dispatch.get(t)
Serhiy Storchakaa3e32c92013-04-14 13:37:02 +0300475 if f is not None:
Guido van Rossumbc64e222003-01-28 16:34:19 +0000476 f(self, obj) # Call unbound method with explicit self
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000477 return
478
Antoine Pitrou8d3c2902012-03-04 18:31:48 +0100479 # Check private dispatch table if any, or else copyreg.dispatch_table
480 reduce = getattr(self, 'dispatch_table', dispatch_table).get(t)
Serhiy Storchakaa3e32c92013-04-14 13:37:02 +0300481 if reduce is not None:
Guido van Rossumc53f0092003-02-18 22:05:12 +0000482 rv = reduce(obj)
483 else:
Antoine Pitrouffd41d92011-10-04 09:23:04 +0200484 # Check for a class with a custom metaclass; treat as regular class
485 try:
486 issc = issubclass(t, type)
487 except TypeError: # t is not a class (old Boost; see SF #502085)
488 issc = False
489 if issc:
490 self.save_global(obj)
491 return
492
Guido van Rossumc53f0092003-02-18 22:05:12 +0000493 # Check for a __reduce_ex__ method, fall back to __reduce__
494 reduce = getattr(obj, "__reduce_ex__", None)
Serhiy Storchakaa3e32c92013-04-14 13:37:02 +0300495 if reduce is not None:
Guido van Rossumc53f0092003-02-18 22:05:12 +0000496 rv = reduce(self.proto)
497 else:
498 reduce = getattr(obj, "__reduce__", None)
Serhiy Storchakaa3e32c92013-04-14 13:37:02 +0300499 if reduce is not None:
Guido van Rossumc53f0092003-02-18 22:05:12 +0000500 rv = reduce()
501 else:
502 raise PicklingError("Can't pickle %r object: %r" %
503 (t.__name__, obj))
Tim Petersb32a8312003-01-28 00:48:09 +0000504
Guido van Rossumbc64e222003-01-28 16:34:19 +0000505 # Check for string returned by reduce(), meaning "save as global"
Guido van Rossum3172c5d2007-10-16 18:12:55 +0000506 if isinstance(rv, str):
Guido van Rossumbc64e222003-01-28 16:34:19 +0000507 self.save_global(obj, rv)
Tim Petersb32a8312003-01-28 00:48:09 +0000508 return
509
Guido van Rossumbc64e222003-01-28 16:34:19 +0000510 # Assert that reduce() returned a tuple
Guido van Rossum13257902007-06-07 23:15:56 +0000511 if not isinstance(rv, tuple):
Guido van Rossumbc64e222003-01-28 16:34:19 +0000512 raise PicklingError("%s must return string or tuple" % reduce)
Tim Petersb32a8312003-01-28 00:48:09 +0000513
Guido van Rossum25cb7df2003-01-31 18:53:21 +0000514 # Assert that it returned an appropriately sized tuple
Guido van Rossumbc64e222003-01-28 16:34:19 +0000515 l = len(rv)
Guido van Rossum25cb7df2003-01-31 18:53:21 +0000516 if not (2 <= l <= 5):
Guido van Rossumbc64e222003-01-28 16:34:19 +0000517 raise PicklingError("Tuple returned by %s must have "
Guido van Rossum25cb7df2003-01-31 18:53:21 +0000518 "two to five elements" % reduce)
Tim Petersb32a8312003-01-28 00:48:09 +0000519
Guido van Rossumbc64e222003-01-28 16:34:19 +0000520 # Save the reduce() output and finally memoize the object
Guido van Rossum25cb7df2003-01-31 18:53:21 +0000521 self.save_reduce(obj=obj, *rv)
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000522
Guido van Rossum3a41c612003-01-28 15:10:22 +0000523 def persistent_id(self, obj):
Guido van Rossumbc64e222003-01-28 16:34:19 +0000524 # This exists so a subclass can override it
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000525 return None
526
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000527 def save_pers(self, pid):
Guido van Rossumbc64e222003-01-28 16:34:19 +0000528 # Save a persistent id reference
Tim Petersbd1cdb92003-01-28 01:03:10 +0000529 if self.bin:
Alexandre Vassalottica2d6102008-06-12 18:26:05 +0000530 self.save(pid, save_persistent_id=False)
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000531 self.write(BINPERSID)
Tim Petersbd1cdb92003-01-28 01:03:10 +0000532 else:
Serhiy Storchakadec25af2016-07-17 11:24:17 +0300533 try:
534 self.write(PERSID + str(pid).encode("ascii") + b'\n')
535 except UnicodeEncodeError:
536 raise PicklingError(
537 "persistent IDs in protocol 0 must be ASCII strings")
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000538
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +0100539 def save_reduce(self, func, args, state=None, listitems=None,
540 dictitems=None, obj=None):
Jeremy Hyltone3a565e2003-06-29 16:59:59 +0000541 # This API is called by some subclasses
Guido van Rossumbc64e222003-01-28 16:34:19 +0000542
Guido van Rossum13257902007-06-07 23:15:56 +0000543 if not isinstance(args, tuple):
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +0100544 raise PicklingError("args from save_reduce() must be a tuple")
Florent Xicluna5d1155c2011-10-28 14:45:05 +0200545 if not callable(func):
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +0100546 raise PicklingError("func from save_reduce() must be callable")
Guido van Rossumbc64e222003-01-28 16:34:19 +0000547
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000548 save = self.save
Guido van Rossumbc64e222003-01-28 16:34:19 +0000549 write = self.write
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000550
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +0100551 func_name = getattr(func, "__name__", "")
Serhiy Storchaka0d554d72015-10-10 22:42:18 +0300552 if self.proto >= 2 and func_name == "__newobj_ex__":
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +0100553 cls, args, kwargs = args
554 if not hasattr(cls, "__new__"):
555 raise PicklingError("args[0] from {} args has no __new__"
556 .format(func_name))
557 if obj is not None and cls is not obj.__class__:
558 raise PicklingError("args[0] from {} args has the wrong class"
559 .format(func_name))
Serhiy Storchaka0d554d72015-10-10 22:42:18 +0300560 if self.proto >= 4:
561 save(cls)
562 save(args)
563 save(kwargs)
564 write(NEWOBJ_EX)
565 else:
566 func = partial(cls.__new__, cls, *args, **kwargs)
567 save(func)
568 save(())
569 write(REDUCE)
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +0100570 elif self.proto >= 2 and func_name == "__newobj__":
571 # A __reduce__ implementation can direct protocol 2 or newer to
Guido van Rossumd053b4b2003-01-31 16:51:45 +0000572 # use the more efficient NEWOBJ opcode, while still
573 # allowing protocol 0 and 1 to work normally. For this to
574 # work, the function returned by __reduce__ should be
575 # called __newobj__, and its first argument should be a
Florent Xiclunaaa6c1d22011-12-12 18:54:29 +0100576 # class. The implementation for __newobj__
Guido van Rossumd053b4b2003-01-31 16:51:45 +0000577 # should be as follows, although pickle has no way to
578 # verify this:
579 #
580 # def __newobj__(cls, *args):
581 # return cls.__new__(cls, *args)
582 #
583 # Protocols 0 and 1 will pickle a reference to __newobj__,
584 # while protocol 2 (and above) will pickle a reference to
585 # cls, the remaining args tuple, and the NEWOBJ code,
586 # which calls cls.__new__(cls, *args) at unpickling time
587 # (see load_newobj below). If __reduce__ returns a
588 # three-tuple, the state from the third tuple item will be
589 # pickled regardless of the protocol, calling __setstate__
590 # at unpickling time (see load_build below).
591 #
592 # Note that no standard __newobj__ implementation exists;
593 # you have to provide your own. This is to enforce
594 # compatibility with Python 2.2 (pickles written using
595 # protocol 0 or 1 in Python 2.3 should be unpicklable by
596 # Python 2.2).
597 cls = args[0]
598 if not hasattr(cls, "__new__"):
599 raise PicklingError(
600 "args[0] from __newobj__ args has no __new__")
Guido van Rossumf7f45172003-01-31 17:17:49 +0000601 if obj is not None and cls is not obj.__class__:
602 raise PicklingError(
603 "args[0] from __newobj__ args has the wrong class")
Guido van Rossumd053b4b2003-01-31 16:51:45 +0000604 args = args[1:]
605 save(cls)
606 save(args)
607 write(NEWOBJ)
608 else:
609 save(func)
610 save(args)
611 write(REDUCE)
Tim Peters2344fae2001-01-15 00:50:52 +0000612
Guido van Rossumf7f45172003-01-31 17:17:49 +0000613 if obj is not None:
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +0100614 # If the object is already in the memo, this means it is
615 # recursive. In this case, throw away everything we put on the
616 # stack, and fetch the object back from the memo.
617 if id(obj) in self.memo:
618 write(POP + self.get(self.memo[id(obj)][0]))
619 else:
620 self.memoize(obj)
Guido van Rossumf7f45172003-01-31 17:17:49 +0000621
Guido van Rossum25cb7df2003-01-31 18:53:21 +0000622 # More new special cases (that work with older protocols as
623 # well): when __reduce__ returns a tuple with 4 or 5 items,
624 # the 4th and 5th item should be iterators that provide list
625 # items and dict items (as (key, value) tuples), or None.
626
627 if listitems is not None:
628 self._batch_appends(listitems)
629
630 if dictitems is not None:
631 self._batch_setitems(dictitems)
632
Tim Petersc32d8242001-04-10 02:48:53 +0000633 if state is not None:
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000634 save(state)
635 write(BUILD)
636
Guido van Rossumbc64e222003-01-28 16:34:19 +0000637 # Methods below this point are dispatched through the dispatch table
638
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000639 dispatch = {}
640
Guido van Rossum3a41c612003-01-28 15:10:22 +0000641 def save_none(self, obj):
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000642 self.write(NONE)
Guido van Rossum13257902007-06-07 23:15:56 +0000643 dispatch[type(None)] = save_none
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000644
Guido van Rossum3a41c612003-01-28 15:10:22 +0000645 def save_bool(self, obj):
Guido van Rossum7d97d312003-01-28 04:25:27 +0000646 if self.proto >= 2:
Serhiy Storchakaa3e32c92013-04-14 13:37:02 +0300647 self.write(NEWTRUE if obj else NEWFALSE)
Guido van Rossum7d97d312003-01-28 04:25:27 +0000648 else:
Serhiy Storchakaa3e32c92013-04-14 13:37:02 +0300649 self.write(TRUE if obj else FALSE)
Guido van Rossum77f6a652002-04-03 22:41:51 +0000650 dispatch[bool] = save_bool
651
Serhiy Storchakaa3e32c92013-04-14 13:37:02 +0300652 def save_long(self, obj):
Guido van Rossumddefaf32007-01-14 03:31:43 +0000653 if self.bin:
654 # If the int is small enough to fit in a signed 4-byte 2's-comp
655 # format, we can store it more efficiently than the general
656 # case.
657 # First one- and two-byte unsigned ints:
658 if obj >= 0:
659 if obj <= 0xff:
Serhiy Storchakaa3e32c92013-04-14 13:37:02 +0300660 self.write(BININT1 + pack("<B", obj))
Guido van Rossumddefaf32007-01-14 03:31:43 +0000661 return
662 if obj <= 0xffff:
Serhiy Storchakaa3e32c92013-04-14 13:37:02 +0300663 self.write(BININT2 + pack("<H", obj))
Guido van Rossumddefaf32007-01-14 03:31:43 +0000664 return
665 # Next check for 4-byte signed ints:
Serhiy Storchakaa3e32c92013-04-14 13:37:02 +0300666 if -0x80000000 <= obj <= 0x7fffffff:
Guido van Rossumddefaf32007-01-14 03:31:43 +0000667 self.write(BININT + pack("<i", obj))
668 return
Guido van Rossumd6c9e632003-01-28 03:49:52 +0000669 if self.proto >= 2:
Guido van Rossum2e6a4b32007-05-04 19:56:22 +0000670 encoded = encode_long(obj)
671 n = len(encoded)
Guido van Rossumd6c9e632003-01-28 03:49:52 +0000672 if n < 256:
Serhiy Storchakaa3e32c92013-04-14 13:37:02 +0300673 self.write(LONG1 + pack("<B", n) + encoded)
Guido van Rossumd6c9e632003-01-28 03:49:52 +0000674 else:
Guido van Rossum2e6a4b32007-05-04 19:56:22 +0000675 self.write(LONG4 + pack("<i", n) + encoded)
Tim Petersee1a53c2003-02-02 02:57:53 +0000676 return
Mark Dickinson8dd05142009-01-20 20:43:58 +0000677 self.write(LONG + repr(obj).encode("ascii") + b'L\n')
Guido van Rossum13257902007-06-07 23:15:56 +0000678 dispatch[int] = save_long
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000679
Serhiy Storchakaa3e32c92013-04-14 13:37:02 +0300680 def save_float(self, obj):
Guido van Rossumd3703791998-10-22 20:15:36 +0000681 if self.bin:
Guido van Rossum3a41c612003-01-28 15:10:22 +0000682 self.write(BINFLOAT + pack('>d', obj))
Guido van Rossumd3703791998-10-22 20:15:36 +0000683 else:
Guido van Rossum39478e82007-08-27 17:23:59 +0000684 self.write(FLOAT + repr(obj).encode("ascii") + b'\n')
Guido van Rossum13257902007-06-07 23:15:56 +0000685 dispatch[float] = save_float
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000686
Serhiy Storchakaa3e32c92013-04-14 13:37:02 +0300687 def save_bytes(self, obj):
Guido van Rossumf4169812008-03-17 22:56:06 +0000688 if self.proto < 3:
Serhiy Storchakaa3e32c92013-04-14 13:37:02 +0300689 if not obj: # bytes object is empty
Alexandre Vassalotti3bfc65a2011-12-13 13:08:09 -0500690 self.save_reduce(bytes, (), obj=obj)
691 else:
692 self.save_reduce(codecs.encode,
693 (str(obj, 'latin1'), 'latin1'), obj=obj)
Guido van Rossumf4169812008-03-17 22:56:06 +0000694 return
695 n = len(obj)
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +0100696 if n <= 0xff:
Serhiy Storchakaa3e32c92013-04-14 13:37:02 +0300697 self.write(SHORT_BINBYTES + pack("<B", n) + obj)
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +0100698 elif n > 0xffffffff and self.proto >= 4:
699 self.write(BINBYTES8 + pack("<Q", n) + obj)
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000700 else:
Serhiy Storchakaa3e32c92013-04-14 13:37:02 +0300701 self.write(BINBYTES + pack("<I", n) + obj)
Guido van Rossum3a41c612003-01-28 15:10:22 +0000702 self.memoize(obj)
Guido van Rossumf4169812008-03-17 22:56:06 +0000703 dispatch[bytes] = save_bytes
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000704
Serhiy Storchakaa3e32c92013-04-14 13:37:02 +0300705 def save_str(self, obj):
Tim Petersc32d8242001-04-10 02:48:53 +0000706 if self.bin:
Victor Stinner485fb562010-04-13 11:07:24 +0000707 encoded = obj.encode('utf-8', 'surrogatepass')
Guido van Rossum2e6a4b32007-05-04 19:56:22 +0000708 n = len(encoded)
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +0100709 if n <= 0xff and self.proto >= 4:
710 self.write(SHORT_BINUNICODE + pack("<B", n) + encoded)
711 elif n > 0xffffffff and self.proto >= 4:
712 self.write(BINUNICODE8 + pack("<Q", n) + encoded)
713 else:
714 self.write(BINUNICODE + pack("<I", n) + encoded)
Guido van Rossumb5f2f1b2000-03-10 23:20:09 +0000715 else:
Guido van Rossum3a41c612003-01-28 15:10:22 +0000716 obj = obj.replace("\\", "\\u005c")
717 obj = obj.replace("\n", "\\u000a")
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +0100718 self.write(UNICODE + obj.encode('raw-unicode-escape') +
719 b'\n')
Guido van Rossum3a41c612003-01-28 15:10:22 +0000720 self.memoize(obj)
Guido van Rossumf4169812008-03-17 22:56:06 +0000721 dispatch[str] = save_str
Tim Peters658cba62001-02-09 20:06:00 +0000722
Guido van Rossum3a41c612003-01-28 15:10:22 +0000723 def save_tuple(self, obj):
Serhiy Storchakaa3e32c92013-04-14 13:37:02 +0300724 if not obj: # tuple is empty
725 if self.bin:
726 self.write(EMPTY_TUPLE)
Tim Peters1d63c9f2003-02-02 20:29:39 +0000727 else:
Serhiy Storchakaa3e32c92013-04-14 13:37:02 +0300728 self.write(MARK + TUPLE)
Tim Petersd97da802003-01-28 05:48:29 +0000729 return
730
Serhiy Storchakaa3e32c92013-04-14 13:37:02 +0300731 n = len(obj)
Tim Petersd97da802003-01-28 05:48:29 +0000732 save = self.save
733 memo = self.memo
Serhiy Storchakaa3e32c92013-04-14 13:37:02 +0300734 if n <= 3 and self.proto >= 2:
Guido van Rossum3a41c612003-01-28 15:10:22 +0000735 for element in obj:
Tim Petersd97da802003-01-28 05:48:29 +0000736 save(element)
737 # Subtle. Same as in the big comment below.
Guido van Rossum3a41c612003-01-28 15:10:22 +0000738 if id(obj) in memo:
739 get = self.get(memo[id(obj)][0])
Serhiy Storchakaa3e32c92013-04-14 13:37:02 +0300740 self.write(POP * n + get)
Tim Petersd97da802003-01-28 05:48:29 +0000741 else:
Serhiy Storchakaa3e32c92013-04-14 13:37:02 +0300742 self.write(_tuplesize2code[n])
Guido van Rossum3a41c612003-01-28 15:10:22 +0000743 self.memoize(obj)
Tim Petersd97da802003-01-28 05:48:29 +0000744 return
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000745
Tim Peters1d63c9f2003-02-02 20:29:39 +0000746 # proto 0 or proto 1 and tuple isn't empty, or proto > 1 and tuple
Tim Petersff57bff2003-01-28 05:34:53 +0000747 # has more than 3 elements.
Serhiy Storchakaa3e32c92013-04-14 13:37:02 +0300748 write = self.write
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000749 write(MARK)
Guido van Rossum3a41c612003-01-28 15:10:22 +0000750 for element in obj:
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000751 save(element)
752
Tim Peters1d63c9f2003-02-02 20:29:39 +0000753 if id(obj) in memo:
Tim Petersf558da02003-01-28 02:09:55 +0000754 # Subtle. d was not in memo when we entered save_tuple(), so
755 # the process of saving the tuple's elements must have saved
756 # the tuple itself: the tuple is recursive. The proper action
757 # now is to throw away everything we put on the stack, and
758 # simply GET the tuple (it's already constructed). This check
759 # could have been done in the "for element" loop instead, but
760 # recursive tuples are a rare thing.
Guido van Rossum3a41c612003-01-28 15:10:22 +0000761 get = self.get(memo[id(obj)][0])
Serhiy Storchakaa3e32c92013-04-14 13:37:02 +0300762 if self.bin:
Tim Petersf558da02003-01-28 02:09:55 +0000763 write(POP_MARK + get)
764 else: # proto 0 -- POP_MARK not available
Tim Petersd97da802003-01-28 05:48:29 +0000765 write(POP * (n+1) + get)
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000766 return
767
Tim Peters1d63c9f2003-02-02 20:29:39 +0000768 # No recursion.
Serhiy Storchakaa3e32c92013-04-14 13:37:02 +0300769 write(TUPLE)
Tim Peters1d63c9f2003-02-02 20:29:39 +0000770 self.memoize(obj)
Jeremy Hylton3422c992003-01-24 19:29:52 +0000771
Guido van Rossum13257902007-06-07 23:15:56 +0000772 dispatch[tuple] = save_tuple
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000773
Guido van Rossum3a41c612003-01-28 15:10:22 +0000774 def save_list(self, obj):
Tim Petersc32d8242001-04-10 02:48:53 +0000775 if self.bin:
Serhiy Storchakaa3e32c92013-04-14 13:37:02 +0300776 self.write(EMPTY_LIST)
Guido van Rossum25cb7df2003-01-31 18:53:21 +0000777 else: # proto 0 -- can't use EMPTY_LIST
Serhiy Storchakaa3e32c92013-04-14 13:37:02 +0300778 self.write(MARK + LIST)
Guido van Rossum25cb7df2003-01-31 18:53:21 +0000779
780 self.memoize(obj)
Alexandre Vassalottic7db1d62008-05-14 21:57:18 +0000781 self._batch_appends(obj)
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000782
Guido van Rossum13257902007-06-07 23:15:56 +0000783 dispatch[list] = save_list
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000784
Guido van Rossum25cb7df2003-01-31 18:53:21 +0000785 _BATCHSIZE = 1000
786
787 def _batch_appends(self, items):
788 # Helper to batch up APPENDS sequences
789 save = self.save
790 write = self.write
791
792 if not self.bin:
793 for x in items:
794 save(x)
795 write(APPEND)
796 return
797
Serhiy Storchakaa3e32c92013-04-14 13:37:02 +0300798 it = iter(items)
799 while True:
800 tmp = list(islice(it, self._BATCHSIZE))
Guido van Rossum25cb7df2003-01-31 18:53:21 +0000801 n = len(tmp)
802 if n > 1:
803 write(MARK)
804 for x in tmp:
805 save(x)
806 write(APPENDS)
807 elif n:
808 save(tmp[0])
809 write(APPEND)
810 # else tmp is empty, and we're done
Serhiy Storchakaa3e32c92013-04-14 13:37:02 +0300811 if n < self._BATCHSIZE:
812 return
Guido van Rossum25cb7df2003-01-31 18:53:21 +0000813
Guido van Rossum3a41c612003-01-28 15:10:22 +0000814 def save_dict(self, obj):
Tim Petersc32d8242001-04-10 02:48:53 +0000815 if self.bin:
Serhiy Storchakaa3e32c92013-04-14 13:37:02 +0300816 self.write(EMPTY_DICT)
Guido van Rossum25cb7df2003-01-31 18:53:21 +0000817 else: # proto 0 -- can't use EMPTY_DICT
Serhiy Storchakaa3e32c92013-04-14 13:37:02 +0300818 self.write(MARK + DICT)
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000819
Guido van Rossum25cb7df2003-01-31 18:53:21 +0000820 self.memoize(obj)
Alexandre Vassalottic7db1d62008-05-14 21:57:18 +0000821 self._batch_setitems(obj.items())
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000822
Guido van Rossum13257902007-06-07 23:15:56 +0000823 dispatch[dict] = save_dict
824 if PyStringMap is not None:
Jeremy Hylton2b9d0291998-05-27 22:38:22 +0000825 dispatch[PyStringMap] = save_dict
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000826
Guido van Rossum25cb7df2003-01-31 18:53:21 +0000827 def _batch_setitems(self, items):
828 # Helper to batch up SETITEMS sequences; proto >= 1 only
829 save = self.save
830 write = self.write
831
832 if not self.bin:
833 for k, v in items:
834 save(k)
835 save(v)
836 write(SETITEM)
837 return
838
Serhiy Storchakaa3e32c92013-04-14 13:37:02 +0300839 it = iter(items)
840 while True:
841 tmp = list(islice(it, self._BATCHSIZE))
Guido van Rossum25cb7df2003-01-31 18:53:21 +0000842 n = len(tmp)
843 if n > 1:
844 write(MARK)
845 for k, v in tmp:
846 save(k)
847 save(v)
848 write(SETITEMS)
849 elif n:
850 k, v = tmp[0]
851 save(k)
852 save(v)
853 write(SETITEM)
854 # else tmp is empty, and we're done
Serhiy Storchakaa3e32c92013-04-14 13:37:02 +0300855 if n < self._BATCHSIZE:
856 return
Guido van Rossum25cb7df2003-01-31 18:53:21 +0000857
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +0100858 def save_set(self, obj):
859 save = self.save
860 write = self.write
861
862 if self.proto < 4:
863 self.save_reduce(set, (list(obj),), obj=obj)
864 return
865
866 write(EMPTY_SET)
867 self.memoize(obj)
868
869 it = iter(obj)
870 while True:
871 batch = list(islice(it, self._BATCHSIZE))
872 n = len(batch)
873 if n > 0:
874 write(MARK)
875 for item in batch:
876 save(item)
877 write(ADDITEMS)
878 if n < self._BATCHSIZE:
879 return
880 dispatch[set] = save_set
881
882 def save_frozenset(self, obj):
883 save = self.save
884 write = self.write
885
886 if self.proto < 4:
887 self.save_reduce(frozenset, (list(obj),), obj=obj)
888 return
889
890 write(MARK)
891 for item in obj:
892 save(item)
893
894 if id(obj) in self.memo:
895 # If the object is already in the memo, this means it is
896 # recursive. In this case, throw away everything we put on the
897 # stack, and fetch the object back from the memo.
898 write(POP_MARK + self.get(self.memo[id(obj)][0]))
899 return
900
901 write(FROZENSET)
902 self.memoize(obj)
903 dispatch[frozenset] = save_frozenset
904
Serhiy Storchakaa3e32c92013-04-14 13:37:02 +0300905 def save_global(self, obj, name=None):
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000906 write = self.write
907 memo = self.memo
908
Serhiy Storchaka58e41342015-03-31 14:07:24 +0300909 if name is None:
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +0100910 name = getattr(obj, '__qualname__', None)
Tim Petersc32d8242001-04-10 02:48:53 +0000911 if name is None:
Guido van Rossum3a41c612003-01-28 15:10:22 +0000912 name = obj.__name__
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000913
Serhiy Storchaka58e41342015-03-31 14:07:24 +0300914 module_name = whichmodule(obj, name)
Guido van Rossumb0a98e92001-08-17 18:49:52 +0000915 try:
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +0100916 __import__(module_name, level=0)
917 module = sys.modules[module_name]
Serhiy Storchaka58e41342015-03-31 14:07:24 +0300918 obj2, parent = _getattribute(module, name)
Guido van Rossumb0a98e92001-08-17 18:49:52 +0000919 except (ImportError, KeyError, AttributeError):
920 raise PicklingError(
921 "Can't pickle %r: it's not found as %s.%s" %
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +0100922 (obj, module_name, name))
Guido van Rossumb0a98e92001-08-17 18:49:52 +0000923 else:
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +0100924 if obj2 is not obj:
Guido van Rossumb0a98e92001-08-17 18:49:52 +0000925 raise PicklingError(
926 "Can't pickle %r: it's not the same object as %s.%s" %
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +0100927 (obj, module_name, name))
Guido van Rossumb0a98e92001-08-17 18:49:52 +0000928
Guido van Rossum255f3ee2003-01-29 06:14:11 +0000929 if self.proto >= 2:
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +0100930 code = _extension_registry.get((module_name, name))
Guido van Rossum255f3ee2003-01-29 06:14:11 +0000931 if code:
932 assert code > 0
933 if code <= 0xff:
Serhiy Storchakaa3e32c92013-04-14 13:37:02 +0300934 write(EXT1 + pack("<B", code))
Guido van Rossum255f3ee2003-01-29 06:14:11 +0000935 elif code <= 0xffff:
Serhiy Storchakaa3e32c92013-04-14 13:37:02 +0300936 write(EXT2 + pack("<H", code))
Guido van Rossum255f3ee2003-01-29 06:14:11 +0000937 else:
938 write(EXT4 + pack("<i", code))
939 return
Serhiy Storchaka58e41342015-03-31 14:07:24 +0300940 lastname = name.rpartition('.')[2]
941 if parent is module:
942 name = lastname
Alexandre Vassalottica2d6102008-06-12 18:26:05 +0000943 # Non-ASCII identifiers are supported only with protocols >= 3.
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +0100944 if self.proto >= 4:
945 self.save(module_name)
946 self.save(name)
947 write(STACK_GLOBAL)
Serhiy Storchaka58e41342015-03-31 14:07:24 +0300948 elif parent is not module:
949 self.save_reduce(getattr, (parent, lastname))
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +0100950 elif self.proto >= 3:
951 write(GLOBAL + bytes(module_name, "utf-8") + b'\n' +
Alexandre Vassalottica2d6102008-06-12 18:26:05 +0000952 bytes(name, "utf-8") + b'\n')
953 else:
Antoine Pitroud9dfaa92009-06-04 20:32:06 +0000954 if self.fix_imports:
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +0100955 r_name_mapping = _compat_pickle.REVERSE_NAME_MAPPING
956 r_import_mapping = _compat_pickle.REVERSE_IMPORT_MAPPING
957 if (module_name, name) in r_name_mapping:
958 module_name, name = r_name_mapping[(module_name, name)]
Serhiy Storchakabfe18242015-03-31 13:12:37 +0300959 elif module_name in r_import_mapping:
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +0100960 module_name = r_import_mapping[module_name]
Alexandre Vassalottica2d6102008-06-12 18:26:05 +0000961 try:
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +0100962 write(GLOBAL + bytes(module_name, "ascii") + b'\n' +
Alexandre Vassalottica2d6102008-06-12 18:26:05 +0000963 bytes(name, "ascii") + b'\n')
964 except UnicodeEncodeError:
965 raise PicklingError(
966 "can't pickle global identifier '%s.%s' using "
967 "pickle protocol %i" % (module, name, self.proto))
Guido van Rossum255f3ee2003-01-29 06:14:11 +0000968
Guido van Rossum3a41c612003-01-28 15:10:22 +0000969 self.memoize(obj)
Tim Peters3b769832003-01-28 03:51:36 +0000970
Alexandre Vassalotti19b6fa62013-11-30 16:06:39 -0800971 def save_type(self, obj):
972 if obj is type(None):
973 return self.save_reduce(type, (None,), obj=obj)
974 elif obj is type(NotImplemented):
975 return self.save_reduce(type, (NotImplemented,), obj=obj)
976 elif obj is type(...):
977 return self.save_reduce(type, (...,), obj=obj)
978 return self.save_global(obj)
979
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000980 dispatch[FunctionType] = save_global
Alexandre Vassalotti19b6fa62013-11-30 16:06:39 -0800981 dispatch[type] = save_type
Guido van Rossum0c891ce1995-03-14 15:09:05 +0000982
Guido van Rossuma48061a1995-01-10 00:31:14 +0000983
Guido van Rossum1be31752003-01-28 15:19:53 +0000984# Unpickling machinery
985
Alexandre Vassalottica2d6102008-06-12 18:26:05 +0000986class _Unpickler:
Guido van Rossuma48061a1995-01-10 00:31:14 +0000987
Antoine Pitroud9dfaa92009-06-04 20:32:06 +0000988 def __init__(self, file, *, fix_imports=True,
989 encoding="ASCII", errors="strict"):
Guido van Rossum2e6a4b32007-05-04 19:56:22 +0000990 """This takes a binary file for reading a pickle data stream.
Raymond Hettingeraef22fb2002-05-29 16:18:42 +0000991
Alexandre Vassalottid05c9ff2013-12-07 01:09:27 -0800992 The protocol version of the pickle is detected automatically, so
993 no proto argument is needed.
994
995 The argument *file* must have two methods, a read() method that
996 takes an integer argument, and a readline() method that requires
997 no arguments. Both methods should return bytes. Thus *file*
Martin Panter7462b6492015-11-02 03:37:02 +0000998 can be a binary file object opened for reading, an io.BytesIO
Alexandre Vassalottid05c9ff2013-12-07 01:09:27 -0800999 object, or any other custom object that meets this interface.
Raymond Hettingeraef22fb2002-05-29 16:18:42 +00001000
Guido van Rossumfeea0782007-10-10 18:00:50 +00001001 The file-like object must have two methods, a read() method
1002 that takes an integer argument, and a readline() method that
1003 requires no arguments. Both methods should return bytes.
1004 Thus file-like object can be a binary file object opened for
1005 reading, a BytesIO object, or any other custom object that
1006 meets this interface.
Guido van Rossumf4169812008-03-17 22:56:06 +00001007
Alexandre Vassalottid05c9ff2013-12-07 01:09:27 -08001008 Optional keyword arguments are *fix_imports*, *encoding* and
Martin Panter46f50722016-05-26 05:35:26 +00001009 *errors*, which are used to control compatibility support for
Alexandre Vassalottid05c9ff2013-12-07 01:09:27 -08001010 pickle stream generated by Python 2. If *fix_imports* is True,
1011 pickle will try to map the old Python 2 names to the new names
1012 used in Python 3. The *encoding* and *errors* tell pickle how
1013 to decode 8-bit string instances pickled by Python 2; these
1014 default to 'ASCII' and 'strict', respectively. *encoding* can be
1015 'bytes' to read theses 8-bit string instances as bytes objects.
Raymond Hettingeraef22fb2002-05-29 16:18:42 +00001016 """
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01001017 self._file_readline = file.readline
1018 self._file_read = file.read
Guido van Rossumb72cf2d1997-04-09 17:32:51 +00001019 self.memo = {}
Guido van Rossumf4169812008-03-17 22:56:06 +00001020 self.encoding = encoding
1021 self.errors = errors
Antoine Pitroud9dfaa92009-06-04 20:32:06 +00001022 self.proto = 0
1023 self.fix_imports = fix_imports
Guido van Rossuma48061a1995-01-10 00:31:14 +00001024
Guido van Rossumb72cf2d1997-04-09 17:32:51 +00001025 def load(self):
Guido van Rossum3a41c612003-01-28 15:10:22 +00001026 """Read a pickled object representation from the open file.
Raymond Hettingeraef22fb2002-05-29 16:18:42 +00001027
Guido van Rossum3a41c612003-01-28 15:10:22 +00001028 Return the reconstituted object hierarchy specified in the file.
Raymond Hettingeraef22fb2002-05-29 16:18:42 +00001029 """
Alexandre Vassalotti3cfcab92008-12-27 09:30:39 +00001030 # Check whether Unpickler was initialized correctly. This is
1031 # only needed to mimic the behavior of _pickle.Unpickler.dump().
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01001032 if not hasattr(self, "_file_read"):
Alexandre Vassalotti3cfcab92008-12-27 09:30:39 +00001033 raise UnpicklingError("Unpickler.__init__() was not called by "
1034 "%s.__init__()" % (self.__class__.__name__,))
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01001035 self._unframer = _Unframer(self._file_read, self._file_readline)
1036 self.read = self._unframer.read
1037 self.readline = self._unframer.readline
Serhiy Storchaka59fb6342015-12-06 22:01:35 +02001038 self.metastack = []
Guido van Rossumb72cf2d1997-04-09 17:32:51 +00001039 self.stack = []
1040 self.append = self.stack.append
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01001041 self.proto = 0
Guido van Rossumb72cf2d1997-04-09 17:32:51 +00001042 read = self.read
1043 dispatch = self.dispatch
1044 try:
Serhiy Storchakaa3e32c92013-04-14 13:37:02 +03001045 while True:
Guido van Rossumb72cf2d1997-04-09 17:32:51 +00001046 key = read(1)
Guido van Rossum2e6a4b32007-05-04 19:56:22 +00001047 if not key:
1048 raise EOFError
Guido van Rossum98297ee2007-11-06 21:34:58 +00001049 assert isinstance(key, bytes_types)
Guido van Rossum2e6a4b32007-05-04 19:56:22 +00001050 dispatch[key[0]](self)
Guido van Rossumb940e112007-01-10 16:19:56 +00001051 except _Stop as stopinst:
Guido van Rossumff871742000-12-13 18:11:56 +00001052 return stopinst.value
Guido van Rossumb72cf2d1997-04-09 17:32:51 +00001053
Serhiy Storchaka59fb6342015-12-06 22:01:35 +02001054 # Return a list of items pushed in the stack after last MARK instruction.
1055 def pop_mark(self):
1056 items = self.stack
1057 self.stack = self.metastack.pop()
1058 self.append = self.stack.append
1059 return items
Guido van Rossumb72cf2d1997-04-09 17:32:51 +00001060
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001061 def persistent_load(self, pid):
Benjamin Peterson49956b22009-01-10 17:05:44 +00001062 raise UnpicklingError("unsupported persistent id encountered")
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001063
Guido van Rossumb72cf2d1997-04-09 17:32:51 +00001064 dispatch = {}
1065
Guido van Rossumd6c9e632003-01-28 03:49:52 +00001066 def load_proto(self):
Serhiy Storchakaa3e32c92013-04-14 13:37:02 +03001067 proto = self.read(1)[0]
Guido van Rossumf4169812008-03-17 22:56:06 +00001068 if not 0 <= proto <= HIGHEST_PROTOCOL:
Guido van Rossum26d95c32007-08-27 23:18:54 +00001069 raise ValueError("unsupported pickle protocol: %d" % proto)
Antoine Pitroud9dfaa92009-06-04 20:32:06 +00001070 self.proto = proto
Guido van Rossum2e6a4b32007-05-04 19:56:22 +00001071 dispatch[PROTO[0]] = load_proto
Guido van Rossumd6c9e632003-01-28 03:49:52 +00001072
Alexandre Vassalottib6a2f2a2013-11-23 20:30:03 -08001073 def load_frame(self):
1074 frame_size, = unpack('<Q', self.read(8))
1075 if frame_size > sys.maxsize:
1076 raise ValueError("frame size > sys.maxsize: %d" % frame_size)
1077 self._unframer.load_frame(frame_size)
1078 dispatch[FRAME[0]] = load_frame
1079
Guido van Rossumb72cf2d1997-04-09 17:32:51 +00001080 def load_persid(self):
Serhiy Storchakadec25af2016-07-17 11:24:17 +03001081 try:
1082 pid = self.readline()[:-1].decode("ascii")
1083 except UnicodeDecodeError:
1084 raise UnpicklingError(
1085 "persistent IDs in protocol 0 must be ASCII strings")
Guido van Rossumb72cf2d1997-04-09 17:32:51 +00001086 self.append(self.persistent_load(pid))
Guido van Rossum2e6a4b32007-05-04 19:56:22 +00001087 dispatch[PERSID[0]] = load_persid
Guido van Rossumb72cf2d1997-04-09 17:32:51 +00001088
1089 def load_binpersid(self):
Raymond Hettinger46ac8eb2002-06-30 03:39:14 +00001090 pid = self.stack.pop()
Guido van Rossumb72cf2d1997-04-09 17:32:51 +00001091 self.append(self.persistent_load(pid))
Guido van Rossum2e6a4b32007-05-04 19:56:22 +00001092 dispatch[BINPERSID[0]] = load_binpersid
Guido van Rossumb72cf2d1997-04-09 17:32:51 +00001093
1094 def load_none(self):
1095 self.append(None)
Guido van Rossum2e6a4b32007-05-04 19:56:22 +00001096 dispatch[NONE[0]] = load_none
Guido van Rossumb72cf2d1997-04-09 17:32:51 +00001097
Guido van Rossum7d97d312003-01-28 04:25:27 +00001098 def load_false(self):
1099 self.append(False)
Guido van Rossum2e6a4b32007-05-04 19:56:22 +00001100 dispatch[NEWFALSE[0]] = load_false
Guido van Rossum7d97d312003-01-28 04:25:27 +00001101
1102 def load_true(self):
1103 self.append(True)
Guido van Rossum2e6a4b32007-05-04 19:56:22 +00001104 dispatch[NEWTRUE[0]] = load_true
Guido van Rossum7d97d312003-01-28 04:25:27 +00001105
Guido van Rossumb72cf2d1997-04-09 17:32:51 +00001106 def load_int(self):
Tim Peters19ef62d2001-08-28 22:21:18 +00001107 data = self.readline()
Guido van Rossume2763392002-04-05 19:30:08 +00001108 if data == FALSE[1:]:
1109 val = False
1110 elif data == TRUE[1:]:
1111 val = True
1112 else:
Serhiy Storchakaa3e32c92013-04-14 13:37:02 +03001113 val = int(data, 0)
Guido van Rossume2763392002-04-05 19:30:08 +00001114 self.append(val)
Guido van Rossum2e6a4b32007-05-04 19:56:22 +00001115 dispatch[INT[0]] = load_int
Guido van Rossumb72cf2d1997-04-09 17:32:51 +00001116
1117 def load_binint(self):
Serhiy Storchakaa3e32c92013-04-14 13:37:02 +03001118 self.append(unpack('<i', self.read(4))[0])
Guido van Rossum2e6a4b32007-05-04 19:56:22 +00001119 dispatch[BININT[0]] = load_binint
Guido van Rossumb72cf2d1997-04-09 17:32:51 +00001120
1121 def load_binint1(self):
Serhiy Storchakaa3e32c92013-04-14 13:37:02 +03001122 self.append(self.read(1)[0])
Guido van Rossum2e6a4b32007-05-04 19:56:22 +00001123 dispatch[BININT1[0]] = load_binint1
Guido van Rossumb72cf2d1997-04-09 17:32:51 +00001124
1125 def load_binint2(self):
Serhiy Storchakaa3e32c92013-04-14 13:37:02 +03001126 self.append(unpack('<H', self.read(2))[0])
Guido van Rossum2e6a4b32007-05-04 19:56:22 +00001127 dispatch[BININT2[0]] = load_binint2
Tim Peters2344fae2001-01-15 00:50:52 +00001128
Guido van Rossumb72cf2d1997-04-09 17:32:51 +00001129 def load_long(self):
Serhiy Storchakaa3e32c92013-04-14 13:37:02 +03001130 val = self.readline()[:-1]
1131 if val and val[-1] == b'L'[0]:
Mark Dickinson8dd05142009-01-20 20:43:58 +00001132 val = val[:-1]
Guido van Rossumfeea0782007-10-10 18:00:50 +00001133 self.append(int(val, 0))
Guido van Rossum2e6a4b32007-05-04 19:56:22 +00001134 dispatch[LONG[0]] = load_long
Guido van Rossumb72cf2d1997-04-09 17:32:51 +00001135
Guido van Rossumd6c9e632003-01-28 03:49:52 +00001136 def load_long1(self):
Serhiy Storchakaa3e32c92013-04-14 13:37:02 +03001137 n = self.read(1)[0]
Guido van Rossum2e6a4b32007-05-04 19:56:22 +00001138 data = self.read(n)
1139 self.append(decode_long(data))
1140 dispatch[LONG1[0]] = load_long1
Guido van Rossumd6c9e632003-01-28 03:49:52 +00001141
1142 def load_long4(self):
Serhiy Storchakaa3e32c92013-04-14 13:37:02 +03001143 n, = unpack('<i', self.read(4))
Antoine Pitroubf6ecf92012-11-24 20:40:21 +01001144 if n < 0:
1145 # Corrupt or hostile pickle -- we never write one like this
Alexandre Vassalotticc757172013-04-14 02:25:10 -07001146 raise UnpicklingError("LONG pickle has negative byte count")
Guido van Rossum2e6a4b32007-05-04 19:56:22 +00001147 data = self.read(n)
1148 self.append(decode_long(data))
1149 dispatch[LONG4[0]] = load_long4
Guido van Rossumd6c9e632003-01-28 03:49:52 +00001150
Guido van Rossumb72cf2d1997-04-09 17:32:51 +00001151 def load_float(self):
Guido van Rossumff871742000-12-13 18:11:56 +00001152 self.append(float(self.readline()[:-1]))
Guido van Rossum2e6a4b32007-05-04 19:56:22 +00001153 dispatch[FLOAT[0]] = load_float
Guido van Rossumb72cf2d1997-04-09 17:32:51 +00001154
Serhiy Storchakaa3e32c92013-04-14 13:37:02 +03001155 def load_binfloat(self):
Guido van Rossumd3703791998-10-22 20:15:36 +00001156 self.append(unpack('>d', self.read(8))[0])
Guido van Rossum2e6a4b32007-05-04 19:56:22 +00001157 dispatch[BINFLOAT[0]] = load_binfloat
Guido van Rossumd3703791998-10-22 20:15:36 +00001158
Alexandre Vassalottid05c9ff2013-12-07 01:09:27 -08001159 def _decode_string(self, value):
1160 # Used to allow strings from Python 2 to be decoded either as
1161 # bytes or Unicode strings. This should be used only with the
1162 # STRING, BINSTRING and SHORT_BINSTRING opcodes.
1163 if self.encoding == "bytes":
1164 return value
1165 else:
1166 return value.decode(self.encoding, self.errors)
1167
Guido van Rossumb72cf2d1997-04-09 17:32:51 +00001168 def load_string(self):
Alexandre Vassalotti7c5e0942013-04-15 23:14:55 -07001169 data = self.readline()[:-1]
Serhiy Storchakaa3e32c92013-04-14 13:37:02 +03001170 # Strip outermost quotes
Alexandre Vassalotti7c5e0942013-04-15 23:14:55 -07001171 if len(data) >= 2 and data[0] == data[-1] and data[0] in b'"\'':
1172 data = data[1:-1]
Martin v. Löwis8a8da792002-08-14 07:46:28 +00001173 else:
Alexandre Vassalotti7c5e0942013-04-15 23:14:55 -07001174 raise UnpicklingError("the STRING opcode argument must be quoted")
Alexandre Vassalottid05c9ff2013-12-07 01:09:27 -08001175 self.append(self._decode_string(codecs.escape_decode(data)[0]))
Guido van Rossum2e6a4b32007-05-04 19:56:22 +00001176 dispatch[STRING[0]] = load_string
Guido van Rossumb72cf2d1997-04-09 17:32:51 +00001177
1178 def load_binstring(self):
Antoine Pitroubf6ecf92012-11-24 20:40:21 +01001179 # Deprecated BINSTRING uses signed 32-bit length
Serhiy Storchakaa3e32c92013-04-14 13:37:02 +03001180 len, = unpack('<i', self.read(4))
Antoine Pitroubf6ecf92012-11-24 20:40:21 +01001181 if len < 0:
Alexandre Vassalotticc757172013-04-14 02:25:10 -07001182 raise UnpicklingError("BINSTRING pickle has negative byte count")
Guido van Rossumf4169812008-03-17 22:56:06 +00001183 data = self.read(len)
Alexandre Vassalottid05c9ff2013-12-07 01:09:27 -08001184 self.append(self._decode_string(data))
Guido van Rossum2e6a4b32007-05-04 19:56:22 +00001185 dispatch[BINSTRING[0]] = load_binstring
Guido van Rossumb72cf2d1997-04-09 17:32:51 +00001186
Serhiy Storchakaa3e32c92013-04-14 13:37:02 +03001187 def load_binbytes(self):
Antoine Pitroubf6ecf92012-11-24 20:40:21 +01001188 len, = unpack('<I', self.read(4))
1189 if len > maxsize:
Alexandre Vassalotticc757172013-04-14 02:25:10 -07001190 raise UnpicklingError("BINBYTES exceeds system's maximum size "
1191 "of %d bytes" % maxsize)
Guido van Rossumf4169812008-03-17 22:56:06 +00001192 self.append(self.read(len))
1193 dispatch[BINBYTES[0]] = load_binbytes
1194
Guido van Rossumb5f2f1b2000-03-10 23:20:09 +00001195 def load_unicode(self):
Guido van Rossum2e6a4b32007-05-04 19:56:22 +00001196 self.append(str(self.readline()[:-1], 'raw-unicode-escape'))
1197 dispatch[UNICODE[0]] = load_unicode
Guido van Rossumb5f2f1b2000-03-10 23:20:09 +00001198
Serhiy Storchakaa3e32c92013-04-14 13:37:02 +03001199 def load_binunicode(self):
Antoine Pitroubf6ecf92012-11-24 20:40:21 +01001200 len, = unpack('<I', self.read(4))
1201 if len > maxsize:
Alexandre Vassalotticc757172013-04-14 02:25:10 -07001202 raise UnpicklingError("BINUNICODE exceeds system's maximum size "
1203 "of %d bytes" % maxsize)
Victor Stinner485fb562010-04-13 11:07:24 +00001204 self.append(str(self.read(len), 'utf-8', 'surrogatepass'))
Guido van Rossum2e6a4b32007-05-04 19:56:22 +00001205 dispatch[BINUNICODE[0]] = load_binunicode
Guido van Rossumb5f2f1b2000-03-10 23:20:09 +00001206
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01001207 def load_binunicode8(self):
1208 len, = unpack('<Q', self.read(8))
1209 if len > maxsize:
1210 raise UnpicklingError("BINUNICODE8 exceeds system's maximum size "
1211 "of %d bytes" % maxsize)
1212 self.append(str(self.read(len), 'utf-8', 'surrogatepass'))
1213 dispatch[BINUNICODE8[0]] = load_binunicode8
1214
Serhiy Storchakae0606192015-09-29 22:10:07 +03001215 def load_binbytes8(self):
1216 len, = unpack('<Q', self.read(8))
1217 if len > maxsize:
1218 raise UnpicklingError("BINBYTES8 exceeds system's maximum size "
1219 "of %d bytes" % maxsize)
1220 self.append(self.read(len))
1221 dispatch[BINBYTES8[0]] = load_binbytes8
1222
Guido van Rossumb72cf2d1997-04-09 17:32:51 +00001223 def load_short_binstring(self):
Serhiy Storchakaa3e32c92013-04-14 13:37:02 +03001224 len = self.read(1)[0]
1225 data = self.read(len)
Alexandre Vassalottid05c9ff2013-12-07 01:09:27 -08001226 self.append(self._decode_string(data))
Guido van Rossum2e6a4b32007-05-04 19:56:22 +00001227 dispatch[SHORT_BINSTRING[0]] = load_short_binstring
Guido van Rossumb72cf2d1997-04-09 17:32:51 +00001228
Guido van Rossumf4169812008-03-17 22:56:06 +00001229 def load_short_binbytes(self):
Serhiy Storchakaa3e32c92013-04-14 13:37:02 +03001230 len = self.read(1)[0]
1231 self.append(self.read(len))
Guido van Rossumf4169812008-03-17 22:56:06 +00001232 dispatch[SHORT_BINBYTES[0]] = load_short_binbytes
1233
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01001234 def load_short_binunicode(self):
1235 len = self.read(1)[0]
1236 self.append(str(self.read(len), 'utf-8', 'surrogatepass'))
1237 dispatch[SHORT_BINUNICODE[0]] = load_short_binunicode
1238
Guido van Rossumb72cf2d1997-04-09 17:32:51 +00001239 def load_tuple(self):
Serhiy Storchaka59fb6342015-12-06 22:01:35 +02001240 items = self.pop_mark()
1241 self.append(tuple(items))
Guido van Rossum2e6a4b32007-05-04 19:56:22 +00001242 dispatch[TUPLE[0]] = load_tuple
Guido van Rossumb72cf2d1997-04-09 17:32:51 +00001243
1244 def load_empty_tuple(self):
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001245 self.append(())
Guido van Rossum2e6a4b32007-05-04 19:56:22 +00001246 dispatch[EMPTY_TUPLE[0]] = load_empty_tuple
Guido van Rossumb72cf2d1997-04-09 17:32:51 +00001247
Guido van Rossum44f0ea52003-01-28 04:14:51 +00001248 def load_tuple1(self):
1249 self.stack[-1] = (self.stack[-1],)
Guido van Rossum2e6a4b32007-05-04 19:56:22 +00001250 dispatch[TUPLE1[0]] = load_tuple1
Guido van Rossum44f0ea52003-01-28 04:14:51 +00001251
1252 def load_tuple2(self):
1253 self.stack[-2:] = [(self.stack[-2], self.stack[-1])]
Guido van Rossum2e6a4b32007-05-04 19:56:22 +00001254 dispatch[TUPLE2[0]] = load_tuple2
Guido van Rossum44f0ea52003-01-28 04:14:51 +00001255
1256 def load_tuple3(self):
1257 self.stack[-3:] = [(self.stack[-3], self.stack[-2], self.stack[-1])]
Guido van Rossum2e6a4b32007-05-04 19:56:22 +00001258 dispatch[TUPLE3[0]] = load_tuple3
Guido van Rossum44f0ea52003-01-28 04:14:51 +00001259
Guido van Rossumb72cf2d1997-04-09 17:32:51 +00001260 def load_empty_list(self):
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001261 self.append([])
Guido van Rossum2e6a4b32007-05-04 19:56:22 +00001262 dispatch[EMPTY_LIST[0]] = load_empty_list
Guido van Rossumb72cf2d1997-04-09 17:32:51 +00001263
1264 def load_empty_dictionary(self):
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001265 self.append({})
Guido van Rossum2e6a4b32007-05-04 19:56:22 +00001266 dispatch[EMPTY_DICT[0]] = load_empty_dictionary
Guido van Rossumb72cf2d1997-04-09 17:32:51 +00001267
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01001268 def load_empty_set(self):
1269 self.append(set())
1270 dispatch[EMPTY_SET[0]] = load_empty_set
1271
1272 def load_frozenset(self):
Serhiy Storchaka59fb6342015-12-06 22:01:35 +02001273 items = self.pop_mark()
1274 self.append(frozenset(items))
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01001275 dispatch[FROZENSET[0]] = load_frozenset
1276
Guido van Rossumb72cf2d1997-04-09 17:32:51 +00001277 def load_list(self):
Serhiy Storchaka59fb6342015-12-06 22:01:35 +02001278 items = self.pop_mark()
1279 self.append(items)
Guido van Rossum2e6a4b32007-05-04 19:56:22 +00001280 dispatch[LIST[0]] = load_list
Guido van Rossumb72cf2d1997-04-09 17:32:51 +00001281
1282 def load_dict(self):
Serhiy Storchaka59fb6342015-12-06 22:01:35 +02001283 items = self.pop_mark()
Serhiy Storchakaa3e32c92013-04-14 13:37:02 +03001284 d = {items[i]: items[i+1]
1285 for i in range(0, len(items), 2)}
Serhiy Storchaka59fb6342015-12-06 22:01:35 +02001286 self.append(d)
Guido van Rossum2e6a4b32007-05-04 19:56:22 +00001287 dispatch[DICT[0]] = load_dict
Guido van Rossumb72cf2d1997-04-09 17:32:51 +00001288
Tim Petersd01c1e92003-01-30 15:41:46 +00001289 # INST and OBJ differ only in how they get a class object. It's not
1290 # only sensible to do the rest in a common routine, the two routines
1291 # previously diverged and grew different bugs.
1292 # klass is the class to instantiate, and k points to the topmost mark
1293 # object, following which are the arguments for klass.__init__.
Serhiy Storchaka59fb6342015-12-06 22:01:35 +02001294 def _instantiate(self, klass, args):
Alexander Belopolskyd92f0402010-07-17 22:50:45 +00001295 if (args or not isinstance(klass, type) or
1296 hasattr(klass, "__getinitargs__")):
Guido van Rossum743d17e1998-09-15 20:25:57 +00001297 try:
Guido van Rossumb26a97a2003-01-28 22:29:13 +00001298 value = klass(*args)
Guido van Rossumb940e112007-01-10 16:19:56 +00001299 except TypeError as err:
Guido van Rossum26d95c32007-08-27 23:18:54 +00001300 raise TypeError("in constructor for %s: %s" %
1301 (klass.__name__, str(err)), sys.exc_info()[2])
Alexander Belopolskyd92f0402010-07-17 22:50:45 +00001302 else:
1303 value = klass.__new__(klass)
Guido van Rossumb72cf2d1997-04-09 17:32:51 +00001304 self.append(value)
Tim Petersd01c1e92003-01-30 15:41:46 +00001305
1306 def load_inst(self):
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001307 module = self.readline()[:-1].decode("ascii")
1308 name = self.readline()[:-1].decode("ascii")
Tim Petersd01c1e92003-01-30 15:41:46 +00001309 klass = self.find_class(module, name)
Serhiy Storchaka59fb6342015-12-06 22:01:35 +02001310 self._instantiate(klass, self.pop_mark())
Guido van Rossum2e6a4b32007-05-04 19:56:22 +00001311 dispatch[INST[0]] = load_inst
Guido van Rossumb72cf2d1997-04-09 17:32:51 +00001312
1313 def load_obj(self):
Tim Petersd01c1e92003-01-30 15:41:46 +00001314 # Stack is ... markobject classobject arg1 arg2 ...
Serhiy Storchaka59fb6342015-12-06 22:01:35 +02001315 args = self.pop_mark()
1316 cls = args.pop(0)
1317 self._instantiate(cls, args)
Guido van Rossum2e6a4b32007-05-04 19:56:22 +00001318 dispatch[OBJ[0]] = load_obj
Guido van Rossumb72cf2d1997-04-09 17:32:51 +00001319
Guido van Rossum3a41c612003-01-28 15:10:22 +00001320 def load_newobj(self):
1321 args = self.stack.pop()
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01001322 cls = self.stack.pop()
Guido van Rossum3a41c612003-01-28 15:10:22 +00001323 obj = cls.__new__(cls, *args)
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01001324 self.append(obj)
Guido van Rossum2e6a4b32007-05-04 19:56:22 +00001325 dispatch[NEWOBJ[0]] = load_newobj
Guido van Rossum3a41c612003-01-28 15:10:22 +00001326
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01001327 def load_newobj_ex(self):
1328 kwargs = self.stack.pop()
1329 args = self.stack.pop()
1330 cls = self.stack.pop()
1331 obj = cls.__new__(cls, *args, **kwargs)
1332 self.append(obj)
1333 dispatch[NEWOBJ_EX[0]] = load_newobj_ex
1334
Guido van Rossumb72cf2d1997-04-09 17:32:51 +00001335 def load_global(self):
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001336 module = self.readline()[:-1].decode("utf-8")
1337 name = self.readline()[:-1].decode("utf-8")
Guido van Rossumb72cf2d1997-04-09 17:32:51 +00001338 klass = self.find_class(module, name)
1339 self.append(klass)
Guido van Rossum2e6a4b32007-05-04 19:56:22 +00001340 dispatch[GLOBAL[0]] = load_global
Guido van Rossumb72cf2d1997-04-09 17:32:51 +00001341
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01001342 def load_stack_global(self):
1343 name = self.stack.pop()
1344 module = self.stack.pop()
1345 if type(name) is not str or type(module) is not str:
1346 raise UnpicklingError("STACK_GLOBAL requires str")
1347 self.append(self.find_class(module, name))
1348 dispatch[STACK_GLOBAL[0]] = load_stack_global
1349
Guido van Rossum255f3ee2003-01-29 06:14:11 +00001350 def load_ext1(self):
Serhiy Storchakaa3e32c92013-04-14 13:37:02 +03001351 code = self.read(1)[0]
Guido van Rossum255f3ee2003-01-29 06:14:11 +00001352 self.get_extension(code)
Guido van Rossum2e6a4b32007-05-04 19:56:22 +00001353 dispatch[EXT1[0]] = load_ext1
Guido van Rossum255f3ee2003-01-29 06:14:11 +00001354
1355 def load_ext2(self):
Serhiy Storchakaa3e32c92013-04-14 13:37:02 +03001356 code, = unpack('<H', self.read(2))
Guido van Rossum255f3ee2003-01-29 06:14:11 +00001357 self.get_extension(code)
Guido van Rossum2e6a4b32007-05-04 19:56:22 +00001358 dispatch[EXT2[0]] = load_ext2
Guido van Rossum255f3ee2003-01-29 06:14:11 +00001359
1360 def load_ext4(self):
Serhiy Storchakaa3e32c92013-04-14 13:37:02 +03001361 code, = unpack('<i', self.read(4))
Guido van Rossum255f3ee2003-01-29 06:14:11 +00001362 self.get_extension(code)
Guido van Rossum2e6a4b32007-05-04 19:56:22 +00001363 dispatch[EXT4[0]] = load_ext4
Guido van Rossum255f3ee2003-01-29 06:14:11 +00001364
1365 def get_extension(self, code):
1366 nil = []
Guido van Rossumd4b920c2003-02-04 01:54:49 +00001367 obj = _extension_cache.get(code, nil)
Guido van Rossum255f3ee2003-01-29 06:14:11 +00001368 if obj is not nil:
1369 self.append(obj)
1370 return
Guido van Rossumd4b920c2003-02-04 01:54:49 +00001371 key = _inverted_registry.get(code)
Guido van Rossum255f3ee2003-01-29 06:14:11 +00001372 if not key:
Antoine Pitroubf6ecf92012-11-24 20:40:21 +01001373 if code <= 0: # note that 0 is forbidden
1374 # Corrupt or hostile pickle.
Alexandre Vassalotticc757172013-04-14 02:25:10 -07001375 raise UnpicklingError("EXT specifies code <= 0")
Guido van Rossum255f3ee2003-01-29 06:14:11 +00001376 raise ValueError("unregistered extension code %d" % code)
1377 obj = self.find_class(*key)
Guido van Rossumd4b920c2003-02-04 01:54:49 +00001378 _extension_cache[code] = obj
Guido van Rossum255f3ee2003-01-29 06:14:11 +00001379 self.append(obj)
1380
Guido van Rossumb72cf2d1997-04-09 17:32:51 +00001381 def find_class(self, module, name):
Antoine Pitroud9dfaa92009-06-04 20:32:06 +00001382 # Subclasses may override this.
1383 if self.proto < 3 and self.fix_imports:
1384 if (module, name) in _compat_pickle.NAME_MAPPING:
1385 module, name = _compat_pickle.NAME_MAPPING[(module, name)]
Serhiy Storchakabfe18242015-03-31 13:12:37 +03001386 elif module in _compat_pickle.IMPORT_MAPPING:
Antoine Pitroud9dfaa92009-06-04 20:32:06 +00001387 module = _compat_pickle.IMPORT_MAPPING[module]
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001388 __import__(module, level=0)
Serhiy Storchaka58e41342015-03-31 14:07:24 +03001389 if self.proto >= 4:
1390 return _getattribute(sys.modules[module], name)[0]
1391 else:
1392 return getattr(sys.modules[module], name)
Guido van Rossumb72cf2d1997-04-09 17:32:51 +00001393
1394 def load_reduce(self):
1395 stack = self.stack
Guido van Rossumb26a97a2003-01-28 22:29:13 +00001396 args = stack.pop()
1397 func = stack[-1]
Serhiy Storchakaa8d83f52015-12-01 00:39:25 +02001398 stack[-1] = func(*args)
Guido van Rossum2e6a4b32007-05-04 19:56:22 +00001399 dispatch[REDUCE[0]] = load_reduce
Guido van Rossuma48061a1995-01-10 00:31:14 +00001400
Guido van Rossumb72cf2d1997-04-09 17:32:51 +00001401 def load_pop(self):
Serhiy Storchaka59fb6342015-12-06 22:01:35 +02001402 if self.stack:
1403 del self.stack[-1]
1404 else:
1405 self.pop_mark()
Guido van Rossum2e6a4b32007-05-04 19:56:22 +00001406 dispatch[POP[0]] = load_pop
Guido van Rossum7b5430f1995-03-04 22:25:21 +00001407
Guido van Rossumb72cf2d1997-04-09 17:32:51 +00001408 def load_pop_mark(self):
Serhiy Storchaka59fb6342015-12-06 22:01:35 +02001409 self.pop_mark()
Guido van Rossum2e6a4b32007-05-04 19:56:22 +00001410 dispatch[POP_MARK[0]] = load_pop_mark
Guido van Rossuma48061a1995-01-10 00:31:14 +00001411
Guido van Rossumb72cf2d1997-04-09 17:32:51 +00001412 def load_dup(self):
Guido van Rossumb1062fc1998-03-31 17:00:46 +00001413 self.append(self.stack[-1])
Guido van Rossum2e6a4b32007-05-04 19:56:22 +00001414 dispatch[DUP[0]] = load_dup
Guido van Rossuma48061a1995-01-10 00:31:14 +00001415
Guido van Rossumb72cf2d1997-04-09 17:32:51 +00001416 def load_get(self):
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001417 i = int(self.readline()[:-1])
1418 self.append(self.memo[i])
Guido van Rossum2e6a4b32007-05-04 19:56:22 +00001419 dispatch[GET[0]] = load_get
Guido van Rossum78536471996-04-12 13:36:27 +00001420
Guido van Rossumb72cf2d1997-04-09 17:32:51 +00001421 def load_binget(self):
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001422 i = self.read(1)[0]
1423 self.append(self.memo[i])
Guido van Rossum2e6a4b32007-05-04 19:56:22 +00001424 dispatch[BINGET[0]] = load_binget
Guido van Rossum78536471996-04-12 13:36:27 +00001425
Serhiy Storchakaa3e32c92013-04-14 13:37:02 +03001426 def load_long_binget(self):
Antoine Pitroubf6ecf92012-11-24 20:40:21 +01001427 i, = unpack('<I', self.read(4))
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001428 self.append(self.memo[i])
Guido van Rossum2e6a4b32007-05-04 19:56:22 +00001429 dispatch[LONG_BINGET[0]] = load_long_binget
Guido van Rossum78536471996-04-12 13:36:27 +00001430
Guido van Rossumb72cf2d1997-04-09 17:32:51 +00001431 def load_put(self):
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001432 i = int(self.readline()[:-1])
Antoine Pitrou55549ec2011-08-30 00:27:10 +02001433 if i < 0:
1434 raise ValueError("negative PUT argument")
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001435 self.memo[i] = self.stack[-1]
Guido van Rossum2e6a4b32007-05-04 19:56:22 +00001436 dispatch[PUT[0]] = load_put
Guido van Rossuma48061a1995-01-10 00:31:14 +00001437
Guido van Rossumb72cf2d1997-04-09 17:32:51 +00001438 def load_binput(self):
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001439 i = self.read(1)[0]
Antoine Pitrou55549ec2011-08-30 00:27:10 +02001440 if i < 0:
1441 raise ValueError("negative BINPUT argument")
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001442 self.memo[i] = self.stack[-1]
Guido van Rossum2e6a4b32007-05-04 19:56:22 +00001443 dispatch[BINPUT[0]] = load_binput
Guido van Rossuma48061a1995-01-10 00:31:14 +00001444
Serhiy Storchakaa3e32c92013-04-14 13:37:02 +03001445 def load_long_binput(self):
Antoine Pitroubf6ecf92012-11-24 20:40:21 +01001446 i, = unpack('<I', self.read(4))
1447 if i > maxsize:
Antoine Pitrou55549ec2011-08-30 00:27:10 +02001448 raise ValueError("negative LONG_BINPUT argument")
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001449 self.memo[i] = self.stack[-1]
Guido van Rossum2e6a4b32007-05-04 19:56:22 +00001450 dispatch[LONG_BINPUT[0]] = load_long_binput
Guido van Rossuma48061a1995-01-10 00:31:14 +00001451
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01001452 def load_memoize(self):
1453 memo = self.memo
1454 memo[len(memo)] = self.stack[-1]
1455 dispatch[MEMOIZE[0]] = load_memoize
1456
Guido van Rossumb72cf2d1997-04-09 17:32:51 +00001457 def load_append(self):
1458 stack = self.stack
Raymond Hettinger46ac8eb2002-06-30 03:39:14 +00001459 value = stack.pop()
Guido van Rossumb72cf2d1997-04-09 17:32:51 +00001460 list = stack[-1]
1461 list.append(value)
Guido van Rossum2e6a4b32007-05-04 19:56:22 +00001462 dispatch[APPEND[0]] = load_append
Guido van Rossuma48061a1995-01-10 00:31:14 +00001463
Guido van Rossumb72cf2d1997-04-09 17:32:51 +00001464 def load_appends(self):
Serhiy Storchaka59fb6342015-12-06 22:01:35 +02001465 items = self.pop_mark()
1466 list_obj = self.stack[-1]
Alexandre Vassalotti1f7492c2013-04-20 13:19:46 -07001467 if isinstance(list_obj, list):
1468 list_obj.extend(items)
1469 else:
1470 append = list_obj.append
1471 for item in items:
1472 append(item)
Guido van Rossum2e6a4b32007-05-04 19:56:22 +00001473 dispatch[APPENDS[0]] = load_appends
Tim Peters2344fae2001-01-15 00:50:52 +00001474
Guido van Rossumb72cf2d1997-04-09 17:32:51 +00001475 def load_setitem(self):
1476 stack = self.stack
Raymond Hettinger46ac8eb2002-06-30 03:39:14 +00001477 value = stack.pop()
1478 key = stack.pop()
Guido van Rossumb72cf2d1997-04-09 17:32:51 +00001479 dict = stack[-1]
1480 dict[key] = value
Guido van Rossum2e6a4b32007-05-04 19:56:22 +00001481 dispatch[SETITEM[0]] = load_setitem
Guido van Rossum0c891ce1995-03-14 15:09:05 +00001482
Guido van Rossumb72cf2d1997-04-09 17:32:51 +00001483 def load_setitems(self):
Serhiy Storchaka59fb6342015-12-06 22:01:35 +02001484 items = self.pop_mark()
1485 dict = self.stack[-1]
1486 for i in range(0, len(items), 2):
1487 dict[items[i]] = items[i + 1]
Guido van Rossum2e6a4b32007-05-04 19:56:22 +00001488 dispatch[SETITEMS[0]] = load_setitems
Guido van Rossuma48061a1995-01-10 00:31:14 +00001489
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01001490 def load_additems(self):
Serhiy Storchaka59fb6342015-12-06 22:01:35 +02001491 items = self.pop_mark()
1492 set_obj = self.stack[-1]
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01001493 if isinstance(set_obj, set):
1494 set_obj.update(items)
1495 else:
1496 add = set_obj.add
1497 for item in items:
1498 add(item)
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01001499 dispatch[ADDITEMS[0]] = load_additems
1500
Guido van Rossumb72cf2d1997-04-09 17:32:51 +00001501 def load_build(self):
1502 stack = self.stack
Guido van Rossumac5b5d22003-01-28 22:01:16 +00001503 state = stack.pop()
Guido van Rossumb72cf2d1997-04-09 17:32:51 +00001504 inst = stack[-1]
Guido van Rossumac5b5d22003-01-28 22:01:16 +00001505 setstate = getattr(inst, "__setstate__", None)
Serhiy Storchakaa3e32c92013-04-14 13:37:02 +03001506 if setstate is not None:
Guido van Rossumac5b5d22003-01-28 22:01:16 +00001507 setstate(state)
1508 return
1509 slotstate = None
1510 if isinstance(state, tuple) and len(state) == 2:
1511 state, slotstate = state
1512 if state:
Alexandre Vassalottiebfecfd2009-05-25 18:50:33 +00001513 inst_dict = inst.__dict__
Antoine Pitroua9f48a02009-05-02 21:41:14 +00001514 intern = sys.intern
Alexandre Vassalottiebfecfd2009-05-25 18:50:33 +00001515 for k, v in state.items():
1516 if type(k) is str:
1517 inst_dict[intern(k)] = v
1518 else:
1519 inst_dict[k] = v
Guido van Rossumac5b5d22003-01-28 22:01:16 +00001520 if slotstate:
1521 for k, v in slotstate.items():
1522 setattr(inst, k, v)
Guido van Rossum2e6a4b32007-05-04 19:56:22 +00001523 dispatch[BUILD[0]] = load_build
Guido van Rossuma48061a1995-01-10 00:31:14 +00001524
Guido van Rossumb72cf2d1997-04-09 17:32:51 +00001525 def load_mark(self):
Serhiy Storchaka59fb6342015-12-06 22:01:35 +02001526 self.metastack.append(self.stack)
1527 self.stack = []
1528 self.append = self.stack.append
Guido van Rossum2e6a4b32007-05-04 19:56:22 +00001529 dispatch[MARK[0]] = load_mark
Guido van Rossuma48061a1995-01-10 00:31:14 +00001530
Guido van Rossumb72cf2d1997-04-09 17:32:51 +00001531 def load_stop(self):
Raymond Hettinger46ac8eb2002-06-30 03:39:14 +00001532 value = self.stack.pop()
Guido van Rossumff871742000-12-13 18:11:56 +00001533 raise _Stop(value)
Guido van Rossum2e6a4b32007-05-04 19:56:22 +00001534 dispatch[STOP[0]] = load_stop
Guido van Rossuma48061a1995-01-10 00:31:14 +00001535
Guido van Rossumd6c9e632003-01-28 03:49:52 +00001536
Guido van Rossum0c891ce1995-03-14 15:09:05 +00001537# Shorthands
1538
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01001539def _dump(obj, file, protocol=None, *, fix_imports=True):
1540 _Pickler(file, protocol, fix_imports=fix_imports).dump(obj)
Guido van Rossum0c891ce1995-03-14 15:09:05 +00001541
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01001542def _dumps(obj, protocol=None, *, fix_imports=True):
Guido van Rossumcfe5f202007-05-08 21:26:54 +00001543 f = io.BytesIO()
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01001544 _Pickler(f, protocol, fix_imports=fix_imports).dump(obj)
Guido van Rossumcfe5f202007-05-08 21:26:54 +00001545 res = f.getvalue()
Guido van Rossum98297ee2007-11-06 21:34:58 +00001546 assert isinstance(res, bytes_types)
Guido van Rossumcfe5f202007-05-08 21:26:54 +00001547 return res
Guido van Rossum0c891ce1995-03-14 15:09:05 +00001548
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01001549def _load(file, *, fix_imports=True, encoding="ASCII", errors="strict"):
1550 return _Unpickler(file, fix_imports=fix_imports,
Antoine Pitroud9dfaa92009-06-04 20:32:06 +00001551 encoding=encoding, errors=errors).load()
Guido van Rossum0c891ce1995-03-14 15:09:05 +00001552
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01001553def _loads(s, *, fix_imports=True, encoding="ASCII", errors="strict"):
Guido van Rossumcfe5f202007-05-08 21:26:54 +00001554 if isinstance(s, str):
1555 raise TypeError("Can't load pickle from unicode string")
1556 file = io.BytesIO(s)
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01001557 return _Unpickler(file, fix_imports=fix_imports,
1558 encoding=encoding, errors=errors).load()
Guido van Rossumd6c9e632003-01-28 03:49:52 +00001559
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00001560# Use the faster _pickle if possible
1561try:
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01001562 from _pickle import (
1563 PickleError,
1564 PicklingError,
1565 UnpicklingError,
1566 Pickler,
1567 Unpickler,
1568 dump,
1569 dumps,
1570 load,
1571 loads
1572 )
Brett Cannoncd171c82013-07-04 17:43:24 -04001573except ImportError:
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00001574 Pickler, Unpickler = _Pickler, _Unpickler
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01001575 dump, dumps, load, loads = _dump, _dumps, _load, _loads
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00001576
Guido van Rossumd6c9e632003-01-28 03:49:52 +00001577# Doctest
Guido van Rossumd6c9e632003-01-28 03:49:52 +00001578def _test():
1579 import doctest
1580 return doctest.testmod()
1581
1582if __name__ == "__main__":
Florent Xicluna54540ec2011-11-04 08:29:17 +01001583 import argparse
Alexander Belopolsky455f7bd2010-07-27 23:02:38 +00001584 parser = argparse.ArgumentParser(
1585 description='display contents of the pickle files')
1586 parser.add_argument(
1587 'pickle_file', type=argparse.FileType('br'),
1588 nargs='*', help='the pickle file')
1589 parser.add_argument(
1590 '-t', '--test', action='store_true',
1591 help='run self-test suite')
1592 parser.add_argument(
1593 '-v', action='store_true',
1594 help='run verbosely; only affects self-test run')
1595 args = parser.parse_args()
1596 if args.test:
1597 _test()
1598 else:
1599 if not args.pickle_file:
1600 parser.print_help()
1601 else:
1602 import pprint
1603 for f in args.pickle_file:
1604 obj = load(f)
1605 pprint.pprint(obj)