blob: 040ecb245fdfb3c7e0296d5318659574dbee5096 [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
Guido van Rossumd3703791998-10-22 20:15:36 +000030import sys
Serhiy Storchakaa3e32c92013-04-14 13:37:02 +030031from sys import maxsize
32from struct import pack, unpack
Skip Montanaro23bafc62001-02-18 03:10:09 +000033import re
Guido van Rossum2e6a4b32007-05-04 19:56:22 +000034import io
Walter Dörwald42748a82007-06-12 16:40:17 +000035import codecs
Antoine Pitroud9dfaa92009-06-04 20:32:06 +000036import _compat_pickle
Guido van Rossuma48061a1995-01-10 00:31:14 +000037
Skip Montanaro352674d2001-02-07 23:14:30 +000038__all__ = ["PickleError", "PicklingError", "UnpicklingError", "Pickler",
39 "Unpickler", "dump", "dumps", "load", "loads"]
40
Guido van Rossum98297ee2007-11-06 21:34:58 +000041# Shortcut for use in isinstance testing
Alexandre Vassalotti8cb02b62008-05-03 01:42:49 +000042bytes_types = (bytes, bytearray)
Guido van Rossum98297ee2007-11-06 21:34:58 +000043
Tim Petersc0c12b52003-01-29 00:56:17 +000044# These are purely informational; no code uses these.
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +010045format_version = "4.0" # File format version we write
Guido van Rossumf29d3d62003-01-27 22:47:53 +000046compatible_formats = ["1.0", # Original protocol 0
Guido van Rossumbc64e222003-01-28 16:34:19 +000047 "1.1", # Protocol 0 with INST added
Guido van Rossumf29d3d62003-01-27 22:47:53 +000048 "1.2", # Original protocol 1
49 "1.3", # Protocol 1 with BINFLOAT added
50 "2.0", # Protocol 2
Guido van Rossumf4169812008-03-17 22:56:06 +000051 "3.0", # Protocol 3
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +010052 "4.0", # Protocol 4
Guido van Rossumf29d3d62003-01-27 22:47:53 +000053 ] # Old format versions we can read
Guido van Rossumb72cf2d1997-04-09 17:32:51 +000054
Guido van Rossum99603b02007-07-20 00:22:32 +000055# This is the highest protocol number we know how to read.
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +010056HIGHEST_PROTOCOL = 4
Tim Peters8587b3c2003-02-13 15:44:41 +000057
Guido van Rossum2e6a4b32007-05-04 19:56:22 +000058# The protocol we write by default. May be less than HIGHEST_PROTOCOL.
Guido van Rossumf4169812008-03-17 22:56:06 +000059# We intentionally write a protocol that Python 2.x cannot read;
60# there are too many issues with that.
61DEFAULT_PROTOCOL = 3
Guido van Rossum2e6a4b32007-05-04 19:56:22 +000062
Raymond Hettingeraef22fb2002-05-29 16:18:42 +000063class PickleError(Exception):
Neal Norwitzefbb67b2002-05-30 12:12:04 +000064 """A common base class for the other pickling exceptions."""
Raymond Hettingeraef22fb2002-05-29 16:18:42 +000065 pass
66
67class PicklingError(PickleError):
68 """This exception is raised when an unpicklable object is passed to the
69 dump() method.
70
71 """
72 pass
73
74class UnpicklingError(PickleError):
75 """This exception is raised when there is a problem unpickling an object,
76 such as a security violation.
77
78 Note that other exceptions may also be raised during unpickling, including
79 (but not necessarily limited to) AttributeError, EOFError, ImportError,
80 and IndexError.
81
82 """
83 pass
Guido van Rossum7849da81995-03-09 14:08:35 +000084
Tim Petersc0c12b52003-01-29 00:56:17 +000085# An instance of _Stop is raised by Unpickler.load_stop() in response to
86# the STOP opcode, passing the object that is the result of unpickling.
Guido van Rossumff871742000-12-13 18:11:56 +000087class _Stop(Exception):
88 def __init__(self, value):
89 self.value = value
90
Guido van Rossum533dbcf2003-01-28 17:55:05 +000091# Jython has PyStringMap; it's a dict subclass with string keys
Jeremy Hylton2b9d0291998-05-27 22:38:22 +000092try:
93 from org.python.core import PyStringMap
Brett Cannoncd171c82013-07-04 17:43:24 -040094except ImportError:
Jeremy Hylton2b9d0291998-05-27 22:38:22 +000095 PyStringMap = None
96
Tim Peters22a449a2003-01-27 20:16:36 +000097# Pickle opcodes. See pickletools.py for extensive docs. The listing
98# here is in kind-of alphabetical order of 1-character pickle code.
99# pickletools groups them by purpose.
Guido van Rossumdbb718f2001-09-21 19:22:34 +0000100
Guido van Rossum2e6a4b32007-05-04 19:56:22 +0000101MARK = b'(' # push special markobject on stack
102STOP = b'.' # every pickle ends with STOP
103POP = b'0' # discard topmost stack item
104POP_MARK = b'1' # discard stack top through topmost markobject
105DUP = b'2' # duplicate top stack item
106FLOAT = b'F' # push float object; decimal string argument
107INT = b'I' # push integer or bool; decimal string argument
108BININT = b'J' # push four-byte signed int
109BININT1 = b'K' # push 1-byte unsigned int
110LONG = b'L' # push long; decimal string argument
111BININT2 = b'M' # push 2-byte unsigned int
112NONE = b'N' # push None
113PERSID = b'P' # push persistent object; id is taken from string arg
114BINPERSID = b'Q' # " " " ; " " " " stack
115REDUCE = b'R' # apply callable to argtuple, both on stack
116STRING = b'S' # push string; NL-terminated string argument
117BINSTRING = b'T' # push string; counted binary string argument
118SHORT_BINSTRING= b'U' # " " ; " " " " < 256 bytes
119UNICODE = b'V' # push Unicode string; raw-unicode-escaped'd argument
120BINUNICODE = b'X' # " " " ; counted UTF-8 string argument
121APPEND = b'a' # append stack top to list below it
122BUILD = b'b' # call __setstate__ or __dict__.update()
123GLOBAL = b'c' # push self.find_class(modname, name); 2 string args
124DICT = b'd' # build a dict from stack items
125EMPTY_DICT = b'}' # push empty dict
126APPENDS = b'e' # extend list on stack by topmost stack slice
127GET = b'g' # push item from memo on stack; index is string arg
128BINGET = b'h' # " " " " " " ; " " 1-byte arg
129INST = b'i' # build & push class instance
130LONG_BINGET = b'j' # push item from memo on stack; index is 4-byte arg
131LIST = b'l' # build list from topmost stack items
132EMPTY_LIST = b']' # push empty list
133OBJ = b'o' # build & push class instance
134PUT = b'p' # store stack top in memo; index is string arg
135BINPUT = b'q' # " " " " " ; " " 1-byte arg
136LONG_BINPUT = b'r' # " " " " " ; " " 4-byte arg
137SETITEM = b's' # add key+value pair to dict
138TUPLE = b't' # build tuple from topmost stack items
139EMPTY_TUPLE = b')' # push empty tuple
140SETITEMS = b'u' # modify dict by adding topmost key+value pairs
141BINFLOAT = b'G' # push float; arg is 8-byte float encoding
Tim Peters22a449a2003-01-27 20:16:36 +0000142
Guido van Rossum2e6a4b32007-05-04 19:56:22 +0000143TRUE = b'I01\n' # not an opcode; see INT docs in pickletools.py
144FALSE = b'I00\n' # not an opcode; see INT docs in pickletools.py
Guido van Rossum77f6a652002-04-03 22:41:51 +0000145
Guido van Rossum586c9e82003-01-29 06:16:12 +0000146# Protocol 2
Guido van Rossum5a2d8f52003-01-27 21:44:25 +0000147
Guido van Rossum2e6a4b32007-05-04 19:56:22 +0000148PROTO = b'\x80' # identify pickle protocol
149NEWOBJ = b'\x81' # build object by applying cls.__new__ to argtuple
150EXT1 = b'\x82' # push object from extension registry; 1-byte index
151EXT2 = b'\x83' # ditto, but 2-byte index
152EXT4 = b'\x84' # ditto, but 4-byte index
153TUPLE1 = b'\x85' # build 1-tuple from stack top
154TUPLE2 = b'\x86' # build 2-tuple from two topmost stack items
155TUPLE3 = b'\x87' # build 3-tuple from three topmost stack items
156NEWTRUE = b'\x88' # push True
157NEWFALSE = b'\x89' # push False
158LONG1 = b'\x8a' # push long from < 256 bytes
159LONG4 = b'\x8b' # push really big long
Guido van Rossum5a2d8f52003-01-27 21:44:25 +0000160
Guido van Rossum44f0ea52003-01-28 04:14:51 +0000161_tuplesize2code = [EMPTY_TUPLE, TUPLE1, TUPLE2, TUPLE3]
162
Guido van Rossumf4169812008-03-17 22:56:06 +0000163# Protocol 3 (Python 3.x)
164
165BINBYTES = b'B' # push bytes; counted binary string argument
166SHORT_BINBYTES = b'C' # " " ; " " " " < 256 bytes
Guido van Rossuma48061a1995-01-10 00:31:14 +0000167
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +0100168# Protocol 4
169SHORT_BINUNICODE = b'\x8c' # push short string; UTF-8 length < 256 bytes
170BINUNICODE8 = b'\x8d' # push very long string
171BINBYTES8 = b'\x8e' # push very long bytes string
172EMPTY_SET = b'\x8f' # push empty set on the stack
173ADDITEMS = b'\x90' # modify set by adding topmost stack items
174FROZENSET = b'\x91' # build frozenset from topmost stack items
175NEWOBJ_EX = b'\x92' # like NEWOBJ but work with keyword only arguments
176STACK_GLOBAL = b'\x93' # same as GLOBAL but using names on the stacks
177MEMOIZE = b'\x94' # store top of the stack in memo
178FRAME = b'\x95' # indicate the beginning of a new frame
179
180__all__.extend([x for x in dir() if re.match("[A-Z][A-Z0-9_]+$", x)])
181
182
183class _Framer:
184
185 _FRAME_SIZE_TARGET = 64 * 1024
186
187 def __init__(self, file_write):
188 self.file_write = file_write
189 self.current_frame = None
190
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +0100191 def start_framing(self):
192 self.current_frame = io.BytesIO()
193
194 def end_framing(self):
Alexandre Vassalottib6a2f2a2013-11-23 20:30:03 -0800195 if self.current_frame and self.current_frame.tell() > 0:
196 self.commit_frame(force=True)
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +0100197 self.current_frame = None
198
Alexandre Vassalottib6a2f2a2013-11-23 20:30:03 -0800199 def commit_frame(self, force=False):
200 if self.current_frame:
201 f = self.current_frame
202 if f.tell() >= self._FRAME_SIZE_TARGET or force:
203 with f.getbuffer() as data:
204 n = len(data)
205 write = self.file_write
206 write(FRAME)
207 write(pack("<Q", n))
208 write(data)
209 f.seek(0)
210 f.truncate()
211
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +0100212 def write(self, data):
Alexandre Vassalottib6a2f2a2013-11-23 20:30:03 -0800213 if self.current_frame:
214 return self.current_frame.write(data)
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +0100215 else:
Alexandre Vassalottib6a2f2a2013-11-23 20:30:03 -0800216 return self.file_write(data)
217
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +0100218
219class _Unframer:
220
221 def __init__(self, file_read, file_readline, file_tell=None):
222 self.file_read = file_read
223 self.file_readline = file_readline
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +0100224 self.current_frame = None
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +0100225
226 def read(self, n):
Alexandre Vassalottib6a2f2a2013-11-23 20:30:03 -0800227 if self.current_frame:
228 data = self.current_frame.read(n)
229 if not data and n != 0:
230 self.current_frame = None
231 return self.file_read(n)
232 if len(data) < n:
233 raise UnpicklingError(
234 "pickle exhausted before end of frame")
235 return data
236 else:
237 return self.file_read(n)
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +0100238
239 def readline(self):
Alexandre Vassalottib6a2f2a2013-11-23 20:30:03 -0800240 if self.current_frame:
241 data = self.current_frame.readline()
242 if not data:
243 self.current_frame = None
244 return self.file_readline()
Serhiy Storchaka21d75332015-01-26 10:37:01 +0200245 if data[-1] != b'\n'[0]:
Alexandre Vassalottib6a2f2a2013-11-23 20:30:03 -0800246 raise UnpicklingError(
247 "pickle exhausted before end of frame")
248 return data
249 else:
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +0100250 return self.file_readline()
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +0100251
Alexandre Vassalottib6a2f2a2013-11-23 20:30:03 -0800252 def load_frame(self, frame_size):
253 if self.current_frame and self.current_frame.read() != b'':
254 raise UnpicklingError(
255 "beginning of a new frame before end of current frame")
256 self.current_frame = io.BytesIO(self.file_read(frame_size))
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +0100257
258
259# Tools used for pickling.
260
Serhiy Storchaka58e41342015-03-31 14:07:24 +0300261def _getattribute(obj, name):
262 for subpath in name.split('.'):
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +0100263 if subpath == '<locals>':
264 raise AttributeError("Can't get local attribute {!r} on {!r}"
265 .format(name, obj))
266 try:
Serhiy Storchaka58e41342015-03-31 14:07:24 +0300267 parent = obj
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +0100268 obj = getattr(obj, subpath)
269 except AttributeError:
270 raise AttributeError("Can't get attribute {!r} on {!r}"
271 .format(name, obj))
Serhiy Storchaka58e41342015-03-31 14:07:24 +0300272 return obj, parent
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +0100273
Serhiy Storchaka58e41342015-03-31 14:07:24 +0300274def whichmodule(obj, name):
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +0100275 """Find the module an object belong to."""
276 module_name = getattr(obj, '__module__', None)
277 if module_name is not None:
278 return module_name
Antoine Pitroue1618492014-10-04 22:15:27 +0200279 # Protect the iteration by using a list copy of sys.modules against dynamic
280 # modules that trigger imports of other modules upon calls to getattr.
281 for module_name, module in list(sys.modules.items()):
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +0100282 if module_name == '__main__' or module is None:
283 continue
284 try:
Serhiy Storchaka58e41342015-03-31 14:07:24 +0300285 if _getattribute(module, name)[0] is obj:
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +0100286 return module_name
287 except AttributeError:
288 pass
289 return '__main__'
290
291def encode_long(x):
292 r"""Encode a long to a two's complement little-endian binary string.
293 Note that 0 is a special case, returning an empty string, to save a
294 byte in the LONG1 pickling context.
295
296 >>> encode_long(0)
297 b''
298 >>> encode_long(255)
299 b'\xff\x00'
300 >>> encode_long(32767)
301 b'\xff\x7f'
302 >>> encode_long(-256)
303 b'\x00\xff'
304 >>> encode_long(-32768)
305 b'\x00\x80'
306 >>> encode_long(-128)
307 b'\x80'
308 >>> encode_long(127)
309 b'\x7f'
310 >>>
311 """
312 if x == 0:
313 return b''
314 nbytes = (x.bit_length() >> 3) + 1
315 result = x.to_bytes(nbytes, byteorder='little', signed=True)
316 if x < 0 and nbytes > 1:
317 if result[-1] == 0xff and (result[-2] & 0x80) != 0:
318 result = result[:-1]
319 return result
320
321def decode_long(data):
322 r"""Decode a long from a two's complement little-endian binary string.
323
324 >>> decode_long(b'')
325 0
326 >>> decode_long(b"\xff\x00")
327 255
328 >>> decode_long(b"\xff\x7f")
329 32767
330 >>> decode_long(b"\x00\xff")
331 -256
332 >>> decode_long(b"\x00\x80")
333 -32768
334 >>> decode_long(b"\x80")
335 -128
336 >>> decode_long(b"\x7f")
337 127
338 """
339 return int.from_bytes(data, byteorder='little', signed=True)
340
Skip Montanaro23bafc62001-02-18 03:10:09 +0000341
Guido van Rossum1be31752003-01-28 15:19:53 +0000342# Pickling machinery
343
Alexandre Vassalottica2d6102008-06-12 18:26:05 +0000344class _Pickler:
Guido van Rossuma48061a1995-01-10 00:31:14 +0000345
Antoine Pitroud9dfaa92009-06-04 20:32:06 +0000346 def __init__(self, file, protocol=None, *, fix_imports=True):
Guido van Rossum2e6a4b32007-05-04 19:56:22 +0000347 """This takes a binary file for writing a pickle data stream.
348
Alexandre Vassalottid05c9ff2013-12-07 01:09:27 -0800349 The optional *protocol* argument tells the pickler to use the
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +0100350 given protocol; supported protocols are 0, 1, 2, 3 and 4. The
Alexandre Vassalottid05c9ff2013-12-07 01:09:27 -0800351 default protocol is 3; a backward-incompatible protocol designed
352 for Python 3.
Guido van Rossumf29d3d62003-01-27 22:47:53 +0000353
Guido van Rossum7eff63a2003-01-31 19:42:31 +0000354 Specifying a negative protocol version selects the highest
Tim Peters5bd2a792003-02-01 16:45:06 +0000355 protocol version supported. The higher the protocol used, the
356 more recent the version of Python needed to read the pickle
357 produced.
Raymond Hettingeraef22fb2002-05-29 16:18:42 +0000358
Alexandre Vassalottid05c9ff2013-12-07 01:09:27 -0800359 The *file* argument must have a write() method that accepts a
360 single bytes argument. It can thus be a file object opened for
Martin Panter7462b6492015-11-02 03:37:02 +0000361 binary writing, an io.BytesIO instance, or any other custom
Alexandre Vassalottid05c9ff2013-12-07 01:09:27 -0800362 object that meets this interface.
Antoine Pitroud9dfaa92009-06-04 20:32:06 +0000363
Alexandre Vassalottid05c9ff2013-12-07 01:09:27 -0800364 If *fix_imports* is True and *protocol* is less than 3, pickle
365 will try to map the new Python 3 names to the old module names
366 used in Python 2, so that the pickle data stream is readable
367 with Python 2.
Raymond Hettingeraef22fb2002-05-29 16:18:42 +0000368 """
Guido van Rossumcf117b02003-02-09 17:19:41 +0000369 if protocol is None:
Guido van Rossum2e6a4b32007-05-04 19:56:22 +0000370 protocol = DEFAULT_PROTOCOL
Guido van Rossumcf117b02003-02-09 17:19:41 +0000371 if protocol < 0:
Tim Peters8587b3c2003-02-13 15:44:41 +0000372 protocol = HIGHEST_PROTOCOL
373 elif not 0 <= protocol <= HIGHEST_PROTOCOL:
374 raise ValueError("pickle protocol must be <= %d" % HIGHEST_PROTOCOL)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +0000375 try:
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +0100376 self._file_write = file.write
Alexandre Vassalottica2d6102008-06-12 18:26:05 +0000377 except AttributeError:
378 raise TypeError("file must have a 'write' attribute")
Alexandre Vassalottib6a2f2a2013-11-23 20:30:03 -0800379 self.framer = _Framer(self._file_write)
380 self.write = self.framer.write
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000381 self.memo = {}
Guido van Rossumcf117b02003-02-09 17:19:41 +0000382 self.proto = int(protocol)
383 self.bin = protocol >= 1
Guido van Rossum5d9113d2003-01-29 17:58:45 +0000384 self.fast = 0
Antoine Pitroud9dfaa92009-06-04 20:32:06 +0000385 self.fix_imports = fix_imports and protocol < 3
Guido van Rossuma48061a1995-01-10 00:31:14 +0000386
Fred Drake7f781c92002-05-01 20:33:53 +0000387 def clear_memo(self):
Raymond Hettingeraef22fb2002-05-29 16:18:42 +0000388 """Clears the pickler's "memo".
389
390 The memo is the data structure that remembers which objects the
Alexandre Vassalottid05c9ff2013-12-07 01:09:27 -0800391 pickler has already seen, so that shared or recursive objects
392 are pickled by reference and not by value. This method is
393 useful when re-using picklers.
Raymond Hettingeraef22fb2002-05-29 16:18:42 +0000394 """
Fred Drake7f781c92002-05-01 20:33:53 +0000395 self.memo.clear()
396
Guido van Rossum3a41c612003-01-28 15:10:22 +0000397 def dump(self, obj):
Tim Peters5bd2a792003-02-01 16:45:06 +0000398 """Write a pickled representation of obj to the open file."""
Alexandre Vassalotti3cfcab92008-12-27 09:30:39 +0000399 # Check whether Pickler was initialized correctly. This is
400 # only needed to mimic the behavior of _pickle.Pickler.dump().
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +0100401 if not hasattr(self, "_file_write"):
Alexandre Vassalotti3cfcab92008-12-27 09:30:39 +0000402 raise PicklingError("Pickler.__init__() was not called by "
403 "%s.__init__()" % (self.__class__.__name__,))
Guido van Rossumd6c9e632003-01-28 03:49:52 +0000404 if self.proto >= 2:
Alexandre Vassalottib6a2f2a2013-11-23 20:30:03 -0800405 self.write(PROTO + pack("<B", self.proto))
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +0100406 if self.proto >= 4:
Alexandre Vassalottib6a2f2a2013-11-23 20:30:03 -0800407 self.framer.start_framing()
Guido van Rossum3a41c612003-01-28 15:10:22 +0000408 self.save(obj)
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000409 self.write(STOP)
Alexandre Vassalottib6a2f2a2013-11-23 20:30:03 -0800410 self.framer.end_framing()
Guido van Rossuma48061a1995-01-10 00:31:14 +0000411
Jeremy Hylton3422c992003-01-24 19:29:52 +0000412 def memoize(self, obj):
413 """Store an object in the memo."""
414
Tim Peterse46b73f2003-01-27 21:22:10 +0000415 # The Pickler memo is a dictionary mapping object ids to 2-tuples
416 # that contain the Unpickler memo key and the object being memoized.
417 # The memo key is written to the pickle and will become
Jeremy Hylton3422c992003-01-24 19:29:52 +0000418 # the key in the Unpickler's memo. The object is stored in the
Tim Peterse46b73f2003-01-27 21:22:10 +0000419 # Pickler memo so that transient objects are kept alive during
420 # pickling.
Jeremy Hylton3422c992003-01-24 19:29:52 +0000421
Tim Peterse46b73f2003-01-27 21:22:10 +0000422 # The use of the Unpickler memo length as the memo key is just a
423 # convention. The only requirement is that the memo values be unique.
424 # But there appears no advantage to any other scheme, and this
Tim Peterscbd0a322003-01-28 00:24:43 +0000425 # scheme allows the Unpickler memo to be implemented as a plain (but
Tim Peterse46b73f2003-01-27 21:22:10 +0000426 # growable) array, indexed by memo key.
Guido van Rossum5d9113d2003-01-29 17:58:45 +0000427 if self.fast:
428 return
Guido van Rossum9b40e802003-01-30 06:37:41 +0000429 assert id(obj) not in self.memo
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +0100430 idx = len(self.memo)
431 self.write(self.put(idx))
432 self.memo[id(obj)] = idx, obj
Jeremy Hylton3422c992003-01-24 19:29:52 +0000433
Tim Petersbb38e302003-01-27 21:25:41 +0000434 # Return a PUT (BINPUT, LONG_BINPUT) opcode string, with argument i.
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +0100435 def put(self, idx):
436 if self.proto >= 4:
437 return MEMOIZE
438 elif self.bin:
439 if idx < 256:
440 return BINPUT + pack("<B", idx)
Guido van Rossum5c938d02003-01-28 03:03:08 +0000441 else:
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +0100442 return LONG_BINPUT + pack("<I", idx)
443 else:
444 return PUT + repr(idx).encode("ascii") + b'\n'
Guido van Rossuma48061a1995-01-10 00:31:14 +0000445
Tim Petersbb38e302003-01-27 21:25:41 +0000446 # Return a GET (BINGET, LONG_BINGET) opcode string, with argument i.
Serhiy Storchakaa3e32c92013-04-14 13:37:02 +0300447 def get(self, i):
Tim Petersc32d8242001-04-10 02:48:53 +0000448 if self.bin:
Tim Petersc32d8242001-04-10 02:48:53 +0000449 if i < 256:
Serhiy Storchakaa3e32c92013-04-14 13:37:02 +0300450 return BINGET + pack("<B", i)
Guido van Rossum5c938d02003-01-28 03:03:08 +0000451 else:
Antoine Pitroubf6ecf92012-11-24 20:40:21 +0100452 return LONG_BINGET + pack("<I", i)
Guido van Rossuma48061a1995-01-10 00:31:14 +0000453
Guido van Rossum39478e82007-08-27 17:23:59 +0000454 return GET + repr(i).encode("ascii") + b'\n'
Tim Peters2344fae2001-01-15 00:50:52 +0000455
Alexandre Vassalottica2d6102008-06-12 18:26:05 +0000456 def save(self, obj, save_persistent_id=True):
Alexandre Vassalottib6a2f2a2013-11-23 20:30:03 -0800457 self.framer.commit_frame()
458
Guido van Rossumbc64e222003-01-28 16:34:19 +0000459 # Check for persistent id (defined by a subclass)
Guido van Rossum3a41c612003-01-28 15:10:22 +0000460 pid = self.persistent_id(obj)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +0000461 if pid is not None and save_persistent_id:
Jeremy Hylton5e0f4e72002-11-13 22:01:27 +0000462 self.save_pers(pid)
463 return
Guido van Rossuma48061a1995-01-10 00:31:14 +0000464
Guido van Rossumbc64e222003-01-28 16:34:19 +0000465 # Check the memo
466 x = self.memo.get(id(obj))
Serhiy Storchakaa3e32c92013-04-14 13:37:02 +0300467 if x is not None:
Guido van Rossumbc64e222003-01-28 16:34:19 +0000468 self.write(self.get(x[0]))
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000469 return
470
Guido van Rossumbc64e222003-01-28 16:34:19 +0000471 # Check the type dispatch table
Guido van Rossum3a41c612003-01-28 15:10:22 +0000472 t = type(obj)
Guido van Rossumbc64e222003-01-28 16:34:19 +0000473 f = self.dispatch.get(t)
Serhiy Storchakaa3e32c92013-04-14 13:37:02 +0300474 if f is not None:
Guido van Rossumbc64e222003-01-28 16:34:19 +0000475 f(self, obj) # Call unbound method with explicit self
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000476 return
477
Antoine Pitrou8d3c2902012-03-04 18:31:48 +0100478 # Check private dispatch table if any, or else copyreg.dispatch_table
479 reduce = getattr(self, 'dispatch_table', dispatch_table).get(t)
Serhiy Storchakaa3e32c92013-04-14 13:37:02 +0300480 if reduce is not None:
Guido van Rossumc53f0092003-02-18 22:05:12 +0000481 rv = reduce(obj)
482 else:
Antoine Pitrouffd41d92011-10-04 09:23:04 +0200483 # Check for a class with a custom metaclass; treat as regular class
484 try:
485 issc = issubclass(t, type)
486 except TypeError: # t is not a class (old Boost; see SF #502085)
487 issc = False
488 if issc:
489 self.save_global(obj)
490 return
491
Guido van Rossumc53f0092003-02-18 22:05:12 +0000492 # Check for a __reduce_ex__ method, fall back to __reduce__
493 reduce = getattr(obj, "__reduce_ex__", None)
Serhiy Storchakaa3e32c92013-04-14 13:37:02 +0300494 if reduce is not None:
Guido van Rossumc53f0092003-02-18 22:05:12 +0000495 rv = reduce(self.proto)
496 else:
497 reduce = getattr(obj, "__reduce__", None)
Serhiy Storchakaa3e32c92013-04-14 13:37:02 +0300498 if reduce is not None:
Guido van Rossumc53f0092003-02-18 22:05:12 +0000499 rv = reduce()
500 else:
501 raise PicklingError("Can't pickle %r object: %r" %
502 (t.__name__, obj))
Tim Petersb32a8312003-01-28 00:48:09 +0000503
Guido van Rossumbc64e222003-01-28 16:34:19 +0000504 # Check for string returned by reduce(), meaning "save as global"
Guido van Rossum3172c5d2007-10-16 18:12:55 +0000505 if isinstance(rv, str):
Guido van Rossumbc64e222003-01-28 16:34:19 +0000506 self.save_global(obj, rv)
Tim Petersb32a8312003-01-28 00:48:09 +0000507 return
508
Guido van Rossumbc64e222003-01-28 16:34:19 +0000509 # Assert that reduce() returned a tuple
Guido van Rossum13257902007-06-07 23:15:56 +0000510 if not isinstance(rv, tuple):
Guido van Rossumbc64e222003-01-28 16:34:19 +0000511 raise PicklingError("%s must return string or tuple" % reduce)
Tim Petersb32a8312003-01-28 00:48:09 +0000512
Guido van Rossum25cb7df2003-01-31 18:53:21 +0000513 # Assert that it returned an appropriately sized tuple
Guido van Rossumbc64e222003-01-28 16:34:19 +0000514 l = len(rv)
Guido van Rossum25cb7df2003-01-31 18:53:21 +0000515 if not (2 <= l <= 5):
Guido van Rossumbc64e222003-01-28 16:34:19 +0000516 raise PicklingError("Tuple returned by %s must have "
Guido van Rossum25cb7df2003-01-31 18:53:21 +0000517 "two to five elements" % reduce)
Tim Petersb32a8312003-01-28 00:48:09 +0000518
Guido van Rossumbc64e222003-01-28 16:34:19 +0000519 # Save the reduce() output and finally memoize the object
Guido van Rossum25cb7df2003-01-31 18:53:21 +0000520 self.save_reduce(obj=obj, *rv)
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000521
Guido van Rossum3a41c612003-01-28 15:10:22 +0000522 def persistent_id(self, obj):
Guido van Rossumbc64e222003-01-28 16:34:19 +0000523 # This exists so a subclass can override it
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000524 return None
525
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000526 def save_pers(self, pid):
Guido van Rossumbc64e222003-01-28 16:34:19 +0000527 # Save a persistent id reference
Tim Petersbd1cdb92003-01-28 01:03:10 +0000528 if self.bin:
Alexandre Vassalottica2d6102008-06-12 18:26:05 +0000529 self.save(pid, save_persistent_id=False)
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000530 self.write(BINPERSID)
Tim Petersbd1cdb92003-01-28 01:03:10 +0000531 else:
Serhiy Storchakadec25af2016-07-17 11:24:17 +0300532 try:
533 self.write(PERSID + str(pid).encode("ascii") + b'\n')
534 except UnicodeEncodeError:
535 raise PicklingError(
536 "persistent IDs in protocol 0 must be ASCII strings")
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000537
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +0100538 def save_reduce(self, func, args, state=None, listitems=None,
539 dictitems=None, obj=None):
Jeremy Hyltone3a565e2003-06-29 16:59:59 +0000540 # This API is called by some subclasses
Guido van Rossumbc64e222003-01-28 16:34:19 +0000541
Guido van Rossum13257902007-06-07 23:15:56 +0000542 if not isinstance(args, tuple):
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +0100543 raise PicklingError("args from save_reduce() must be a tuple")
Florent Xicluna5d1155c2011-10-28 14:45:05 +0200544 if not callable(func):
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +0100545 raise PicklingError("func from save_reduce() must be callable")
Guido van Rossumbc64e222003-01-28 16:34:19 +0000546
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000547 save = self.save
Guido van Rossumbc64e222003-01-28 16:34:19 +0000548 write = self.write
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000549
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +0100550 func_name = getattr(func, "__name__", "")
551 if self.proto >= 4 and func_name == "__newobj_ex__":
552 cls, args, kwargs = args
553 if not hasattr(cls, "__new__"):
554 raise PicklingError("args[0] from {} args has no __new__"
555 .format(func_name))
556 if obj is not None and cls is not obj.__class__:
557 raise PicklingError("args[0] from {} args has the wrong class"
558 .format(func_name))
559 save(cls)
560 save(args)
561 save(kwargs)
562 write(NEWOBJ_EX)
563 elif self.proto >= 2 and func_name == "__newobj__":
564 # A __reduce__ implementation can direct protocol 2 or newer to
Guido van Rossumd053b4b2003-01-31 16:51:45 +0000565 # use the more efficient NEWOBJ opcode, while still
566 # allowing protocol 0 and 1 to work normally. For this to
567 # work, the function returned by __reduce__ should be
568 # called __newobj__, and its first argument should be a
Florent Xiclunaaa6c1d22011-12-12 18:54:29 +0100569 # class. The implementation for __newobj__
Guido van Rossumd053b4b2003-01-31 16:51:45 +0000570 # should be as follows, although pickle has no way to
571 # verify this:
572 #
573 # def __newobj__(cls, *args):
574 # return cls.__new__(cls, *args)
575 #
576 # Protocols 0 and 1 will pickle a reference to __newobj__,
577 # while protocol 2 (and above) will pickle a reference to
578 # cls, the remaining args tuple, and the NEWOBJ code,
579 # which calls cls.__new__(cls, *args) at unpickling time
580 # (see load_newobj below). If __reduce__ returns a
581 # three-tuple, the state from the third tuple item will be
582 # pickled regardless of the protocol, calling __setstate__
583 # at unpickling time (see load_build below).
584 #
585 # Note that no standard __newobj__ implementation exists;
586 # you have to provide your own. This is to enforce
587 # compatibility with Python 2.2 (pickles written using
588 # protocol 0 or 1 in Python 2.3 should be unpicklable by
589 # Python 2.2).
590 cls = args[0]
591 if not hasattr(cls, "__new__"):
592 raise PicklingError(
593 "args[0] from __newobj__ args has no __new__")
Guido van Rossumf7f45172003-01-31 17:17:49 +0000594 if obj is not None and cls is not obj.__class__:
595 raise PicklingError(
596 "args[0] from __newobj__ args has the wrong class")
Guido van Rossumd053b4b2003-01-31 16:51:45 +0000597 args = args[1:]
598 save(cls)
599 save(args)
600 write(NEWOBJ)
601 else:
602 save(func)
603 save(args)
604 write(REDUCE)
Tim Peters2344fae2001-01-15 00:50:52 +0000605
Guido van Rossumf7f45172003-01-31 17:17:49 +0000606 if obj is not None:
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +0100607 # If the object is already in the memo, this means it is
608 # recursive. In this case, throw away everything we put on the
609 # stack, and fetch the object back from the memo.
610 if id(obj) in self.memo:
611 write(POP + self.get(self.memo[id(obj)][0]))
612 else:
613 self.memoize(obj)
Guido van Rossumf7f45172003-01-31 17:17:49 +0000614
Guido van Rossum25cb7df2003-01-31 18:53:21 +0000615 # More new special cases (that work with older protocols as
616 # well): when __reduce__ returns a tuple with 4 or 5 items,
617 # the 4th and 5th item should be iterators that provide list
618 # items and dict items (as (key, value) tuples), or None.
619
620 if listitems is not None:
621 self._batch_appends(listitems)
622
623 if dictitems is not None:
624 self._batch_setitems(dictitems)
625
Tim Petersc32d8242001-04-10 02:48:53 +0000626 if state is not None:
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000627 save(state)
628 write(BUILD)
629
Guido van Rossumbc64e222003-01-28 16:34:19 +0000630 # Methods below this point are dispatched through the dispatch table
631
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000632 dispatch = {}
633
Guido van Rossum3a41c612003-01-28 15:10:22 +0000634 def save_none(self, obj):
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000635 self.write(NONE)
Guido van Rossum13257902007-06-07 23:15:56 +0000636 dispatch[type(None)] = save_none
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000637
Guido van Rossum3a41c612003-01-28 15:10:22 +0000638 def save_bool(self, obj):
Guido van Rossum7d97d312003-01-28 04:25:27 +0000639 if self.proto >= 2:
Serhiy Storchakaa3e32c92013-04-14 13:37:02 +0300640 self.write(NEWTRUE if obj else NEWFALSE)
Guido van Rossum7d97d312003-01-28 04:25:27 +0000641 else:
Serhiy Storchakaa3e32c92013-04-14 13:37:02 +0300642 self.write(TRUE if obj else FALSE)
Guido van Rossum77f6a652002-04-03 22:41:51 +0000643 dispatch[bool] = save_bool
644
Serhiy Storchakaa3e32c92013-04-14 13:37:02 +0300645 def save_long(self, obj):
Guido van Rossumddefaf32007-01-14 03:31:43 +0000646 if self.bin:
647 # If the int is small enough to fit in a signed 4-byte 2's-comp
648 # format, we can store it more efficiently than the general
649 # case.
650 # First one- and two-byte unsigned ints:
651 if obj >= 0:
652 if obj <= 0xff:
Serhiy Storchakaa3e32c92013-04-14 13:37:02 +0300653 self.write(BININT1 + pack("<B", obj))
Guido van Rossumddefaf32007-01-14 03:31:43 +0000654 return
655 if obj <= 0xffff:
Serhiy Storchakaa3e32c92013-04-14 13:37:02 +0300656 self.write(BININT2 + pack("<H", obj))
Guido van Rossumddefaf32007-01-14 03:31:43 +0000657 return
658 # Next check for 4-byte signed ints:
Serhiy Storchakaa3e32c92013-04-14 13:37:02 +0300659 if -0x80000000 <= obj <= 0x7fffffff:
Guido van Rossumddefaf32007-01-14 03:31:43 +0000660 self.write(BININT + pack("<i", obj))
661 return
Guido van Rossumd6c9e632003-01-28 03:49:52 +0000662 if self.proto >= 2:
Guido van Rossum2e6a4b32007-05-04 19:56:22 +0000663 encoded = encode_long(obj)
664 n = len(encoded)
Guido van Rossumd6c9e632003-01-28 03:49:52 +0000665 if n < 256:
Serhiy Storchakaa3e32c92013-04-14 13:37:02 +0300666 self.write(LONG1 + pack("<B", n) + encoded)
Guido van Rossumd6c9e632003-01-28 03:49:52 +0000667 else:
Guido van Rossum2e6a4b32007-05-04 19:56:22 +0000668 self.write(LONG4 + pack("<i", n) + encoded)
Tim Petersee1a53c2003-02-02 02:57:53 +0000669 return
Mark Dickinson8dd05142009-01-20 20:43:58 +0000670 self.write(LONG + repr(obj).encode("ascii") + b'L\n')
Guido van Rossum13257902007-06-07 23:15:56 +0000671 dispatch[int] = save_long
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000672
Serhiy Storchakaa3e32c92013-04-14 13:37:02 +0300673 def save_float(self, obj):
Guido van Rossumd3703791998-10-22 20:15:36 +0000674 if self.bin:
Guido van Rossum3a41c612003-01-28 15:10:22 +0000675 self.write(BINFLOAT + pack('>d', obj))
Guido van Rossumd3703791998-10-22 20:15:36 +0000676 else:
Guido van Rossum39478e82007-08-27 17:23:59 +0000677 self.write(FLOAT + repr(obj).encode("ascii") + b'\n')
Guido van Rossum13257902007-06-07 23:15:56 +0000678 dispatch[float] = save_float
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000679
Serhiy Storchakaa3e32c92013-04-14 13:37:02 +0300680 def save_bytes(self, obj):
Guido van Rossumf4169812008-03-17 22:56:06 +0000681 if self.proto < 3:
Serhiy Storchakaa3e32c92013-04-14 13:37:02 +0300682 if not obj: # bytes object is empty
Alexandre Vassalotti3bfc65a2011-12-13 13:08:09 -0500683 self.save_reduce(bytes, (), obj=obj)
684 else:
685 self.save_reduce(codecs.encode,
686 (str(obj, 'latin1'), 'latin1'), obj=obj)
Guido van Rossumf4169812008-03-17 22:56:06 +0000687 return
688 n = len(obj)
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +0100689 if n <= 0xff:
Serhiy Storchakaa3e32c92013-04-14 13:37:02 +0300690 self.write(SHORT_BINBYTES + pack("<B", n) + obj)
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +0100691 elif n > 0xffffffff and self.proto >= 4:
692 self.write(BINBYTES8 + pack("<Q", n) + obj)
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000693 else:
Serhiy Storchakaa3e32c92013-04-14 13:37:02 +0300694 self.write(BINBYTES + pack("<I", n) + obj)
Guido van Rossum3a41c612003-01-28 15:10:22 +0000695 self.memoize(obj)
Guido van Rossumf4169812008-03-17 22:56:06 +0000696 dispatch[bytes] = save_bytes
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000697
Serhiy Storchakaa3e32c92013-04-14 13:37:02 +0300698 def save_str(self, obj):
Tim Petersc32d8242001-04-10 02:48:53 +0000699 if self.bin:
Victor Stinner485fb562010-04-13 11:07:24 +0000700 encoded = obj.encode('utf-8', 'surrogatepass')
Guido van Rossum2e6a4b32007-05-04 19:56:22 +0000701 n = len(encoded)
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +0100702 if n <= 0xff and self.proto >= 4:
703 self.write(SHORT_BINUNICODE + pack("<B", n) + encoded)
704 elif n > 0xffffffff and self.proto >= 4:
705 self.write(BINUNICODE8 + pack("<Q", n) + encoded)
706 else:
707 self.write(BINUNICODE + pack("<I", n) + encoded)
Guido van Rossumb5f2f1b2000-03-10 23:20:09 +0000708 else:
Guido van Rossum3a41c612003-01-28 15:10:22 +0000709 obj = obj.replace("\\", "\\u005c")
710 obj = obj.replace("\n", "\\u000a")
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +0100711 self.write(UNICODE + obj.encode('raw-unicode-escape') +
712 b'\n')
Guido van Rossum3a41c612003-01-28 15:10:22 +0000713 self.memoize(obj)
Guido van Rossumf4169812008-03-17 22:56:06 +0000714 dispatch[str] = save_str
Tim Peters658cba62001-02-09 20:06:00 +0000715
Guido van Rossum3a41c612003-01-28 15:10:22 +0000716 def save_tuple(self, obj):
Serhiy Storchakaa3e32c92013-04-14 13:37:02 +0300717 if not obj: # tuple is empty
718 if self.bin:
719 self.write(EMPTY_TUPLE)
Tim Peters1d63c9f2003-02-02 20:29:39 +0000720 else:
Serhiy Storchakaa3e32c92013-04-14 13:37:02 +0300721 self.write(MARK + TUPLE)
Tim Petersd97da802003-01-28 05:48:29 +0000722 return
723
Serhiy Storchakaa3e32c92013-04-14 13:37:02 +0300724 n = len(obj)
Tim Petersd97da802003-01-28 05:48:29 +0000725 save = self.save
726 memo = self.memo
Serhiy Storchakaa3e32c92013-04-14 13:37:02 +0300727 if n <= 3 and self.proto >= 2:
Guido van Rossum3a41c612003-01-28 15:10:22 +0000728 for element in obj:
Tim Petersd97da802003-01-28 05:48:29 +0000729 save(element)
730 # Subtle. Same as in the big comment below.
Guido van Rossum3a41c612003-01-28 15:10:22 +0000731 if id(obj) in memo:
732 get = self.get(memo[id(obj)][0])
Serhiy Storchakaa3e32c92013-04-14 13:37:02 +0300733 self.write(POP * n + get)
Tim Petersd97da802003-01-28 05:48:29 +0000734 else:
Serhiy Storchakaa3e32c92013-04-14 13:37:02 +0300735 self.write(_tuplesize2code[n])
Guido van Rossum3a41c612003-01-28 15:10:22 +0000736 self.memoize(obj)
Tim Petersd97da802003-01-28 05:48:29 +0000737 return
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000738
Tim Peters1d63c9f2003-02-02 20:29:39 +0000739 # proto 0 or proto 1 and tuple isn't empty, or proto > 1 and tuple
Tim Petersff57bff2003-01-28 05:34:53 +0000740 # has more than 3 elements.
Serhiy Storchakaa3e32c92013-04-14 13:37:02 +0300741 write = self.write
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000742 write(MARK)
Guido van Rossum3a41c612003-01-28 15:10:22 +0000743 for element in obj:
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000744 save(element)
745
Tim Peters1d63c9f2003-02-02 20:29:39 +0000746 if id(obj) in memo:
Tim Petersf558da02003-01-28 02:09:55 +0000747 # Subtle. d was not in memo when we entered save_tuple(), so
748 # the process of saving the tuple's elements must have saved
749 # the tuple itself: the tuple is recursive. The proper action
750 # now is to throw away everything we put on the stack, and
751 # simply GET the tuple (it's already constructed). This check
752 # could have been done in the "for element" loop instead, but
753 # recursive tuples are a rare thing.
Guido van Rossum3a41c612003-01-28 15:10:22 +0000754 get = self.get(memo[id(obj)][0])
Serhiy Storchakaa3e32c92013-04-14 13:37:02 +0300755 if self.bin:
Tim Petersf558da02003-01-28 02:09:55 +0000756 write(POP_MARK + get)
757 else: # proto 0 -- POP_MARK not available
Tim Petersd97da802003-01-28 05:48:29 +0000758 write(POP * (n+1) + get)
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000759 return
760
Tim Peters1d63c9f2003-02-02 20:29:39 +0000761 # No recursion.
Serhiy Storchakaa3e32c92013-04-14 13:37:02 +0300762 write(TUPLE)
Tim Peters1d63c9f2003-02-02 20:29:39 +0000763 self.memoize(obj)
Jeremy Hylton3422c992003-01-24 19:29:52 +0000764
Guido van Rossum13257902007-06-07 23:15:56 +0000765 dispatch[tuple] = save_tuple
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000766
Guido van Rossum3a41c612003-01-28 15:10:22 +0000767 def save_list(self, obj):
Tim Petersc32d8242001-04-10 02:48:53 +0000768 if self.bin:
Serhiy Storchakaa3e32c92013-04-14 13:37:02 +0300769 self.write(EMPTY_LIST)
Guido van Rossum25cb7df2003-01-31 18:53:21 +0000770 else: # proto 0 -- can't use EMPTY_LIST
Serhiy Storchakaa3e32c92013-04-14 13:37:02 +0300771 self.write(MARK + LIST)
Guido van Rossum25cb7df2003-01-31 18:53:21 +0000772
773 self.memoize(obj)
Alexandre Vassalottic7db1d62008-05-14 21:57:18 +0000774 self._batch_appends(obj)
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000775
Guido van Rossum13257902007-06-07 23:15:56 +0000776 dispatch[list] = save_list
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000777
Guido van Rossum25cb7df2003-01-31 18:53:21 +0000778 _BATCHSIZE = 1000
779
780 def _batch_appends(self, items):
781 # Helper to batch up APPENDS sequences
782 save = self.save
783 write = self.write
784
785 if not self.bin:
786 for x in items:
787 save(x)
788 write(APPEND)
789 return
790
Serhiy Storchakaa3e32c92013-04-14 13:37:02 +0300791 it = iter(items)
792 while True:
793 tmp = list(islice(it, self._BATCHSIZE))
Guido van Rossum25cb7df2003-01-31 18:53:21 +0000794 n = len(tmp)
795 if n > 1:
796 write(MARK)
797 for x in tmp:
798 save(x)
799 write(APPENDS)
800 elif n:
801 save(tmp[0])
802 write(APPEND)
803 # else tmp is empty, and we're done
Serhiy Storchakaa3e32c92013-04-14 13:37:02 +0300804 if n < self._BATCHSIZE:
805 return
Guido van Rossum25cb7df2003-01-31 18:53:21 +0000806
Guido van Rossum3a41c612003-01-28 15:10:22 +0000807 def save_dict(self, obj):
Tim Petersc32d8242001-04-10 02:48:53 +0000808 if self.bin:
Serhiy Storchakaa3e32c92013-04-14 13:37:02 +0300809 self.write(EMPTY_DICT)
Guido van Rossum25cb7df2003-01-31 18:53:21 +0000810 else: # proto 0 -- can't use EMPTY_DICT
Serhiy Storchakaa3e32c92013-04-14 13:37:02 +0300811 self.write(MARK + DICT)
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000812
Guido van Rossum25cb7df2003-01-31 18:53:21 +0000813 self.memoize(obj)
Alexandre Vassalottic7db1d62008-05-14 21:57:18 +0000814 self._batch_setitems(obj.items())
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000815
Guido van Rossum13257902007-06-07 23:15:56 +0000816 dispatch[dict] = save_dict
817 if PyStringMap is not None:
Jeremy Hylton2b9d0291998-05-27 22:38:22 +0000818 dispatch[PyStringMap] = save_dict
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000819
Guido van Rossum25cb7df2003-01-31 18:53:21 +0000820 def _batch_setitems(self, items):
821 # Helper to batch up SETITEMS sequences; proto >= 1 only
822 save = self.save
823 write = self.write
824
825 if not self.bin:
826 for k, v in items:
827 save(k)
828 save(v)
829 write(SETITEM)
830 return
831
Serhiy Storchakaa3e32c92013-04-14 13:37:02 +0300832 it = iter(items)
833 while True:
834 tmp = list(islice(it, self._BATCHSIZE))
Guido van Rossum25cb7df2003-01-31 18:53:21 +0000835 n = len(tmp)
836 if n > 1:
837 write(MARK)
838 for k, v in tmp:
839 save(k)
840 save(v)
841 write(SETITEMS)
842 elif n:
843 k, v = tmp[0]
844 save(k)
845 save(v)
846 write(SETITEM)
847 # else tmp is empty, and we're done
Serhiy Storchakaa3e32c92013-04-14 13:37:02 +0300848 if n < self._BATCHSIZE:
849 return
Guido van Rossum25cb7df2003-01-31 18:53:21 +0000850
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +0100851 def save_set(self, obj):
852 save = self.save
853 write = self.write
854
855 if self.proto < 4:
856 self.save_reduce(set, (list(obj),), obj=obj)
857 return
858
859 write(EMPTY_SET)
860 self.memoize(obj)
861
862 it = iter(obj)
863 while True:
864 batch = list(islice(it, self._BATCHSIZE))
865 n = len(batch)
866 if n > 0:
867 write(MARK)
868 for item in batch:
869 save(item)
870 write(ADDITEMS)
871 if n < self._BATCHSIZE:
872 return
873 dispatch[set] = save_set
874
875 def save_frozenset(self, obj):
876 save = self.save
877 write = self.write
878
879 if self.proto < 4:
880 self.save_reduce(frozenset, (list(obj),), obj=obj)
881 return
882
883 write(MARK)
884 for item in obj:
885 save(item)
886
887 if id(obj) in self.memo:
888 # If the object is already in the memo, this means it is
889 # recursive. In this case, throw away everything we put on the
890 # stack, and fetch the object back from the memo.
891 write(POP_MARK + self.get(self.memo[id(obj)][0]))
892 return
893
894 write(FROZENSET)
895 self.memoize(obj)
896 dispatch[frozenset] = save_frozenset
897
Serhiy Storchakaa3e32c92013-04-14 13:37:02 +0300898 def save_global(self, obj, name=None):
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000899 write = self.write
900 memo = self.memo
901
Serhiy Storchaka58e41342015-03-31 14:07:24 +0300902 if name is None:
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +0100903 name = getattr(obj, '__qualname__', None)
Tim Petersc32d8242001-04-10 02:48:53 +0000904 if name is None:
Guido van Rossum3a41c612003-01-28 15:10:22 +0000905 name = obj.__name__
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000906
Serhiy Storchaka58e41342015-03-31 14:07:24 +0300907 module_name = whichmodule(obj, name)
Guido van Rossumb0a98e92001-08-17 18:49:52 +0000908 try:
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +0100909 __import__(module_name, level=0)
910 module = sys.modules[module_name]
Serhiy Storchaka58e41342015-03-31 14:07:24 +0300911 obj2, parent = _getattribute(module, name)
Guido van Rossumb0a98e92001-08-17 18:49:52 +0000912 except (ImportError, KeyError, AttributeError):
913 raise PicklingError(
914 "Can't pickle %r: it's not found as %s.%s" %
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +0100915 (obj, module_name, name))
Guido van Rossumb0a98e92001-08-17 18:49:52 +0000916 else:
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +0100917 if obj2 is not obj:
Guido van Rossumb0a98e92001-08-17 18:49:52 +0000918 raise PicklingError(
919 "Can't pickle %r: it's not the same object as %s.%s" %
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +0100920 (obj, module_name, name))
Guido van Rossumb0a98e92001-08-17 18:49:52 +0000921
Guido van Rossum255f3ee2003-01-29 06:14:11 +0000922 if self.proto >= 2:
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +0100923 code = _extension_registry.get((module_name, name))
Guido van Rossum255f3ee2003-01-29 06:14:11 +0000924 if code:
925 assert code > 0
926 if code <= 0xff:
Serhiy Storchakaa3e32c92013-04-14 13:37:02 +0300927 write(EXT1 + pack("<B", code))
Guido van Rossum255f3ee2003-01-29 06:14:11 +0000928 elif code <= 0xffff:
Serhiy Storchakaa3e32c92013-04-14 13:37:02 +0300929 write(EXT2 + pack("<H", code))
Guido van Rossum255f3ee2003-01-29 06:14:11 +0000930 else:
931 write(EXT4 + pack("<i", code))
932 return
Serhiy Storchaka58e41342015-03-31 14:07:24 +0300933 lastname = name.rpartition('.')[2]
934 if parent is module:
935 name = lastname
Alexandre Vassalottica2d6102008-06-12 18:26:05 +0000936 # Non-ASCII identifiers are supported only with protocols >= 3.
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +0100937 if self.proto >= 4:
938 self.save(module_name)
939 self.save(name)
940 write(STACK_GLOBAL)
Serhiy Storchaka58e41342015-03-31 14:07:24 +0300941 elif parent is not module:
942 self.save_reduce(getattr, (parent, lastname))
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +0100943 elif self.proto >= 3:
944 write(GLOBAL + bytes(module_name, "utf-8") + b'\n' +
Alexandre Vassalottica2d6102008-06-12 18:26:05 +0000945 bytes(name, "utf-8") + b'\n')
946 else:
Antoine Pitroud9dfaa92009-06-04 20:32:06 +0000947 if self.fix_imports:
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +0100948 r_name_mapping = _compat_pickle.REVERSE_NAME_MAPPING
949 r_import_mapping = _compat_pickle.REVERSE_IMPORT_MAPPING
950 if (module_name, name) in r_name_mapping:
951 module_name, name = r_name_mapping[(module_name, name)]
Serhiy Storchakabfe18242015-03-31 13:12:37 +0300952 elif module_name in r_import_mapping:
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +0100953 module_name = r_import_mapping[module_name]
Alexandre Vassalottica2d6102008-06-12 18:26:05 +0000954 try:
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +0100955 write(GLOBAL + bytes(module_name, "ascii") + b'\n' +
Alexandre Vassalottica2d6102008-06-12 18:26:05 +0000956 bytes(name, "ascii") + b'\n')
957 except UnicodeEncodeError:
958 raise PicklingError(
959 "can't pickle global identifier '%s.%s' using "
960 "pickle protocol %i" % (module, name, self.proto))
Guido van Rossum255f3ee2003-01-29 06:14:11 +0000961
Guido van Rossum3a41c612003-01-28 15:10:22 +0000962 self.memoize(obj)
Tim Peters3b769832003-01-28 03:51:36 +0000963
Alexandre Vassalotti19b6fa62013-11-30 16:06:39 -0800964 def save_type(self, obj):
965 if obj is type(None):
966 return self.save_reduce(type, (None,), obj=obj)
967 elif obj is type(NotImplemented):
968 return self.save_reduce(type, (NotImplemented,), obj=obj)
969 elif obj is type(...):
970 return self.save_reduce(type, (...,), obj=obj)
971 return self.save_global(obj)
972
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000973 dispatch[FunctionType] = save_global
Alexandre Vassalotti19b6fa62013-11-30 16:06:39 -0800974 dispatch[type] = save_type
Guido van Rossum0c891ce1995-03-14 15:09:05 +0000975
Guido van Rossuma48061a1995-01-10 00:31:14 +0000976
Guido van Rossum1be31752003-01-28 15:19:53 +0000977# Unpickling machinery
978
Alexandre Vassalottica2d6102008-06-12 18:26:05 +0000979class _Unpickler:
Guido van Rossuma48061a1995-01-10 00:31:14 +0000980
Antoine Pitroud9dfaa92009-06-04 20:32:06 +0000981 def __init__(self, file, *, fix_imports=True,
982 encoding="ASCII", errors="strict"):
Guido van Rossum2e6a4b32007-05-04 19:56:22 +0000983 """This takes a binary file for reading a pickle data stream.
Raymond Hettingeraef22fb2002-05-29 16:18:42 +0000984
Alexandre Vassalottid05c9ff2013-12-07 01:09:27 -0800985 The protocol version of the pickle is detected automatically, so
986 no proto argument is needed.
987
988 The argument *file* must have two methods, a read() method that
989 takes an integer argument, and a readline() method that requires
990 no arguments. Both methods should return bytes. Thus *file*
Martin Panter7462b6492015-11-02 03:37:02 +0000991 can be a binary file object opened for reading, an io.BytesIO
Alexandre Vassalottid05c9ff2013-12-07 01:09:27 -0800992 object, or any other custom object that meets this interface.
Raymond Hettingeraef22fb2002-05-29 16:18:42 +0000993
Guido van Rossumfeea0782007-10-10 18:00:50 +0000994 The file-like object must have two methods, a read() method
995 that takes an integer argument, and a readline() method that
996 requires no arguments. Both methods should return bytes.
997 Thus file-like object can be a binary file object opened for
998 reading, a BytesIO object, or any other custom object that
999 meets this interface.
Guido van Rossumf4169812008-03-17 22:56:06 +00001000
Alexandre Vassalottid05c9ff2013-12-07 01:09:27 -08001001 Optional keyword arguments are *fix_imports*, *encoding* and
Martin Panter46f50722016-05-26 05:35:26 +00001002 *errors*, which are used to control compatibility support for
Alexandre Vassalottid05c9ff2013-12-07 01:09:27 -08001003 pickle stream generated by Python 2. If *fix_imports* is True,
1004 pickle will try to map the old Python 2 names to the new names
1005 used in Python 3. The *encoding* and *errors* tell pickle how
1006 to decode 8-bit string instances pickled by Python 2; these
1007 default to 'ASCII' and 'strict', respectively. *encoding* can be
1008 'bytes' to read theses 8-bit string instances as bytes objects.
Raymond Hettingeraef22fb2002-05-29 16:18:42 +00001009 """
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01001010 self._file_readline = file.readline
1011 self._file_read = file.read
Guido van Rossumb72cf2d1997-04-09 17:32:51 +00001012 self.memo = {}
Guido van Rossumf4169812008-03-17 22:56:06 +00001013 self.encoding = encoding
1014 self.errors = errors
Antoine Pitroud9dfaa92009-06-04 20:32:06 +00001015 self.proto = 0
1016 self.fix_imports = fix_imports
Guido van Rossuma48061a1995-01-10 00:31:14 +00001017
Guido van Rossumb72cf2d1997-04-09 17:32:51 +00001018 def load(self):
Guido van Rossum3a41c612003-01-28 15:10:22 +00001019 """Read a pickled object representation from the open file.
Raymond Hettingeraef22fb2002-05-29 16:18:42 +00001020
Guido van Rossum3a41c612003-01-28 15:10:22 +00001021 Return the reconstituted object hierarchy specified in the file.
Raymond Hettingeraef22fb2002-05-29 16:18:42 +00001022 """
Alexandre Vassalotti3cfcab92008-12-27 09:30:39 +00001023 # Check whether Unpickler was initialized correctly. This is
1024 # only needed to mimic the behavior of _pickle.Unpickler.dump().
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01001025 if not hasattr(self, "_file_read"):
Alexandre Vassalotti3cfcab92008-12-27 09:30:39 +00001026 raise UnpicklingError("Unpickler.__init__() was not called by "
1027 "%s.__init__()" % (self.__class__.__name__,))
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01001028 self._unframer = _Unframer(self._file_read, self._file_readline)
1029 self.read = self._unframer.read
1030 self.readline = self._unframer.readline
Jeremy Hylton20747fa2001-11-09 16:15:04 +00001031 self.mark = object() # any new unique object
Guido van Rossumb72cf2d1997-04-09 17:32:51 +00001032 self.stack = []
1033 self.append = self.stack.append
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01001034 self.proto = 0
Guido van Rossumb72cf2d1997-04-09 17:32:51 +00001035 read = self.read
1036 dispatch = self.dispatch
1037 try:
Serhiy Storchakaa3e32c92013-04-14 13:37:02 +03001038 while True:
Guido van Rossumb72cf2d1997-04-09 17:32:51 +00001039 key = read(1)
Guido van Rossum2e6a4b32007-05-04 19:56:22 +00001040 if not key:
1041 raise EOFError
Guido van Rossum98297ee2007-11-06 21:34:58 +00001042 assert isinstance(key, bytes_types)
Guido van Rossum2e6a4b32007-05-04 19:56:22 +00001043 dispatch[key[0]](self)
Guido van Rossumb940e112007-01-10 16:19:56 +00001044 except _Stop as stopinst:
Guido van Rossumff871742000-12-13 18:11:56 +00001045 return stopinst.value
Guido van Rossumb72cf2d1997-04-09 17:32:51 +00001046
Tim Petersc23d18a2003-01-28 01:41:51 +00001047 # Return largest index k such that self.stack[k] is self.mark.
1048 # If the stack doesn't contain a mark, eventually raises IndexError.
1049 # This could be sped by maintaining another stack, of indices at which
1050 # the mark appears. For that matter, the latter stack would suffice,
1051 # and we wouldn't need to push mark objects on self.stack at all.
1052 # Doing so is probably a good thing, though, since if the pickle is
1053 # corrupt (or hostile) we may get a clue from finding self.mark embedded
1054 # in unpickled objects.
Guido van Rossumb72cf2d1997-04-09 17:32:51 +00001055 def marker(self):
1056 stack = self.stack
1057 mark = self.mark
1058 k = len(stack)-1
1059 while stack[k] is not mark: k = k-1
1060 return k
1061
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001062 def persistent_load(self, pid):
Benjamin Peterson49956b22009-01-10 17:05:44 +00001063 raise UnpicklingError("unsupported persistent id encountered")
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001064
Guido van Rossumb72cf2d1997-04-09 17:32:51 +00001065 dispatch = {}
1066
Guido van Rossumd6c9e632003-01-28 03:49:52 +00001067 def load_proto(self):
Serhiy Storchakaa3e32c92013-04-14 13:37:02 +03001068 proto = self.read(1)[0]
Guido van Rossumf4169812008-03-17 22:56:06 +00001069 if not 0 <= proto <= HIGHEST_PROTOCOL:
Guido van Rossum26d95c32007-08-27 23:18:54 +00001070 raise ValueError("unsupported pickle protocol: %d" % proto)
Antoine Pitroud9dfaa92009-06-04 20:32:06 +00001071 self.proto = proto
Guido van Rossum2e6a4b32007-05-04 19:56:22 +00001072 dispatch[PROTO[0]] = load_proto
Guido van Rossumd6c9e632003-01-28 03:49:52 +00001073
Alexandre Vassalottib6a2f2a2013-11-23 20:30:03 -08001074 def load_frame(self):
1075 frame_size, = unpack('<Q', self.read(8))
1076 if frame_size > sys.maxsize:
1077 raise ValueError("frame size > sys.maxsize: %d" % frame_size)
1078 self._unframer.load_frame(frame_size)
1079 dispatch[FRAME[0]] = load_frame
1080
Guido van Rossumb72cf2d1997-04-09 17:32:51 +00001081 def load_persid(self):
Serhiy Storchakadec25af2016-07-17 11:24:17 +03001082 try:
1083 pid = self.readline()[:-1].decode("ascii")
1084 except UnicodeDecodeError:
1085 raise UnpicklingError(
1086 "persistent IDs in protocol 0 must be ASCII strings")
Guido van Rossumb72cf2d1997-04-09 17:32:51 +00001087 self.append(self.persistent_load(pid))
Guido van Rossum2e6a4b32007-05-04 19:56:22 +00001088 dispatch[PERSID[0]] = load_persid
Guido van Rossumb72cf2d1997-04-09 17:32:51 +00001089
1090 def load_binpersid(self):
Raymond Hettinger46ac8eb2002-06-30 03:39:14 +00001091 pid = self.stack.pop()
Guido van Rossumb72cf2d1997-04-09 17:32:51 +00001092 self.append(self.persistent_load(pid))
Guido van Rossum2e6a4b32007-05-04 19:56:22 +00001093 dispatch[BINPERSID[0]] = load_binpersid
Guido van Rossumb72cf2d1997-04-09 17:32:51 +00001094
1095 def load_none(self):
1096 self.append(None)
Guido van Rossum2e6a4b32007-05-04 19:56:22 +00001097 dispatch[NONE[0]] = load_none
Guido van Rossumb72cf2d1997-04-09 17:32:51 +00001098
Guido van Rossum7d97d312003-01-28 04:25:27 +00001099 def load_false(self):
1100 self.append(False)
Guido van Rossum2e6a4b32007-05-04 19:56:22 +00001101 dispatch[NEWFALSE[0]] = load_false
Guido van Rossum7d97d312003-01-28 04:25:27 +00001102
1103 def load_true(self):
1104 self.append(True)
Guido van Rossum2e6a4b32007-05-04 19:56:22 +00001105 dispatch[NEWTRUE[0]] = load_true
Guido van Rossum7d97d312003-01-28 04:25:27 +00001106
Guido van Rossumb72cf2d1997-04-09 17:32:51 +00001107 def load_int(self):
Tim Peters19ef62d2001-08-28 22:21:18 +00001108 data = self.readline()
Guido van Rossume2763392002-04-05 19:30:08 +00001109 if data == FALSE[1:]:
1110 val = False
1111 elif data == TRUE[1:]:
1112 val = True
1113 else:
Serhiy Storchakaa3e32c92013-04-14 13:37:02 +03001114 val = int(data, 0)
Guido van Rossume2763392002-04-05 19:30:08 +00001115 self.append(val)
Guido van Rossum2e6a4b32007-05-04 19:56:22 +00001116 dispatch[INT[0]] = load_int
Guido van Rossumb72cf2d1997-04-09 17:32:51 +00001117
1118 def load_binint(self):
Serhiy Storchakaa3e32c92013-04-14 13:37:02 +03001119 self.append(unpack('<i', self.read(4))[0])
Guido van Rossum2e6a4b32007-05-04 19:56:22 +00001120 dispatch[BININT[0]] = load_binint
Guido van Rossumb72cf2d1997-04-09 17:32:51 +00001121
1122 def load_binint1(self):
Serhiy Storchakaa3e32c92013-04-14 13:37:02 +03001123 self.append(self.read(1)[0])
Guido van Rossum2e6a4b32007-05-04 19:56:22 +00001124 dispatch[BININT1[0]] = load_binint1
Guido van Rossumb72cf2d1997-04-09 17:32:51 +00001125
1126 def load_binint2(self):
Serhiy Storchakaa3e32c92013-04-14 13:37:02 +03001127 self.append(unpack('<H', self.read(2))[0])
Guido van Rossum2e6a4b32007-05-04 19:56:22 +00001128 dispatch[BININT2[0]] = load_binint2
Tim Peters2344fae2001-01-15 00:50:52 +00001129
Guido van Rossumb72cf2d1997-04-09 17:32:51 +00001130 def load_long(self):
Serhiy Storchakaa3e32c92013-04-14 13:37:02 +03001131 val = self.readline()[:-1]
1132 if val and val[-1] == b'L'[0]:
Mark Dickinson8dd05142009-01-20 20:43:58 +00001133 val = val[:-1]
Guido van Rossumfeea0782007-10-10 18:00:50 +00001134 self.append(int(val, 0))
Guido van Rossum2e6a4b32007-05-04 19:56:22 +00001135 dispatch[LONG[0]] = load_long
Guido van Rossumb72cf2d1997-04-09 17:32:51 +00001136
Guido van Rossumd6c9e632003-01-28 03:49:52 +00001137 def load_long1(self):
Serhiy Storchakaa3e32c92013-04-14 13:37:02 +03001138 n = self.read(1)[0]
Guido van Rossum2e6a4b32007-05-04 19:56:22 +00001139 data = self.read(n)
1140 self.append(decode_long(data))
1141 dispatch[LONG1[0]] = load_long1
Guido van Rossumd6c9e632003-01-28 03:49:52 +00001142
1143 def load_long4(self):
Serhiy Storchakaa3e32c92013-04-14 13:37:02 +03001144 n, = unpack('<i', self.read(4))
Antoine Pitroubf6ecf92012-11-24 20:40:21 +01001145 if n < 0:
1146 # Corrupt or hostile pickle -- we never write one like this
Alexandre Vassalotticc757172013-04-14 02:25:10 -07001147 raise UnpicklingError("LONG pickle has negative byte count")
Guido van Rossum2e6a4b32007-05-04 19:56:22 +00001148 data = self.read(n)
1149 self.append(decode_long(data))
1150 dispatch[LONG4[0]] = load_long4
Guido van Rossumd6c9e632003-01-28 03:49:52 +00001151
Guido van Rossumb72cf2d1997-04-09 17:32:51 +00001152 def load_float(self):
Guido van Rossumff871742000-12-13 18:11:56 +00001153 self.append(float(self.readline()[:-1]))
Guido van Rossum2e6a4b32007-05-04 19:56:22 +00001154 dispatch[FLOAT[0]] = load_float
Guido van Rossumb72cf2d1997-04-09 17:32:51 +00001155
Serhiy Storchakaa3e32c92013-04-14 13:37:02 +03001156 def load_binfloat(self):
Guido van Rossumd3703791998-10-22 20:15:36 +00001157 self.append(unpack('>d', self.read(8))[0])
Guido van Rossum2e6a4b32007-05-04 19:56:22 +00001158 dispatch[BINFLOAT[0]] = load_binfloat
Guido van Rossumd3703791998-10-22 20:15:36 +00001159
Alexandre Vassalottid05c9ff2013-12-07 01:09:27 -08001160 def _decode_string(self, value):
1161 # Used to allow strings from Python 2 to be decoded either as
1162 # bytes or Unicode strings. This should be used only with the
1163 # STRING, BINSTRING and SHORT_BINSTRING opcodes.
1164 if self.encoding == "bytes":
1165 return value
1166 else:
1167 return value.decode(self.encoding, self.errors)
1168
Guido van Rossumb72cf2d1997-04-09 17:32:51 +00001169 def load_string(self):
Alexandre Vassalotti7c5e0942013-04-15 23:14:55 -07001170 data = self.readline()[:-1]
Serhiy Storchakaa3e32c92013-04-14 13:37:02 +03001171 # Strip outermost quotes
Alexandre Vassalotti7c5e0942013-04-15 23:14:55 -07001172 if len(data) >= 2 and data[0] == data[-1] and data[0] in b'"\'':
1173 data = data[1:-1]
Martin v. Löwis8a8da792002-08-14 07:46:28 +00001174 else:
Alexandre Vassalotti7c5e0942013-04-15 23:14:55 -07001175 raise UnpicklingError("the STRING opcode argument must be quoted")
Alexandre Vassalottid05c9ff2013-12-07 01:09:27 -08001176 self.append(self._decode_string(codecs.escape_decode(data)[0]))
Guido van Rossum2e6a4b32007-05-04 19:56:22 +00001177 dispatch[STRING[0]] = load_string
Guido van Rossumb72cf2d1997-04-09 17:32:51 +00001178
1179 def load_binstring(self):
Antoine Pitroubf6ecf92012-11-24 20:40:21 +01001180 # Deprecated BINSTRING uses signed 32-bit length
Serhiy Storchakaa3e32c92013-04-14 13:37:02 +03001181 len, = unpack('<i', self.read(4))
Antoine Pitroubf6ecf92012-11-24 20:40:21 +01001182 if len < 0:
Alexandre Vassalotticc757172013-04-14 02:25:10 -07001183 raise UnpicklingError("BINSTRING pickle has negative byte count")
Guido van Rossumf4169812008-03-17 22:56:06 +00001184 data = self.read(len)
Alexandre Vassalottid05c9ff2013-12-07 01:09:27 -08001185 self.append(self._decode_string(data))
Guido van Rossum2e6a4b32007-05-04 19:56:22 +00001186 dispatch[BINSTRING[0]] = load_binstring
Guido van Rossumb72cf2d1997-04-09 17:32:51 +00001187
Serhiy Storchakaa3e32c92013-04-14 13:37:02 +03001188 def load_binbytes(self):
Antoine Pitroubf6ecf92012-11-24 20:40:21 +01001189 len, = unpack('<I', self.read(4))
1190 if len > maxsize:
Alexandre Vassalotticc757172013-04-14 02:25:10 -07001191 raise UnpicklingError("BINBYTES exceeds system's maximum size "
1192 "of %d bytes" % maxsize)
Guido van Rossumf4169812008-03-17 22:56:06 +00001193 self.append(self.read(len))
1194 dispatch[BINBYTES[0]] = load_binbytes
1195
Guido van Rossumb5f2f1b2000-03-10 23:20:09 +00001196 def load_unicode(self):
Guido van Rossum2e6a4b32007-05-04 19:56:22 +00001197 self.append(str(self.readline()[:-1], 'raw-unicode-escape'))
1198 dispatch[UNICODE[0]] = load_unicode
Guido van Rossumb5f2f1b2000-03-10 23:20:09 +00001199
Serhiy Storchakaa3e32c92013-04-14 13:37:02 +03001200 def load_binunicode(self):
Antoine Pitroubf6ecf92012-11-24 20:40:21 +01001201 len, = unpack('<I', self.read(4))
1202 if len > maxsize:
Alexandre Vassalotticc757172013-04-14 02:25:10 -07001203 raise UnpicklingError("BINUNICODE exceeds system's maximum size "
1204 "of %d bytes" % maxsize)
Victor Stinner485fb562010-04-13 11:07:24 +00001205 self.append(str(self.read(len), 'utf-8', 'surrogatepass'))
Guido van Rossum2e6a4b32007-05-04 19:56:22 +00001206 dispatch[BINUNICODE[0]] = load_binunicode
Guido van Rossumb5f2f1b2000-03-10 23:20:09 +00001207
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01001208 def load_binunicode8(self):
1209 len, = unpack('<Q', self.read(8))
1210 if len > maxsize:
1211 raise UnpicklingError("BINUNICODE8 exceeds system's maximum size "
1212 "of %d bytes" % maxsize)
1213 self.append(str(self.read(len), 'utf-8', 'surrogatepass'))
1214 dispatch[BINUNICODE8[0]] = load_binunicode8
1215
Serhiy Storchakae0606192015-09-29 22:10:07 +03001216 def load_binbytes8(self):
1217 len, = unpack('<Q', self.read(8))
1218 if len > maxsize:
1219 raise UnpicklingError("BINBYTES8 exceeds system's maximum size "
1220 "of %d bytes" % maxsize)
1221 self.append(self.read(len))
1222 dispatch[BINBYTES8[0]] = load_binbytes8
1223
Guido van Rossumb72cf2d1997-04-09 17:32:51 +00001224 def load_short_binstring(self):
Serhiy Storchakaa3e32c92013-04-14 13:37:02 +03001225 len = self.read(1)[0]
1226 data = self.read(len)
Alexandre Vassalottid05c9ff2013-12-07 01:09:27 -08001227 self.append(self._decode_string(data))
Guido van Rossum2e6a4b32007-05-04 19:56:22 +00001228 dispatch[SHORT_BINSTRING[0]] = load_short_binstring
Guido van Rossumb72cf2d1997-04-09 17:32:51 +00001229
Guido van Rossumf4169812008-03-17 22:56:06 +00001230 def load_short_binbytes(self):
Serhiy Storchakaa3e32c92013-04-14 13:37:02 +03001231 len = self.read(1)[0]
1232 self.append(self.read(len))
Guido van Rossumf4169812008-03-17 22:56:06 +00001233 dispatch[SHORT_BINBYTES[0]] = load_short_binbytes
1234
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01001235 def load_short_binunicode(self):
1236 len = self.read(1)[0]
1237 self.append(str(self.read(len), 'utf-8', 'surrogatepass'))
1238 dispatch[SHORT_BINUNICODE[0]] = load_short_binunicode
1239
Guido van Rossumb72cf2d1997-04-09 17:32:51 +00001240 def load_tuple(self):
1241 k = self.marker()
1242 self.stack[k:] = [tuple(self.stack[k+1:])]
Guido van Rossum2e6a4b32007-05-04 19:56:22 +00001243 dispatch[TUPLE[0]] = load_tuple
Guido van Rossumb72cf2d1997-04-09 17:32:51 +00001244
1245 def load_empty_tuple(self):
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001246 self.append(())
Guido van Rossum2e6a4b32007-05-04 19:56:22 +00001247 dispatch[EMPTY_TUPLE[0]] = load_empty_tuple
Guido van Rossumb72cf2d1997-04-09 17:32:51 +00001248
Guido van Rossum44f0ea52003-01-28 04:14:51 +00001249 def load_tuple1(self):
1250 self.stack[-1] = (self.stack[-1],)
Guido van Rossum2e6a4b32007-05-04 19:56:22 +00001251 dispatch[TUPLE1[0]] = load_tuple1
Guido van Rossum44f0ea52003-01-28 04:14:51 +00001252
1253 def load_tuple2(self):
1254 self.stack[-2:] = [(self.stack[-2], self.stack[-1])]
Guido van Rossum2e6a4b32007-05-04 19:56:22 +00001255 dispatch[TUPLE2[0]] = load_tuple2
Guido van Rossum44f0ea52003-01-28 04:14:51 +00001256
1257 def load_tuple3(self):
1258 self.stack[-3:] = [(self.stack[-3], self.stack[-2], self.stack[-1])]
Guido van Rossum2e6a4b32007-05-04 19:56:22 +00001259 dispatch[TUPLE3[0]] = load_tuple3
Guido van Rossum44f0ea52003-01-28 04:14:51 +00001260
Guido van Rossumb72cf2d1997-04-09 17:32:51 +00001261 def load_empty_list(self):
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001262 self.append([])
Guido van Rossum2e6a4b32007-05-04 19:56:22 +00001263 dispatch[EMPTY_LIST[0]] = load_empty_list
Guido van Rossumb72cf2d1997-04-09 17:32:51 +00001264
1265 def load_empty_dictionary(self):
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001266 self.append({})
Guido van Rossum2e6a4b32007-05-04 19:56:22 +00001267 dispatch[EMPTY_DICT[0]] = load_empty_dictionary
Guido van Rossumb72cf2d1997-04-09 17:32:51 +00001268
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01001269 def load_empty_set(self):
1270 self.append(set())
1271 dispatch[EMPTY_SET[0]] = load_empty_set
1272
1273 def load_frozenset(self):
1274 k = self.marker()
1275 self.stack[k:] = [frozenset(self.stack[k+1:])]
1276 dispatch[FROZENSET[0]] = load_frozenset
1277
Guido van Rossumb72cf2d1997-04-09 17:32:51 +00001278 def load_list(self):
1279 k = self.marker()
1280 self.stack[k:] = [self.stack[k+1:]]
Guido van Rossum2e6a4b32007-05-04 19:56:22 +00001281 dispatch[LIST[0]] = load_list
Guido van Rossumb72cf2d1997-04-09 17:32:51 +00001282
1283 def load_dict(self):
1284 k = self.marker()
Guido van Rossumb72cf2d1997-04-09 17:32:51 +00001285 items = self.stack[k+1:]
Serhiy Storchakaa3e32c92013-04-14 13:37:02 +03001286 d = {items[i]: items[i+1]
1287 for i in range(0, len(items), 2)}
Guido van Rossumb72cf2d1997-04-09 17:32:51 +00001288 self.stack[k:] = [d]
Guido van Rossum2e6a4b32007-05-04 19:56:22 +00001289 dispatch[DICT[0]] = load_dict
Guido van Rossumb72cf2d1997-04-09 17:32:51 +00001290
Tim Petersd01c1e92003-01-30 15:41:46 +00001291 # INST and OBJ differ only in how they get a class object. It's not
1292 # only sensible to do the rest in a common routine, the two routines
1293 # previously diverged and grew different bugs.
1294 # klass is the class to instantiate, and k points to the topmost mark
1295 # object, following which are the arguments for klass.__init__.
1296 def _instantiate(self, klass, k):
Guido van Rossumb72cf2d1997-04-09 17:32:51 +00001297 args = tuple(self.stack[k+1:])
1298 del self.stack[k:]
Alexander Belopolskyd92f0402010-07-17 22:50:45 +00001299 if (args or not isinstance(klass, type) or
1300 hasattr(klass, "__getinitargs__")):
Guido van Rossum743d17e1998-09-15 20:25:57 +00001301 try:
Guido van Rossumb26a97a2003-01-28 22:29:13 +00001302 value = klass(*args)
Guido van Rossumb940e112007-01-10 16:19:56 +00001303 except TypeError as err:
Guido van Rossum26d95c32007-08-27 23:18:54 +00001304 raise TypeError("in constructor for %s: %s" %
1305 (klass.__name__, str(err)), sys.exc_info()[2])
Alexander Belopolskyd92f0402010-07-17 22:50:45 +00001306 else:
1307 value = klass.__new__(klass)
Guido van Rossumb72cf2d1997-04-09 17:32:51 +00001308 self.append(value)
Tim Petersd01c1e92003-01-30 15:41:46 +00001309
1310 def load_inst(self):
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001311 module = self.readline()[:-1].decode("ascii")
1312 name = self.readline()[:-1].decode("ascii")
Tim Petersd01c1e92003-01-30 15:41:46 +00001313 klass = self.find_class(module, name)
1314 self._instantiate(klass, self.marker())
Guido van Rossum2e6a4b32007-05-04 19:56:22 +00001315 dispatch[INST[0]] = load_inst
Guido van Rossumb72cf2d1997-04-09 17:32:51 +00001316
1317 def load_obj(self):
Tim Petersd01c1e92003-01-30 15:41:46 +00001318 # Stack is ... markobject classobject arg1 arg2 ...
Guido van Rossumb72cf2d1997-04-09 17:32:51 +00001319 k = self.marker()
Tim Petersd01c1e92003-01-30 15:41:46 +00001320 klass = self.stack.pop(k+1)
1321 self._instantiate(klass, k)
Guido van Rossum2e6a4b32007-05-04 19:56:22 +00001322 dispatch[OBJ[0]] = load_obj
Guido van Rossumb72cf2d1997-04-09 17:32:51 +00001323
Guido van Rossum3a41c612003-01-28 15:10:22 +00001324 def load_newobj(self):
1325 args = self.stack.pop()
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01001326 cls = self.stack.pop()
Guido van Rossum3a41c612003-01-28 15:10:22 +00001327 obj = cls.__new__(cls, *args)
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01001328 self.append(obj)
Guido van Rossum2e6a4b32007-05-04 19:56:22 +00001329 dispatch[NEWOBJ[0]] = load_newobj
Guido van Rossum3a41c612003-01-28 15:10:22 +00001330
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01001331 def load_newobj_ex(self):
1332 kwargs = self.stack.pop()
1333 args = self.stack.pop()
1334 cls = self.stack.pop()
1335 obj = cls.__new__(cls, *args, **kwargs)
1336 self.append(obj)
1337 dispatch[NEWOBJ_EX[0]] = load_newobj_ex
1338
Guido van Rossumb72cf2d1997-04-09 17:32:51 +00001339 def load_global(self):
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001340 module = self.readline()[:-1].decode("utf-8")
1341 name = self.readline()[:-1].decode("utf-8")
Guido van Rossumb72cf2d1997-04-09 17:32:51 +00001342 klass = self.find_class(module, name)
1343 self.append(klass)
Guido van Rossum2e6a4b32007-05-04 19:56:22 +00001344 dispatch[GLOBAL[0]] = load_global
Guido van Rossumb72cf2d1997-04-09 17:32:51 +00001345
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01001346 def load_stack_global(self):
1347 name = self.stack.pop()
1348 module = self.stack.pop()
1349 if type(name) is not str or type(module) is not str:
1350 raise UnpicklingError("STACK_GLOBAL requires str")
1351 self.append(self.find_class(module, name))
1352 dispatch[STACK_GLOBAL[0]] = load_stack_global
1353
Guido van Rossum255f3ee2003-01-29 06:14:11 +00001354 def load_ext1(self):
Serhiy Storchakaa3e32c92013-04-14 13:37:02 +03001355 code = self.read(1)[0]
Guido van Rossum255f3ee2003-01-29 06:14:11 +00001356 self.get_extension(code)
Guido van Rossum2e6a4b32007-05-04 19:56:22 +00001357 dispatch[EXT1[0]] = load_ext1
Guido van Rossum255f3ee2003-01-29 06:14:11 +00001358
1359 def load_ext2(self):
Serhiy Storchakaa3e32c92013-04-14 13:37:02 +03001360 code, = unpack('<H', self.read(2))
Guido van Rossum255f3ee2003-01-29 06:14:11 +00001361 self.get_extension(code)
Guido van Rossum2e6a4b32007-05-04 19:56:22 +00001362 dispatch[EXT2[0]] = load_ext2
Guido van Rossum255f3ee2003-01-29 06:14:11 +00001363
1364 def load_ext4(self):
Serhiy Storchakaa3e32c92013-04-14 13:37:02 +03001365 code, = unpack('<i', self.read(4))
Guido van Rossum255f3ee2003-01-29 06:14:11 +00001366 self.get_extension(code)
Guido van Rossum2e6a4b32007-05-04 19:56:22 +00001367 dispatch[EXT4[0]] = load_ext4
Guido van Rossum255f3ee2003-01-29 06:14:11 +00001368
1369 def get_extension(self, code):
1370 nil = []
Guido van Rossumd4b920c2003-02-04 01:54:49 +00001371 obj = _extension_cache.get(code, nil)
Guido van Rossum255f3ee2003-01-29 06:14:11 +00001372 if obj is not nil:
1373 self.append(obj)
1374 return
Guido van Rossumd4b920c2003-02-04 01:54:49 +00001375 key = _inverted_registry.get(code)
Guido van Rossum255f3ee2003-01-29 06:14:11 +00001376 if not key:
Antoine Pitroubf6ecf92012-11-24 20:40:21 +01001377 if code <= 0: # note that 0 is forbidden
1378 # Corrupt or hostile pickle.
Alexandre Vassalotticc757172013-04-14 02:25:10 -07001379 raise UnpicklingError("EXT specifies code <= 0")
Guido van Rossum255f3ee2003-01-29 06:14:11 +00001380 raise ValueError("unregistered extension code %d" % code)
1381 obj = self.find_class(*key)
Guido van Rossumd4b920c2003-02-04 01:54:49 +00001382 _extension_cache[code] = obj
Guido van Rossum255f3ee2003-01-29 06:14:11 +00001383 self.append(obj)
1384
Guido van Rossumb72cf2d1997-04-09 17:32:51 +00001385 def find_class(self, module, name):
Antoine Pitroud9dfaa92009-06-04 20:32:06 +00001386 # Subclasses may override this.
1387 if self.proto < 3 and self.fix_imports:
1388 if (module, name) in _compat_pickle.NAME_MAPPING:
1389 module, name = _compat_pickle.NAME_MAPPING[(module, name)]
Serhiy Storchakabfe18242015-03-31 13:12:37 +03001390 elif module in _compat_pickle.IMPORT_MAPPING:
Antoine Pitroud9dfaa92009-06-04 20:32:06 +00001391 module = _compat_pickle.IMPORT_MAPPING[module]
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001392 __import__(module, level=0)
Serhiy Storchaka58e41342015-03-31 14:07:24 +03001393 if self.proto >= 4:
1394 return _getattribute(sys.modules[module], name)[0]
1395 else:
1396 return getattr(sys.modules[module], name)
Guido van Rossumb72cf2d1997-04-09 17:32:51 +00001397
1398 def load_reduce(self):
1399 stack = self.stack
Guido van Rossumb26a97a2003-01-28 22:29:13 +00001400 args = stack.pop()
1401 func = stack[-1]
Serhiy Storchakaa8d83f52015-12-01 00:39:25 +02001402 stack[-1] = func(*args)
Guido van Rossum2e6a4b32007-05-04 19:56:22 +00001403 dispatch[REDUCE[0]] = load_reduce
Guido van Rossuma48061a1995-01-10 00:31:14 +00001404
Guido van Rossumb72cf2d1997-04-09 17:32:51 +00001405 def load_pop(self):
1406 del self.stack[-1]
Guido van Rossum2e6a4b32007-05-04 19:56:22 +00001407 dispatch[POP[0]] = load_pop
Guido van Rossum7b5430f1995-03-04 22:25:21 +00001408
Guido van Rossumb72cf2d1997-04-09 17:32:51 +00001409 def load_pop_mark(self):
1410 k = self.marker()
Guido van Rossum45e2fbc1998-03-26 21:13:24 +00001411 del self.stack[k:]
Guido van Rossum2e6a4b32007-05-04 19:56:22 +00001412 dispatch[POP_MARK[0]] = load_pop_mark
Guido van Rossuma48061a1995-01-10 00:31:14 +00001413
Guido van Rossumb72cf2d1997-04-09 17:32:51 +00001414 def load_dup(self):
Guido van Rossumb1062fc1998-03-31 17:00:46 +00001415 self.append(self.stack[-1])
Guido van Rossum2e6a4b32007-05-04 19:56:22 +00001416 dispatch[DUP[0]] = load_dup
Guido van Rossuma48061a1995-01-10 00:31:14 +00001417
Guido van Rossumb72cf2d1997-04-09 17:32:51 +00001418 def load_get(self):
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001419 i = int(self.readline()[:-1])
1420 self.append(self.memo[i])
Guido van Rossum2e6a4b32007-05-04 19:56:22 +00001421 dispatch[GET[0]] = load_get
Guido van Rossum78536471996-04-12 13:36:27 +00001422
Guido van Rossumb72cf2d1997-04-09 17:32:51 +00001423 def load_binget(self):
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001424 i = self.read(1)[0]
1425 self.append(self.memo[i])
Guido van Rossum2e6a4b32007-05-04 19:56:22 +00001426 dispatch[BINGET[0]] = load_binget
Guido van Rossum78536471996-04-12 13:36:27 +00001427
Serhiy Storchakaa3e32c92013-04-14 13:37:02 +03001428 def load_long_binget(self):
Antoine Pitroubf6ecf92012-11-24 20:40:21 +01001429 i, = unpack('<I', self.read(4))
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001430 self.append(self.memo[i])
Guido van Rossum2e6a4b32007-05-04 19:56:22 +00001431 dispatch[LONG_BINGET[0]] = load_long_binget
Guido van Rossum78536471996-04-12 13:36:27 +00001432
Guido van Rossumb72cf2d1997-04-09 17:32:51 +00001433 def load_put(self):
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001434 i = int(self.readline()[:-1])
Antoine Pitrou55549ec2011-08-30 00:27:10 +02001435 if i < 0:
1436 raise ValueError("negative PUT argument")
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001437 self.memo[i] = self.stack[-1]
Guido van Rossum2e6a4b32007-05-04 19:56:22 +00001438 dispatch[PUT[0]] = load_put
Guido van Rossuma48061a1995-01-10 00:31:14 +00001439
Guido van Rossumb72cf2d1997-04-09 17:32:51 +00001440 def load_binput(self):
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001441 i = self.read(1)[0]
Antoine Pitrou55549ec2011-08-30 00:27:10 +02001442 if i < 0:
1443 raise ValueError("negative BINPUT argument")
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001444 self.memo[i] = self.stack[-1]
Guido van Rossum2e6a4b32007-05-04 19:56:22 +00001445 dispatch[BINPUT[0]] = load_binput
Guido van Rossuma48061a1995-01-10 00:31:14 +00001446
Serhiy Storchakaa3e32c92013-04-14 13:37:02 +03001447 def load_long_binput(self):
Antoine Pitroubf6ecf92012-11-24 20:40:21 +01001448 i, = unpack('<I', self.read(4))
1449 if i > maxsize:
Antoine Pitrou55549ec2011-08-30 00:27:10 +02001450 raise ValueError("negative LONG_BINPUT argument")
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001451 self.memo[i] = self.stack[-1]
Guido van Rossum2e6a4b32007-05-04 19:56:22 +00001452 dispatch[LONG_BINPUT[0]] = load_long_binput
Guido van Rossuma48061a1995-01-10 00:31:14 +00001453
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01001454 def load_memoize(self):
1455 memo = self.memo
1456 memo[len(memo)] = self.stack[-1]
1457 dispatch[MEMOIZE[0]] = load_memoize
1458
Guido van Rossumb72cf2d1997-04-09 17:32:51 +00001459 def load_append(self):
1460 stack = self.stack
Raymond Hettinger46ac8eb2002-06-30 03:39:14 +00001461 value = stack.pop()
Guido van Rossumb72cf2d1997-04-09 17:32:51 +00001462 list = stack[-1]
1463 list.append(value)
Guido van Rossum2e6a4b32007-05-04 19:56:22 +00001464 dispatch[APPEND[0]] = load_append
Guido van Rossuma48061a1995-01-10 00:31:14 +00001465
Guido van Rossumb72cf2d1997-04-09 17:32:51 +00001466 def load_appends(self):
1467 stack = self.stack
1468 mark = self.marker()
Alexandre Vassalotti1f7492c2013-04-20 13:19:46 -07001469 list_obj = stack[mark - 1]
1470 items = stack[mark + 1:]
1471 if isinstance(list_obj, list):
1472 list_obj.extend(items)
1473 else:
1474 append = list_obj.append
1475 for item in items:
1476 append(item)
Guido van Rossumb72cf2d1997-04-09 17:32:51 +00001477 del stack[mark:]
Guido van Rossum2e6a4b32007-05-04 19:56:22 +00001478 dispatch[APPENDS[0]] = load_appends
Tim Peters2344fae2001-01-15 00:50:52 +00001479
Guido van Rossumb72cf2d1997-04-09 17:32:51 +00001480 def load_setitem(self):
1481 stack = self.stack
Raymond Hettinger46ac8eb2002-06-30 03:39:14 +00001482 value = stack.pop()
1483 key = stack.pop()
Guido van Rossumb72cf2d1997-04-09 17:32:51 +00001484 dict = stack[-1]
1485 dict[key] = value
Guido van Rossum2e6a4b32007-05-04 19:56:22 +00001486 dispatch[SETITEM[0]] = load_setitem
Guido van Rossum0c891ce1995-03-14 15:09:05 +00001487
Guido van Rossumb72cf2d1997-04-09 17:32:51 +00001488 def load_setitems(self):
1489 stack = self.stack
1490 mark = self.marker()
1491 dict = stack[mark - 1]
Guido van Rossum45e2fbc1998-03-26 21:13:24 +00001492 for i in range(mark + 1, len(stack), 2):
Guido van Rossumb72cf2d1997-04-09 17:32:51 +00001493 dict[stack[i]] = stack[i + 1]
Guido van Rossuma48061a1995-01-10 00:31:14 +00001494
Guido van Rossumb72cf2d1997-04-09 17:32:51 +00001495 del stack[mark:]
Guido van Rossum2e6a4b32007-05-04 19:56:22 +00001496 dispatch[SETITEMS[0]] = load_setitems
Guido van Rossuma48061a1995-01-10 00:31:14 +00001497
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01001498 def load_additems(self):
1499 stack = self.stack
1500 mark = self.marker()
1501 set_obj = stack[mark - 1]
1502 items = stack[mark + 1:]
1503 if isinstance(set_obj, set):
1504 set_obj.update(items)
1505 else:
1506 add = set_obj.add
1507 for item in items:
1508 add(item)
1509 del stack[mark:]
1510 dispatch[ADDITEMS[0]] = load_additems
1511
Guido van Rossumb72cf2d1997-04-09 17:32:51 +00001512 def load_build(self):
1513 stack = self.stack
Guido van Rossumac5b5d22003-01-28 22:01:16 +00001514 state = stack.pop()
Guido van Rossumb72cf2d1997-04-09 17:32:51 +00001515 inst = stack[-1]
Guido van Rossumac5b5d22003-01-28 22:01:16 +00001516 setstate = getattr(inst, "__setstate__", None)
Serhiy Storchakaa3e32c92013-04-14 13:37:02 +03001517 if setstate is not None:
Guido van Rossumac5b5d22003-01-28 22:01:16 +00001518 setstate(state)
1519 return
1520 slotstate = None
1521 if isinstance(state, tuple) and len(state) == 2:
1522 state, slotstate = state
1523 if state:
Alexandre Vassalottiebfecfd2009-05-25 18:50:33 +00001524 inst_dict = inst.__dict__
Antoine Pitroua9f48a02009-05-02 21:41:14 +00001525 intern = sys.intern
Alexandre Vassalottiebfecfd2009-05-25 18:50:33 +00001526 for k, v in state.items():
1527 if type(k) is str:
1528 inst_dict[intern(k)] = v
1529 else:
1530 inst_dict[k] = v
Guido van Rossumac5b5d22003-01-28 22:01:16 +00001531 if slotstate:
1532 for k, v in slotstate.items():
1533 setattr(inst, k, v)
Guido van Rossum2e6a4b32007-05-04 19:56:22 +00001534 dispatch[BUILD[0]] = load_build
Guido van Rossuma48061a1995-01-10 00:31:14 +00001535
Guido van Rossumb72cf2d1997-04-09 17:32:51 +00001536 def load_mark(self):
1537 self.append(self.mark)
Guido van Rossum2e6a4b32007-05-04 19:56:22 +00001538 dispatch[MARK[0]] = load_mark
Guido van Rossuma48061a1995-01-10 00:31:14 +00001539
Guido van Rossumb72cf2d1997-04-09 17:32:51 +00001540 def load_stop(self):
Raymond Hettinger46ac8eb2002-06-30 03:39:14 +00001541 value = self.stack.pop()
Guido van Rossumff871742000-12-13 18:11:56 +00001542 raise _Stop(value)
Guido van Rossum2e6a4b32007-05-04 19:56:22 +00001543 dispatch[STOP[0]] = load_stop
Guido van Rossuma48061a1995-01-10 00:31:14 +00001544
Guido van Rossumd6c9e632003-01-28 03:49:52 +00001545
Guido van Rossum0c891ce1995-03-14 15:09:05 +00001546# Shorthands
1547
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01001548def _dump(obj, file, protocol=None, *, fix_imports=True):
1549 _Pickler(file, protocol, fix_imports=fix_imports).dump(obj)
Guido van Rossum0c891ce1995-03-14 15:09:05 +00001550
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01001551def _dumps(obj, protocol=None, *, fix_imports=True):
Guido van Rossumcfe5f202007-05-08 21:26:54 +00001552 f = io.BytesIO()
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01001553 _Pickler(f, protocol, fix_imports=fix_imports).dump(obj)
Guido van Rossumcfe5f202007-05-08 21:26:54 +00001554 res = f.getvalue()
Guido van Rossum98297ee2007-11-06 21:34:58 +00001555 assert isinstance(res, bytes_types)
Guido van Rossumcfe5f202007-05-08 21:26:54 +00001556 return res
Guido van Rossum0c891ce1995-03-14 15:09:05 +00001557
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01001558def _load(file, *, fix_imports=True, encoding="ASCII", errors="strict"):
1559 return _Unpickler(file, fix_imports=fix_imports,
Antoine Pitroud9dfaa92009-06-04 20:32:06 +00001560 encoding=encoding, errors=errors).load()
Guido van Rossum0c891ce1995-03-14 15:09:05 +00001561
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01001562def _loads(s, *, fix_imports=True, encoding="ASCII", errors="strict"):
Guido van Rossumcfe5f202007-05-08 21:26:54 +00001563 if isinstance(s, str):
1564 raise TypeError("Can't load pickle from unicode string")
1565 file = io.BytesIO(s)
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01001566 return _Unpickler(file, fix_imports=fix_imports,
1567 encoding=encoding, errors=errors).load()
Guido van Rossumd6c9e632003-01-28 03:49:52 +00001568
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00001569# Use the faster _pickle if possible
1570try:
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01001571 from _pickle import (
1572 PickleError,
1573 PicklingError,
1574 UnpicklingError,
1575 Pickler,
1576 Unpickler,
1577 dump,
1578 dumps,
1579 load,
1580 loads
1581 )
Brett Cannoncd171c82013-07-04 17:43:24 -04001582except ImportError:
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00001583 Pickler, Unpickler = _Pickler, _Unpickler
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01001584 dump, dumps, load, loads = _dump, _dumps, _load, _loads
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00001585
Guido van Rossumd6c9e632003-01-28 03:49:52 +00001586# Doctest
Guido van Rossumd6c9e632003-01-28 03:49:52 +00001587def _test():
1588 import doctest
1589 return doctest.testmod()
1590
1591if __name__ == "__main__":
Florent Xicluna54540ec2011-11-04 08:29:17 +01001592 import argparse
Alexander Belopolsky455f7bd2010-07-27 23:02:38 +00001593 parser = argparse.ArgumentParser(
1594 description='display contents of the pickle files')
1595 parser.add_argument(
1596 'pickle_file', type=argparse.FileType('br'),
1597 nargs='*', help='the pickle file')
1598 parser.add_argument(
1599 '-t', '--test', action='store_true',
1600 help='run self-test suite')
1601 parser.add_argument(
1602 '-v', action='store_true',
1603 help='run verbosely; only affects self-test run')
1604 args = parser.parse_args()
1605 if args.test:
1606 _test()
1607 else:
1608 if not args.pickle_file:
1609 parser.print_help()
1610 else:
1611 import pprint
1612 for f in args.pickle_file:
1613 obj = load(f)
1614 pprint.pprint(obj)