blob: d533e660af3b230ee9e4c12de492098d3e15a2d1 [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.
Łukasz Langac51d8c92018-04-03 23:06:53 -070060# Only bump this if the oldest still supported version of Python already
61# includes it.
62DEFAULT_PROTOCOL = 4
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
Serhiy Storchaka1211c9a2018-01-20 16:42:44 +0200186 _FRAME_SIZE_MIN = 4
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +0100187 _FRAME_SIZE_TARGET = 64 * 1024
188
189 def __init__(self, file_write):
190 self.file_write = file_write
191 self.current_frame = None
192
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +0100193 def start_framing(self):
194 self.current_frame = io.BytesIO()
195
196 def end_framing(self):
Alexandre Vassalottib6a2f2a2013-11-23 20:30:03 -0800197 if self.current_frame and self.current_frame.tell() > 0:
198 self.commit_frame(force=True)
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +0100199 self.current_frame = None
200
Alexandre Vassalottib6a2f2a2013-11-23 20:30:03 -0800201 def commit_frame(self, force=False):
202 if self.current_frame:
203 f = self.current_frame
204 if f.tell() >= self._FRAME_SIZE_TARGET or force:
Olivier Grisel3cd7c6e2018-01-06 16:18:54 +0100205 data = f.getbuffer()
206 write = self.file_write
Serhiy Storchaka1211c9a2018-01-20 16:42:44 +0200207 if len(data) >= self._FRAME_SIZE_MIN:
208 # Issue a single call to the write method of the underlying
209 # file object for the frame opcode with the size of the
210 # frame. The concatenation is expected to be less expensive
211 # than issuing an additional call to write.
212 write(FRAME + pack("<Q", len(data)))
Olivier Grisel3cd7c6e2018-01-06 16:18:54 +0100213
214 # Issue a separate call to write to append the frame
215 # contents without concatenation to the above to avoid a
216 # memory copy.
217 write(data)
218
219 # Start the new frame with a new io.BytesIO instance so that
220 # the file object can have delayed access to the previous frame
221 # contents via an unreleased memoryview of the previous
222 # io.BytesIO instance.
223 self.current_frame = io.BytesIO()
Alexandre Vassalottib6a2f2a2013-11-23 20:30:03 -0800224
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +0100225 def write(self, data):
Alexandre Vassalottib6a2f2a2013-11-23 20:30:03 -0800226 if self.current_frame:
227 return self.current_frame.write(data)
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +0100228 else:
Alexandre Vassalottib6a2f2a2013-11-23 20:30:03 -0800229 return self.file_write(data)
230
Olivier Grisel3cd7c6e2018-01-06 16:18:54 +0100231 def write_large_bytes(self, header, payload):
232 write = self.file_write
233 if self.current_frame:
234 # Terminate the current frame and flush it to the file.
235 self.commit_frame(force=True)
236
237 # Perform direct write of the header and payload of the large binary
238 # object. Be careful not to concatenate the header and the payload
239 # prior to calling 'write' as we do not want to allocate a large
240 # temporary bytes object.
241 # We intentionally do not insert a protocol 4 frame opcode to make
242 # it possible to optimize file.read calls in the loader.
243 write(header)
244 write(payload)
245
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +0100246
247class _Unframer:
248
249 def __init__(self, file_read, file_readline, file_tell=None):
250 self.file_read = file_read
251 self.file_readline = file_readline
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +0100252 self.current_frame = None
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +0100253
254 def read(self, n):
Alexandre Vassalottib6a2f2a2013-11-23 20:30:03 -0800255 if self.current_frame:
256 data = self.current_frame.read(n)
257 if not data and n != 0:
258 self.current_frame = None
259 return self.file_read(n)
260 if len(data) < n:
261 raise UnpicklingError(
262 "pickle exhausted before end of frame")
263 return data
264 else:
265 return self.file_read(n)
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +0100266
267 def readline(self):
Alexandre Vassalottib6a2f2a2013-11-23 20:30:03 -0800268 if self.current_frame:
269 data = self.current_frame.readline()
270 if not data:
271 self.current_frame = None
272 return self.file_readline()
Serhiy Storchaka21d75332015-01-26 10:37:01 +0200273 if data[-1] != b'\n'[0]:
Alexandre Vassalottib6a2f2a2013-11-23 20:30:03 -0800274 raise UnpicklingError(
275 "pickle exhausted before end of frame")
276 return data
277 else:
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +0100278 return self.file_readline()
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +0100279
Alexandre Vassalottib6a2f2a2013-11-23 20:30:03 -0800280 def load_frame(self, frame_size):
281 if self.current_frame and self.current_frame.read() != b'':
282 raise UnpicklingError(
283 "beginning of a new frame before end of current frame")
284 self.current_frame = io.BytesIO(self.file_read(frame_size))
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +0100285
286
287# Tools used for pickling.
288
Serhiy Storchaka58e41342015-03-31 14:07:24 +0300289def _getattribute(obj, name):
290 for subpath in name.split('.'):
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +0100291 if subpath == '<locals>':
292 raise AttributeError("Can't get local attribute {!r} on {!r}"
293 .format(name, obj))
294 try:
Serhiy Storchaka58e41342015-03-31 14:07:24 +0300295 parent = obj
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +0100296 obj = getattr(obj, subpath)
297 except AttributeError:
298 raise AttributeError("Can't get attribute {!r} on {!r}"
Serhiy Storchaka5affd232017-04-05 09:37:24 +0300299 .format(name, obj)) from None
Serhiy Storchaka58e41342015-03-31 14:07:24 +0300300 return obj, parent
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +0100301
Serhiy Storchaka58e41342015-03-31 14:07:24 +0300302def whichmodule(obj, name):
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +0100303 """Find the module an object belong to."""
304 module_name = getattr(obj, '__module__', None)
305 if module_name is not None:
306 return module_name
Antoine Pitroue1618492014-10-04 22:15:27 +0200307 # Protect the iteration by using a list copy of sys.modules against dynamic
308 # modules that trigger imports of other modules upon calls to getattr.
309 for module_name, module in list(sys.modules.items()):
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +0100310 if module_name == '__main__' or module is None:
311 continue
312 try:
Serhiy Storchaka58e41342015-03-31 14:07:24 +0300313 if _getattribute(module, name)[0] is obj:
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +0100314 return module_name
315 except AttributeError:
316 pass
317 return '__main__'
318
319def encode_long(x):
320 r"""Encode a long to a two's complement little-endian binary string.
321 Note that 0 is a special case, returning an empty string, to save a
322 byte in the LONG1 pickling context.
323
324 >>> encode_long(0)
325 b''
326 >>> encode_long(255)
327 b'\xff\x00'
328 >>> encode_long(32767)
329 b'\xff\x7f'
330 >>> encode_long(-256)
331 b'\x00\xff'
332 >>> encode_long(-32768)
333 b'\x00\x80'
334 >>> encode_long(-128)
335 b'\x80'
336 >>> encode_long(127)
337 b'\x7f'
338 >>>
339 """
340 if x == 0:
341 return b''
342 nbytes = (x.bit_length() >> 3) + 1
343 result = x.to_bytes(nbytes, byteorder='little', signed=True)
344 if x < 0 and nbytes > 1:
345 if result[-1] == 0xff and (result[-2] & 0x80) != 0:
346 result = result[:-1]
347 return result
348
349def decode_long(data):
350 r"""Decode a long from a two's complement little-endian binary string.
351
352 >>> decode_long(b'')
353 0
354 >>> decode_long(b"\xff\x00")
355 255
356 >>> decode_long(b"\xff\x7f")
357 32767
358 >>> decode_long(b"\x00\xff")
359 -256
360 >>> decode_long(b"\x00\x80")
361 -32768
362 >>> decode_long(b"\x80")
363 -128
364 >>> decode_long(b"\x7f")
365 127
366 """
367 return int.from_bytes(data, byteorder='little', signed=True)
368
Skip Montanaro23bafc62001-02-18 03:10:09 +0000369
Guido van Rossum1be31752003-01-28 15:19:53 +0000370# Pickling machinery
371
Alexandre Vassalottica2d6102008-06-12 18:26:05 +0000372class _Pickler:
Guido van Rossuma48061a1995-01-10 00:31:14 +0000373
Antoine Pitroud9dfaa92009-06-04 20:32:06 +0000374 def __init__(self, file, protocol=None, *, fix_imports=True):
Guido van Rossum2e6a4b32007-05-04 19:56:22 +0000375 """This takes a binary file for writing a pickle data stream.
376
Alexandre Vassalottid05c9ff2013-12-07 01:09:27 -0800377 The optional *protocol* argument tells the pickler to use the
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +0100378 given protocol; supported protocols are 0, 1, 2, 3 and 4. The
Łukasz Langac51d8c92018-04-03 23:06:53 -0700379 default protocol is 4. It was introduced in Python 3.4, it is
380 incompatible with previous versions.
Guido van Rossumf29d3d62003-01-27 22:47:53 +0000381
Guido van Rossum7eff63a2003-01-31 19:42:31 +0000382 Specifying a negative protocol version selects the highest
Tim Peters5bd2a792003-02-01 16:45:06 +0000383 protocol version supported. The higher the protocol used, the
384 more recent the version of Python needed to read the pickle
385 produced.
Raymond Hettingeraef22fb2002-05-29 16:18:42 +0000386
Alexandre Vassalottid05c9ff2013-12-07 01:09:27 -0800387 The *file* argument must have a write() method that accepts a
388 single bytes argument. It can thus be a file object opened for
Martin Panter7462b6492015-11-02 03:37:02 +0000389 binary writing, an io.BytesIO instance, or any other custom
Alexandre Vassalottid05c9ff2013-12-07 01:09:27 -0800390 object that meets this interface.
Antoine Pitroud9dfaa92009-06-04 20:32:06 +0000391
Alexandre Vassalottid05c9ff2013-12-07 01:09:27 -0800392 If *fix_imports* is True and *protocol* is less than 3, pickle
393 will try to map the new Python 3 names to the old module names
394 used in Python 2, so that the pickle data stream is readable
395 with Python 2.
Raymond Hettingeraef22fb2002-05-29 16:18:42 +0000396 """
Guido van Rossumcf117b02003-02-09 17:19:41 +0000397 if protocol is None:
Guido van Rossum2e6a4b32007-05-04 19:56:22 +0000398 protocol = DEFAULT_PROTOCOL
Guido van Rossumcf117b02003-02-09 17:19:41 +0000399 if protocol < 0:
Tim Peters8587b3c2003-02-13 15:44:41 +0000400 protocol = HIGHEST_PROTOCOL
401 elif not 0 <= protocol <= HIGHEST_PROTOCOL:
402 raise ValueError("pickle protocol must be <= %d" % HIGHEST_PROTOCOL)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +0000403 try:
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +0100404 self._file_write = file.write
Alexandre Vassalottica2d6102008-06-12 18:26:05 +0000405 except AttributeError:
406 raise TypeError("file must have a 'write' attribute")
Alexandre Vassalottib6a2f2a2013-11-23 20:30:03 -0800407 self.framer = _Framer(self._file_write)
408 self.write = self.framer.write
Olivier Grisel3cd7c6e2018-01-06 16:18:54 +0100409 self._write_large_bytes = self.framer.write_large_bytes
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000410 self.memo = {}
Guido van Rossumcf117b02003-02-09 17:19:41 +0000411 self.proto = int(protocol)
412 self.bin = protocol >= 1
Guido van Rossum5d9113d2003-01-29 17:58:45 +0000413 self.fast = 0
Antoine Pitroud9dfaa92009-06-04 20:32:06 +0000414 self.fix_imports = fix_imports and protocol < 3
Guido van Rossuma48061a1995-01-10 00:31:14 +0000415
Fred Drake7f781c92002-05-01 20:33:53 +0000416 def clear_memo(self):
Raymond Hettingeraef22fb2002-05-29 16:18:42 +0000417 """Clears the pickler's "memo".
418
419 The memo is the data structure that remembers which objects the
Alexandre Vassalottid05c9ff2013-12-07 01:09:27 -0800420 pickler has already seen, so that shared or recursive objects
421 are pickled by reference and not by value. This method is
422 useful when re-using picklers.
Raymond Hettingeraef22fb2002-05-29 16:18:42 +0000423 """
Fred Drake7f781c92002-05-01 20:33:53 +0000424 self.memo.clear()
425
Guido van Rossum3a41c612003-01-28 15:10:22 +0000426 def dump(self, obj):
Tim Peters5bd2a792003-02-01 16:45:06 +0000427 """Write a pickled representation of obj to the open file."""
Alexandre Vassalotti3cfcab92008-12-27 09:30:39 +0000428 # Check whether Pickler was initialized correctly. This is
429 # only needed to mimic the behavior of _pickle.Pickler.dump().
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +0100430 if not hasattr(self, "_file_write"):
Alexandre Vassalotti3cfcab92008-12-27 09:30:39 +0000431 raise PicklingError("Pickler.__init__() was not called by "
432 "%s.__init__()" % (self.__class__.__name__,))
Guido van Rossumd6c9e632003-01-28 03:49:52 +0000433 if self.proto >= 2:
Alexandre Vassalottib6a2f2a2013-11-23 20:30:03 -0800434 self.write(PROTO + pack("<B", self.proto))
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +0100435 if self.proto >= 4:
Alexandre Vassalottib6a2f2a2013-11-23 20:30:03 -0800436 self.framer.start_framing()
Guido van Rossum3a41c612003-01-28 15:10:22 +0000437 self.save(obj)
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000438 self.write(STOP)
Alexandre Vassalottib6a2f2a2013-11-23 20:30:03 -0800439 self.framer.end_framing()
Guido van Rossuma48061a1995-01-10 00:31:14 +0000440
Jeremy Hylton3422c992003-01-24 19:29:52 +0000441 def memoize(self, obj):
442 """Store an object in the memo."""
443
Tim Peterse46b73f2003-01-27 21:22:10 +0000444 # The Pickler memo is a dictionary mapping object ids to 2-tuples
445 # that contain the Unpickler memo key and the object being memoized.
446 # The memo key is written to the pickle and will become
Jeremy Hylton3422c992003-01-24 19:29:52 +0000447 # the key in the Unpickler's memo. The object is stored in the
Tim Peterse46b73f2003-01-27 21:22:10 +0000448 # Pickler memo so that transient objects are kept alive during
449 # pickling.
Jeremy Hylton3422c992003-01-24 19:29:52 +0000450
Tim Peterse46b73f2003-01-27 21:22:10 +0000451 # The use of the Unpickler memo length as the memo key is just a
452 # convention. The only requirement is that the memo values be unique.
453 # But there appears no advantage to any other scheme, and this
Tim Peterscbd0a322003-01-28 00:24:43 +0000454 # scheme allows the Unpickler memo to be implemented as a plain (but
Tim Peterse46b73f2003-01-27 21:22:10 +0000455 # growable) array, indexed by memo key.
Guido van Rossum5d9113d2003-01-29 17:58:45 +0000456 if self.fast:
457 return
Guido van Rossum9b40e802003-01-30 06:37:41 +0000458 assert id(obj) not in self.memo
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +0100459 idx = len(self.memo)
460 self.write(self.put(idx))
461 self.memo[id(obj)] = idx, obj
Jeremy Hylton3422c992003-01-24 19:29:52 +0000462
Tim Petersbb38e302003-01-27 21:25:41 +0000463 # Return a PUT (BINPUT, LONG_BINPUT) opcode string, with argument i.
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +0100464 def put(self, idx):
465 if self.proto >= 4:
466 return MEMOIZE
467 elif self.bin:
468 if idx < 256:
469 return BINPUT + pack("<B", idx)
Guido van Rossum5c938d02003-01-28 03:03:08 +0000470 else:
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +0100471 return LONG_BINPUT + pack("<I", idx)
472 else:
473 return PUT + repr(idx).encode("ascii") + b'\n'
Guido van Rossuma48061a1995-01-10 00:31:14 +0000474
Tim Petersbb38e302003-01-27 21:25:41 +0000475 # Return a GET (BINGET, LONG_BINGET) opcode string, with argument i.
Serhiy Storchakaa3e32c92013-04-14 13:37:02 +0300476 def get(self, i):
Tim Petersc32d8242001-04-10 02:48:53 +0000477 if self.bin:
Tim Petersc32d8242001-04-10 02:48:53 +0000478 if i < 256:
Serhiy Storchakaa3e32c92013-04-14 13:37:02 +0300479 return BINGET + pack("<B", i)
Guido van Rossum5c938d02003-01-28 03:03:08 +0000480 else:
Antoine Pitroubf6ecf92012-11-24 20:40:21 +0100481 return LONG_BINGET + pack("<I", i)
Guido van Rossuma48061a1995-01-10 00:31:14 +0000482
Guido van Rossum39478e82007-08-27 17:23:59 +0000483 return GET + repr(i).encode("ascii") + b'\n'
Tim Peters2344fae2001-01-15 00:50:52 +0000484
Alexandre Vassalottica2d6102008-06-12 18:26:05 +0000485 def save(self, obj, save_persistent_id=True):
Alexandre Vassalottib6a2f2a2013-11-23 20:30:03 -0800486 self.framer.commit_frame()
487
Guido van Rossumbc64e222003-01-28 16:34:19 +0000488 # Check for persistent id (defined by a subclass)
Guido van Rossum3a41c612003-01-28 15:10:22 +0000489 pid = self.persistent_id(obj)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +0000490 if pid is not None and save_persistent_id:
Jeremy Hylton5e0f4e72002-11-13 22:01:27 +0000491 self.save_pers(pid)
492 return
Guido van Rossuma48061a1995-01-10 00:31:14 +0000493
Guido van Rossumbc64e222003-01-28 16:34:19 +0000494 # Check the memo
495 x = self.memo.get(id(obj))
Serhiy Storchakaa3e32c92013-04-14 13:37:02 +0300496 if x is not None:
Guido van Rossumbc64e222003-01-28 16:34:19 +0000497 self.write(self.get(x[0]))
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000498 return
499
Guido van Rossumbc64e222003-01-28 16:34:19 +0000500 # Check the type dispatch table
Guido van Rossum3a41c612003-01-28 15:10:22 +0000501 t = type(obj)
Guido van Rossumbc64e222003-01-28 16:34:19 +0000502 f = self.dispatch.get(t)
Serhiy Storchakaa3e32c92013-04-14 13:37:02 +0300503 if f is not None:
Guido van Rossumbc64e222003-01-28 16:34:19 +0000504 f(self, obj) # Call unbound method with explicit self
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000505 return
506
Antoine Pitrou8d3c2902012-03-04 18:31:48 +0100507 # Check private dispatch table if any, or else copyreg.dispatch_table
508 reduce = getattr(self, 'dispatch_table', dispatch_table).get(t)
Serhiy Storchakaa3e32c92013-04-14 13:37:02 +0300509 if reduce is not None:
Guido van Rossumc53f0092003-02-18 22:05:12 +0000510 rv = reduce(obj)
511 else:
Antoine Pitrouffd41d92011-10-04 09:23:04 +0200512 # Check for a class with a custom metaclass; treat as regular class
Berker Peksag27085782018-07-09 23:14:54 +0300513 if issubclass(t, type):
Antoine Pitrouffd41d92011-10-04 09:23:04 +0200514 self.save_global(obj)
515 return
516
Guido van Rossumc53f0092003-02-18 22:05:12 +0000517 # Check for a __reduce_ex__ method, fall back to __reduce__
518 reduce = getattr(obj, "__reduce_ex__", None)
Serhiy Storchakaa3e32c92013-04-14 13:37:02 +0300519 if reduce is not None:
Guido van Rossumc53f0092003-02-18 22:05:12 +0000520 rv = reduce(self.proto)
521 else:
522 reduce = getattr(obj, "__reduce__", None)
Serhiy Storchakaa3e32c92013-04-14 13:37:02 +0300523 if reduce is not None:
Guido van Rossumc53f0092003-02-18 22:05:12 +0000524 rv = reduce()
525 else:
526 raise PicklingError("Can't pickle %r object: %r" %
527 (t.__name__, obj))
Tim Petersb32a8312003-01-28 00:48:09 +0000528
Guido van Rossumbc64e222003-01-28 16:34:19 +0000529 # Check for string returned by reduce(), meaning "save as global"
Guido van Rossum3172c5d2007-10-16 18:12:55 +0000530 if isinstance(rv, str):
Guido van Rossumbc64e222003-01-28 16:34:19 +0000531 self.save_global(obj, rv)
Tim Petersb32a8312003-01-28 00:48:09 +0000532 return
533
Guido van Rossumbc64e222003-01-28 16:34:19 +0000534 # Assert that reduce() returned a tuple
Guido van Rossum13257902007-06-07 23:15:56 +0000535 if not isinstance(rv, tuple):
Guido van Rossumbc64e222003-01-28 16:34:19 +0000536 raise PicklingError("%s must return string or tuple" % reduce)
Tim Petersb32a8312003-01-28 00:48:09 +0000537
Guido van Rossum25cb7df2003-01-31 18:53:21 +0000538 # Assert that it returned an appropriately sized tuple
Guido van Rossumbc64e222003-01-28 16:34:19 +0000539 l = len(rv)
Guido van Rossum25cb7df2003-01-31 18:53:21 +0000540 if not (2 <= l <= 5):
Guido van Rossumbc64e222003-01-28 16:34:19 +0000541 raise PicklingError("Tuple returned by %s must have "
Guido van Rossum25cb7df2003-01-31 18:53:21 +0000542 "two to five elements" % reduce)
Tim Petersb32a8312003-01-28 00:48:09 +0000543
Guido van Rossumbc64e222003-01-28 16:34:19 +0000544 # Save the reduce() output and finally memoize the object
Guido van Rossum25cb7df2003-01-31 18:53:21 +0000545 self.save_reduce(obj=obj, *rv)
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000546
Guido van Rossum3a41c612003-01-28 15:10:22 +0000547 def persistent_id(self, obj):
Guido van Rossumbc64e222003-01-28 16:34:19 +0000548 # This exists so a subclass can override it
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000549 return None
550
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000551 def save_pers(self, pid):
Guido van Rossumbc64e222003-01-28 16:34:19 +0000552 # Save a persistent id reference
Tim Petersbd1cdb92003-01-28 01:03:10 +0000553 if self.bin:
Alexandre Vassalottica2d6102008-06-12 18:26:05 +0000554 self.save(pid, save_persistent_id=False)
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000555 self.write(BINPERSID)
Tim Petersbd1cdb92003-01-28 01:03:10 +0000556 else:
Serhiy Storchakadec25af2016-07-17 11:24:17 +0300557 try:
558 self.write(PERSID + str(pid).encode("ascii") + b'\n')
559 except UnicodeEncodeError:
560 raise PicklingError(
561 "persistent IDs in protocol 0 must be ASCII strings")
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000562
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +0100563 def save_reduce(self, func, args, state=None, listitems=None,
564 dictitems=None, obj=None):
Jeremy Hyltone3a565e2003-06-29 16:59:59 +0000565 # This API is called by some subclasses
Guido van Rossumbc64e222003-01-28 16:34:19 +0000566
Guido van Rossum13257902007-06-07 23:15:56 +0000567 if not isinstance(args, tuple):
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +0100568 raise PicklingError("args from save_reduce() must be a tuple")
Florent Xicluna5d1155c2011-10-28 14:45:05 +0200569 if not callable(func):
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +0100570 raise PicklingError("func from save_reduce() must be callable")
Guido van Rossumbc64e222003-01-28 16:34:19 +0000571
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000572 save = self.save
Guido van Rossumbc64e222003-01-28 16:34:19 +0000573 write = self.write
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000574
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +0100575 func_name = getattr(func, "__name__", "")
Serhiy Storchaka0d554d72015-10-10 22:42:18 +0300576 if self.proto >= 2 and func_name == "__newobj_ex__":
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +0100577 cls, args, kwargs = args
578 if not hasattr(cls, "__new__"):
579 raise PicklingError("args[0] from {} args has no __new__"
580 .format(func_name))
581 if obj is not None and cls is not obj.__class__:
582 raise PicklingError("args[0] from {} args has the wrong class"
583 .format(func_name))
Serhiy Storchaka0d554d72015-10-10 22:42:18 +0300584 if self.proto >= 4:
585 save(cls)
586 save(args)
587 save(kwargs)
588 write(NEWOBJ_EX)
589 else:
590 func = partial(cls.__new__, cls, *args, **kwargs)
591 save(func)
592 save(())
593 write(REDUCE)
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +0100594 elif self.proto >= 2 and func_name == "__newobj__":
595 # A __reduce__ implementation can direct protocol 2 or newer to
Guido van Rossumd053b4b2003-01-31 16:51:45 +0000596 # use the more efficient NEWOBJ opcode, while still
597 # allowing protocol 0 and 1 to work normally. For this to
598 # work, the function returned by __reduce__ should be
599 # called __newobj__, and its first argument should be a
Florent Xiclunaaa6c1d22011-12-12 18:54:29 +0100600 # class. The implementation for __newobj__
Guido van Rossumd053b4b2003-01-31 16:51:45 +0000601 # should be as follows, although pickle has no way to
602 # verify this:
603 #
604 # def __newobj__(cls, *args):
605 # return cls.__new__(cls, *args)
606 #
607 # Protocols 0 and 1 will pickle a reference to __newobj__,
608 # while protocol 2 (and above) will pickle a reference to
609 # cls, the remaining args tuple, and the NEWOBJ code,
610 # which calls cls.__new__(cls, *args) at unpickling time
611 # (see load_newobj below). If __reduce__ returns a
612 # three-tuple, the state from the third tuple item will be
613 # pickled regardless of the protocol, calling __setstate__
614 # at unpickling time (see load_build below).
615 #
616 # Note that no standard __newobj__ implementation exists;
617 # you have to provide your own. This is to enforce
618 # compatibility with Python 2.2 (pickles written using
619 # protocol 0 or 1 in Python 2.3 should be unpicklable by
620 # Python 2.2).
621 cls = args[0]
622 if not hasattr(cls, "__new__"):
623 raise PicklingError(
624 "args[0] from __newobj__ args has no __new__")
Guido van Rossumf7f45172003-01-31 17:17:49 +0000625 if obj is not None and cls is not obj.__class__:
626 raise PicklingError(
627 "args[0] from __newobj__ args has the wrong class")
Guido van Rossumd053b4b2003-01-31 16:51:45 +0000628 args = args[1:]
629 save(cls)
630 save(args)
631 write(NEWOBJ)
632 else:
633 save(func)
634 save(args)
635 write(REDUCE)
Tim Peters2344fae2001-01-15 00:50:52 +0000636
Guido van Rossumf7f45172003-01-31 17:17:49 +0000637 if obj is not None:
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +0100638 # If the object is already in the memo, this means it is
639 # recursive. In this case, throw away everything we put on the
640 # stack, and fetch the object back from the memo.
641 if id(obj) in self.memo:
642 write(POP + self.get(self.memo[id(obj)][0]))
643 else:
644 self.memoize(obj)
Guido van Rossumf7f45172003-01-31 17:17:49 +0000645
Guido van Rossum25cb7df2003-01-31 18:53:21 +0000646 # More new special cases (that work with older protocols as
647 # well): when __reduce__ returns a tuple with 4 or 5 items,
648 # the 4th and 5th item should be iterators that provide list
649 # items and dict items (as (key, value) tuples), or None.
650
651 if listitems is not None:
652 self._batch_appends(listitems)
653
654 if dictitems is not None:
655 self._batch_setitems(dictitems)
656
Tim Petersc32d8242001-04-10 02:48:53 +0000657 if state is not None:
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000658 save(state)
659 write(BUILD)
660
Guido van Rossumbc64e222003-01-28 16:34:19 +0000661 # Methods below this point are dispatched through the dispatch table
662
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000663 dispatch = {}
664
Guido van Rossum3a41c612003-01-28 15:10:22 +0000665 def save_none(self, obj):
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000666 self.write(NONE)
Guido van Rossum13257902007-06-07 23:15:56 +0000667 dispatch[type(None)] = save_none
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000668
Guido van Rossum3a41c612003-01-28 15:10:22 +0000669 def save_bool(self, obj):
Guido van Rossum7d97d312003-01-28 04:25:27 +0000670 if self.proto >= 2:
Serhiy Storchakaa3e32c92013-04-14 13:37:02 +0300671 self.write(NEWTRUE if obj else NEWFALSE)
Guido van Rossum7d97d312003-01-28 04:25:27 +0000672 else:
Serhiy Storchakaa3e32c92013-04-14 13:37:02 +0300673 self.write(TRUE if obj else FALSE)
Guido van Rossum77f6a652002-04-03 22:41:51 +0000674 dispatch[bool] = save_bool
675
Serhiy Storchakaa3e32c92013-04-14 13:37:02 +0300676 def save_long(self, obj):
Guido van Rossumddefaf32007-01-14 03:31:43 +0000677 if self.bin:
678 # If the int is small enough to fit in a signed 4-byte 2's-comp
679 # format, we can store it more efficiently than the general
680 # case.
681 # First one- and two-byte unsigned ints:
682 if obj >= 0:
683 if obj <= 0xff:
Serhiy Storchakaa3e32c92013-04-14 13:37:02 +0300684 self.write(BININT1 + pack("<B", obj))
Guido van Rossumddefaf32007-01-14 03:31:43 +0000685 return
686 if obj <= 0xffff:
Serhiy Storchakaa3e32c92013-04-14 13:37:02 +0300687 self.write(BININT2 + pack("<H", obj))
Guido van Rossumddefaf32007-01-14 03:31:43 +0000688 return
689 # Next check for 4-byte signed ints:
Serhiy Storchakaa3e32c92013-04-14 13:37:02 +0300690 if -0x80000000 <= obj <= 0x7fffffff:
Guido van Rossumddefaf32007-01-14 03:31:43 +0000691 self.write(BININT + pack("<i", obj))
692 return
Guido van Rossumd6c9e632003-01-28 03:49:52 +0000693 if self.proto >= 2:
Guido van Rossum2e6a4b32007-05-04 19:56:22 +0000694 encoded = encode_long(obj)
695 n = len(encoded)
Guido van Rossumd6c9e632003-01-28 03:49:52 +0000696 if n < 256:
Serhiy Storchakaa3e32c92013-04-14 13:37:02 +0300697 self.write(LONG1 + pack("<B", n) + encoded)
Guido van Rossumd6c9e632003-01-28 03:49:52 +0000698 else:
Guido van Rossum2e6a4b32007-05-04 19:56:22 +0000699 self.write(LONG4 + pack("<i", n) + encoded)
Tim Petersee1a53c2003-02-02 02:57:53 +0000700 return
Serhiy Storchaka3daaafb2017-11-16 09:44:43 +0200701 if -0x80000000 <= obj <= 0x7fffffff:
702 self.write(INT + repr(obj).encode("ascii") + b'\n')
703 else:
704 self.write(LONG + repr(obj).encode("ascii") + b'L\n')
Guido van Rossum13257902007-06-07 23:15:56 +0000705 dispatch[int] = save_long
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000706
Serhiy Storchakaa3e32c92013-04-14 13:37:02 +0300707 def save_float(self, obj):
Guido van Rossumd3703791998-10-22 20:15:36 +0000708 if self.bin:
Guido van Rossum3a41c612003-01-28 15:10:22 +0000709 self.write(BINFLOAT + pack('>d', obj))
Guido van Rossumd3703791998-10-22 20:15:36 +0000710 else:
Guido van Rossum39478e82007-08-27 17:23:59 +0000711 self.write(FLOAT + repr(obj).encode("ascii") + b'\n')
Guido van Rossum13257902007-06-07 23:15:56 +0000712 dispatch[float] = save_float
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000713
Serhiy Storchakaa3e32c92013-04-14 13:37:02 +0300714 def save_bytes(self, obj):
Guido van Rossumf4169812008-03-17 22:56:06 +0000715 if self.proto < 3:
Serhiy Storchakaa3e32c92013-04-14 13:37:02 +0300716 if not obj: # bytes object is empty
Alexandre Vassalotti3bfc65a2011-12-13 13:08:09 -0500717 self.save_reduce(bytes, (), obj=obj)
718 else:
719 self.save_reduce(codecs.encode,
720 (str(obj, 'latin1'), 'latin1'), obj=obj)
Guido van Rossumf4169812008-03-17 22:56:06 +0000721 return
722 n = len(obj)
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +0100723 if n <= 0xff:
Serhiy Storchakaa3e32c92013-04-14 13:37:02 +0300724 self.write(SHORT_BINBYTES + pack("<B", n) + obj)
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +0100725 elif n > 0xffffffff and self.proto >= 4:
Olivier Grisel3cd7c6e2018-01-06 16:18:54 +0100726 self._write_large_bytes(BINBYTES8 + pack("<Q", n), obj)
727 elif n >= self.framer._FRAME_SIZE_TARGET:
728 self._write_large_bytes(BINBYTES + pack("<I", n), obj)
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000729 else:
Serhiy Storchakaa3e32c92013-04-14 13:37:02 +0300730 self.write(BINBYTES + pack("<I", n) + obj)
Guido van Rossum3a41c612003-01-28 15:10:22 +0000731 self.memoize(obj)
Guido van Rossumf4169812008-03-17 22:56:06 +0000732 dispatch[bytes] = save_bytes
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000733
Serhiy Storchakaa3e32c92013-04-14 13:37:02 +0300734 def save_str(self, obj):
Tim Petersc32d8242001-04-10 02:48:53 +0000735 if self.bin:
Victor Stinner485fb562010-04-13 11:07:24 +0000736 encoded = obj.encode('utf-8', 'surrogatepass')
Guido van Rossum2e6a4b32007-05-04 19:56:22 +0000737 n = len(encoded)
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +0100738 if n <= 0xff and self.proto >= 4:
739 self.write(SHORT_BINUNICODE + pack("<B", n) + encoded)
740 elif n > 0xffffffff and self.proto >= 4:
Olivier Grisel3cd7c6e2018-01-06 16:18:54 +0100741 self._write_large_bytes(BINUNICODE8 + pack("<Q", n), encoded)
742 elif n >= self.framer._FRAME_SIZE_TARGET:
743 self._write_large_bytes(BINUNICODE + pack("<I", n), encoded)
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +0100744 else:
745 self.write(BINUNICODE + pack("<I", n) + encoded)
Guido van Rossumb5f2f1b2000-03-10 23:20:09 +0000746 else:
Guido van Rossum3a41c612003-01-28 15:10:22 +0000747 obj = obj.replace("\\", "\\u005c")
748 obj = obj.replace("\n", "\\u000a")
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +0100749 self.write(UNICODE + obj.encode('raw-unicode-escape') +
750 b'\n')
Guido van Rossum3a41c612003-01-28 15:10:22 +0000751 self.memoize(obj)
Guido van Rossumf4169812008-03-17 22:56:06 +0000752 dispatch[str] = save_str
Tim Peters658cba62001-02-09 20:06:00 +0000753
Guido van Rossum3a41c612003-01-28 15:10:22 +0000754 def save_tuple(self, obj):
Serhiy Storchakaa3e32c92013-04-14 13:37:02 +0300755 if not obj: # tuple is empty
756 if self.bin:
757 self.write(EMPTY_TUPLE)
Tim Peters1d63c9f2003-02-02 20:29:39 +0000758 else:
Serhiy Storchakaa3e32c92013-04-14 13:37:02 +0300759 self.write(MARK + TUPLE)
Tim Petersd97da802003-01-28 05:48:29 +0000760 return
761
Serhiy Storchakaa3e32c92013-04-14 13:37:02 +0300762 n = len(obj)
Tim Petersd97da802003-01-28 05:48:29 +0000763 save = self.save
764 memo = self.memo
Serhiy Storchakaa3e32c92013-04-14 13:37:02 +0300765 if n <= 3 and self.proto >= 2:
Guido van Rossum3a41c612003-01-28 15:10:22 +0000766 for element in obj:
Tim Petersd97da802003-01-28 05:48:29 +0000767 save(element)
768 # Subtle. Same as in the big comment below.
Guido van Rossum3a41c612003-01-28 15:10:22 +0000769 if id(obj) in memo:
770 get = self.get(memo[id(obj)][0])
Serhiy Storchakaa3e32c92013-04-14 13:37:02 +0300771 self.write(POP * n + get)
Tim Petersd97da802003-01-28 05:48:29 +0000772 else:
Serhiy Storchakaa3e32c92013-04-14 13:37:02 +0300773 self.write(_tuplesize2code[n])
Guido van Rossum3a41c612003-01-28 15:10:22 +0000774 self.memoize(obj)
Tim Petersd97da802003-01-28 05:48:29 +0000775 return
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000776
Tim Peters1d63c9f2003-02-02 20:29:39 +0000777 # proto 0 or proto 1 and tuple isn't empty, or proto > 1 and tuple
Tim Petersff57bff2003-01-28 05:34:53 +0000778 # has more than 3 elements.
Serhiy Storchakaa3e32c92013-04-14 13:37:02 +0300779 write = self.write
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000780 write(MARK)
Guido van Rossum3a41c612003-01-28 15:10:22 +0000781 for element in obj:
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000782 save(element)
783
Tim Peters1d63c9f2003-02-02 20:29:39 +0000784 if id(obj) in memo:
Tim Petersf558da02003-01-28 02:09:55 +0000785 # Subtle. d was not in memo when we entered save_tuple(), so
786 # the process of saving the tuple's elements must have saved
787 # the tuple itself: the tuple is recursive. The proper action
788 # now is to throw away everything we put on the stack, and
789 # simply GET the tuple (it's already constructed). This check
790 # could have been done in the "for element" loop instead, but
791 # recursive tuples are a rare thing.
Guido van Rossum3a41c612003-01-28 15:10:22 +0000792 get = self.get(memo[id(obj)][0])
Serhiy Storchakaa3e32c92013-04-14 13:37:02 +0300793 if self.bin:
Tim Petersf558da02003-01-28 02:09:55 +0000794 write(POP_MARK + get)
795 else: # proto 0 -- POP_MARK not available
Tim Petersd97da802003-01-28 05:48:29 +0000796 write(POP * (n+1) + get)
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000797 return
798
Tim Peters1d63c9f2003-02-02 20:29:39 +0000799 # No recursion.
Serhiy Storchakaa3e32c92013-04-14 13:37:02 +0300800 write(TUPLE)
Tim Peters1d63c9f2003-02-02 20:29:39 +0000801 self.memoize(obj)
Jeremy Hylton3422c992003-01-24 19:29:52 +0000802
Guido van Rossum13257902007-06-07 23:15:56 +0000803 dispatch[tuple] = save_tuple
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000804
Guido van Rossum3a41c612003-01-28 15:10:22 +0000805 def save_list(self, obj):
Tim Petersc32d8242001-04-10 02:48:53 +0000806 if self.bin:
Serhiy Storchakaa3e32c92013-04-14 13:37:02 +0300807 self.write(EMPTY_LIST)
Guido van Rossum25cb7df2003-01-31 18:53:21 +0000808 else: # proto 0 -- can't use EMPTY_LIST
Serhiy Storchakaa3e32c92013-04-14 13:37:02 +0300809 self.write(MARK + LIST)
Guido van Rossum25cb7df2003-01-31 18:53:21 +0000810
811 self.memoize(obj)
Alexandre Vassalottic7db1d62008-05-14 21:57:18 +0000812 self._batch_appends(obj)
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000813
Guido van Rossum13257902007-06-07 23:15:56 +0000814 dispatch[list] = save_list
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000815
Guido van Rossum25cb7df2003-01-31 18:53:21 +0000816 _BATCHSIZE = 1000
817
818 def _batch_appends(self, items):
819 # Helper to batch up APPENDS sequences
820 save = self.save
821 write = self.write
822
823 if not self.bin:
824 for x in items:
825 save(x)
826 write(APPEND)
827 return
828
Serhiy Storchakaa3e32c92013-04-14 13:37:02 +0300829 it = iter(items)
830 while True:
831 tmp = list(islice(it, self._BATCHSIZE))
Guido van Rossum25cb7df2003-01-31 18:53:21 +0000832 n = len(tmp)
833 if n > 1:
834 write(MARK)
835 for x in tmp:
836 save(x)
837 write(APPENDS)
838 elif n:
839 save(tmp[0])
840 write(APPEND)
841 # else tmp is empty, and we're done
Serhiy Storchakaa3e32c92013-04-14 13:37:02 +0300842 if n < self._BATCHSIZE:
843 return
Guido van Rossum25cb7df2003-01-31 18:53:21 +0000844
Guido van Rossum3a41c612003-01-28 15:10:22 +0000845 def save_dict(self, obj):
Tim Petersc32d8242001-04-10 02:48:53 +0000846 if self.bin:
Serhiy Storchakaa3e32c92013-04-14 13:37:02 +0300847 self.write(EMPTY_DICT)
Guido van Rossum25cb7df2003-01-31 18:53:21 +0000848 else: # proto 0 -- can't use EMPTY_DICT
Serhiy Storchakaa3e32c92013-04-14 13:37:02 +0300849 self.write(MARK + DICT)
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000850
Guido van Rossum25cb7df2003-01-31 18:53:21 +0000851 self.memoize(obj)
Alexandre Vassalottic7db1d62008-05-14 21:57:18 +0000852 self._batch_setitems(obj.items())
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000853
Guido van Rossum13257902007-06-07 23:15:56 +0000854 dispatch[dict] = save_dict
855 if PyStringMap is not None:
Jeremy Hylton2b9d0291998-05-27 22:38:22 +0000856 dispatch[PyStringMap] = save_dict
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000857
Guido van Rossum25cb7df2003-01-31 18:53:21 +0000858 def _batch_setitems(self, items):
859 # Helper to batch up SETITEMS sequences; proto >= 1 only
860 save = self.save
861 write = self.write
862
863 if not self.bin:
864 for k, v in items:
865 save(k)
866 save(v)
867 write(SETITEM)
868 return
869
Serhiy Storchakaa3e32c92013-04-14 13:37:02 +0300870 it = iter(items)
871 while True:
872 tmp = list(islice(it, self._BATCHSIZE))
Guido van Rossum25cb7df2003-01-31 18:53:21 +0000873 n = len(tmp)
874 if n > 1:
875 write(MARK)
876 for k, v in tmp:
877 save(k)
878 save(v)
879 write(SETITEMS)
880 elif n:
881 k, v = tmp[0]
882 save(k)
883 save(v)
884 write(SETITEM)
885 # else tmp is empty, and we're done
Serhiy Storchakaa3e32c92013-04-14 13:37:02 +0300886 if n < self._BATCHSIZE:
887 return
Guido van Rossum25cb7df2003-01-31 18:53:21 +0000888
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +0100889 def save_set(self, obj):
890 save = self.save
891 write = self.write
892
893 if self.proto < 4:
894 self.save_reduce(set, (list(obj),), obj=obj)
895 return
896
897 write(EMPTY_SET)
898 self.memoize(obj)
899
900 it = iter(obj)
901 while True:
902 batch = list(islice(it, self._BATCHSIZE))
903 n = len(batch)
904 if n > 0:
905 write(MARK)
906 for item in batch:
907 save(item)
908 write(ADDITEMS)
909 if n < self._BATCHSIZE:
910 return
911 dispatch[set] = save_set
912
913 def save_frozenset(self, obj):
914 save = self.save
915 write = self.write
916
917 if self.proto < 4:
918 self.save_reduce(frozenset, (list(obj),), obj=obj)
919 return
920
921 write(MARK)
922 for item in obj:
923 save(item)
924
925 if id(obj) in self.memo:
926 # If the object is already in the memo, this means it is
927 # recursive. In this case, throw away everything we put on the
928 # stack, and fetch the object back from the memo.
929 write(POP_MARK + self.get(self.memo[id(obj)][0]))
930 return
931
932 write(FROZENSET)
933 self.memoize(obj)
934 dispatch[frozenset] = save_frozenset
935
Serhiy Storchakaa3e32c92013-04-14 13:37:02 +0300936 def save_global(self, obj, name=None):
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000937 write = self.write
938 memo = self.memo
939
Serhiy Storchaka58e41342015-03-31 14:07:24 +0300940 if name is None:
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +0100941 name = getattr(obj, '__qualname__', None)
Tim Petersc32d8242001-04-10 02:48:53 +0000942 if name is None:
Guido van Rossum3a41c612003-01-28 15:10:22 +0000943 name = obj.__name__
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000944
Serhiy Storchaka58e41342015-03-31 14:07:24 +0300945 module_name = whichmodule(obj, name)
Guido van Rossumb0a98e92001-08-17 18:49:52 +0000946 try:
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +0100947 __import__(module_name, level=0)
948 module = sys.modules[module_name]
Serhiy Storchaka58e41342015-03-31 14:07:24 +0300949 obj2, parent = _getattribute(module, name)
Guido van Rossumb0a98e92001-08-17 18:49:52 +0000950 except (ImportError, KeyError, AttributeError):
951 raise PicklingError(
952 "Can't pickle %r: it's not found as %s.%s" %
Serhiy Storchaka5affd232017-04-05 09:37:24 +0300953 (obj, module_name, name)) from None
Guido van Rossumb0a98e92001-08-17 18:49:52 +0000954 else:
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +0100955 if obj2 is not obj:
Guido van Rossumb0a98e92001-08-17 18:49:52 +0000956 raise PicklingError(
957 "Can't pickle %r: it's not the same object as %s.%s" %
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +0100958 (obj, module_name, name))
Guido van Rossumb0a98e92001-08-17 18:49:52 +0000959
Guido van Rossum255f3ee2003-01-29 06:14:11 +0000960 if self.proto >= 2:
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +0100961 code = _extension_registry.get((module_name, name))
Guido van Rossum255f3ee2003-01-29 06:14:11 +0000962 if code:
963 assert code > 0
964 if code <= 0xff:
Serhiy Storchakaa3e32c92013-04-14 13:37:02 +0300965 write(EXT1 + pack("<B", code))
Guido van Rossum255f3ee2003-01-29 06:14:11 +0000966 elif code <= 0xffff:
Serhiy Storchakaa3e32c92013-04-14 13:37:02 +0300967 write(EXT2 + pack("<H", code))
Guido van Rossum255f3ee2003-01-29 06:14:11 +0000968 else:
969 write(EXT4 + pack("<i", code))
970 return
Serhiy Storchaka58e41342015-03-31 14:07:24 +0300971 lastname = name.rpartition('.')[2]
972 if parent is module:
973 name = lastname
Alexandre Vassalottica2d6102008-06-12 18:26:05 +0000974 # Non-ASCII identifiers are supported only with protocols >= 3.
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +0100975 if self.proto >= 4:
976 self.save(module_name)
977 self.save(name)
978 write(STACK_GLOBAL)
Serhiy Storchaka58e41342015-03-31 14:07:24 +0300979 elif parent is not module:
980 self.save_reduce(getattr, (parent, lastname))
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +0100981 elif self.proto >= 3:
982 write(GLOBAL + bytes(module_name, "utf-8") + b'\n' +
Alexandre Vassalottica2d6102008-06-12 18:26:05 +0000983 bytes(name, "utf-8") + b'\n')
984 else:
Antoine Pitroud9dfaa92009-06-04 20:32:06 +0000985 if self.fix_imports:
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +0100986 r_name_mapping = _compat_pickle.REVERSE_NAME_MAPPING
987 r_import_mapping = _compat_pickle.REVERSE_IMPORT_MAPPING
988 if (module_name, name) in r_name_mapping:
989 module_name, name = r_name_mapping[(module_name, name)]
Serhiy Storchakabfe18242015-03-31 13:12:37 +0300990 elif module_name in r_import_mapping:
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +0100991 module_name = r_import_mapping[module_name]
Alexandre Vassalottica2d6102008-06-12 18:26:05 +0000992 try:
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +0100993 write(GLOBAL + bytes(module_name, "ascii") + b'\n' +
Alexandre Vassalottica2d6102008-06-12 18:26:05 +0000994 bytes(name, "ascii") + b'\n')
995 except UnicodeEncodeError:
996 raise PicklingError(
997 "can't pickle global identifier '%s.%s' using "
Serhiy Storchaka5affd232017-04-05 09:37:24 +0300998 "pickle protocol %i" % (module, name, self.proto)) from None
Guido van Rossum255f3ee2003-01-29 06:14:11 +0000999
Guido van Rossum3a41c612003-01-28 15:10:22 +00001000 self.memoize(obj)
Tim Peters3b769832003-01-28 03:51:36 +00001001
Alexandre Vassalotti19b6fa62013-11-30 16:06:39 -08001002 def save_type(self, obj):
1003 if obj is type(None):
1004 return self.save_reduce(type, (None,), obj=obj)
1005 elif obj is type(NotImplemented):
1006 return self.save_reduce(type, (NotImplemented,), obj=obj)
1007 elif obj is type(...):
1008 return self.save_reduce(type, (...,), obj=obj)
1009 return self.save_global(obj)
1010
Guido van Rossumb72cf2d1997-04-09 17:32:51 +00001011 dispatch[FunctionType] = save_global
Alexandre Vassalotti19b6fa62013-11-30 16:06:39 -08001012 dispatch[type] = save_type
Guido van Rossum0c891ce1995-03-14 15:09:05 +00001013
Guido van Rossuma48061a1995-01-10 00:31:14 +00001014
Guido van Rossum1be31752003-01-28 15:19:53 +00001015# Unpickling machinery
1016
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001017class _Unpickler:
Guido van Rossuma48061a1995-01-10 00:31:14 +00001018
Antoine Pitroud9dfaa92009-06-04 20:32:06 +00001019 def __init__(self, file, *, fix_imports=True,
1020 encoding="ASCII", errors="strict"):
Guido van Rossum2e6a4b32007-05-04 19:56:22 +00001021 """This takes a binary file for reading a pickle data stream.
Raymond Hettingeraef22fb2002-05-29 16:18:42 +00001022
Alexandre Vassalottid05c9ff2013-12-07 01:09:27 -08001023 The protocol version of the pickle is detected automatically, so
1024 no proto argument is needed.
1025
1026 The argument *file* must have two methods, a read() method that
1027 takes an integer argument, and a readline() method that requires
1028 no arguments. Both methods should return bytes. Thus *file*
Martin Panter7462b6492015-11-02 03:37:02 +00001029 can be a binary file object opened for reading, an io.BytesIO
Alexandre Vassalottid05c9ff2013-12-07 01:09:27 -08001030 object, or any other custom object that meets this interface.
Raymond Hettingeraef22fb2002-05-29 16:18:42 +00001031
Guido van Rossumfeea0782007-10-10 18:00:50 +00001032 The file-like object must have two methods, a read() method
1033 that takes an integer argument, and a readline() method that
1034 requires no arguments. Both methods should return bytes.
1035 Thus file-like object can be a binary file object opened for
1036 reading, a BytesIO object, or any other custom object that
1037 meets this interface.
Guido van Rossumf4169812008-03-17 22:56:06 +00001038
Alexandre Vassalottid05c9ff2013-12-07 01:09:27 -08001039 Optional keyword arguments are *fix_imports*, *encoding* and
Martin Panter46f50722016-05-26 05:35:26 +00001040 *errors*, which are used to control compatibility support for
Alexandre Vassalottid05c9ff2013-12-07 01:09:27 -08001041 pickle stream generated by Python 2. If *fix_imports* is True,
1042 pickle will try to map the old Python 2 names to the new names
1043 used in Python 3. The *encoding* and *errors* tell pickle how
1044 to decode 8-bit string instances pickled by Python 2; these
1045 default to 'ASCII' and 'strict', respectively. *encoding* can be
1046 'bytes' to read theses 8-bit string instances as bytes objects.
Raymond Hettingeraef22fb2002-05-29 16:18:42 +00001047 """
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01001048 self._file_readline = file.readline
1049 self._file_read = file.read
Guido van Rossumb72cf2d1997-04-09 17:32:51 +00001050 self.memo = {}
Guido van Rossumf4169812008-03-17 22:56:06 +00001051 self.encoding = encoding
1052 self.errors = errors
Antoine Pitroud9dfaa92009-06-04 20:32:06 +00001053 self.proto = 0
1054 self.fix_imports = fix_imports
Guido van Rossuma48061a1995-01-10 00:31:14 +00001055
Guido van Rossumb72cf2d1997-04-09 17:32:51 +00001056 def load(self):
Guido van Rossum3a41c612003-01-28 15:10:22 +00001057 """Read a pickled object representation from the open file.
Raymond Hettingeraef22fb2002-05-29 16:18:42 +00001058
Guido van Rossum3a41c612003-01-28 15:10:22 +00001059 Return the reconstituted object hierarchy specified in the file.
Raymond Hettingeraef22fb2002-05-29 16:18:42 +00001060 """
Alexandre Vassalotti3cfcab92008-12-27 09:30:39 +00001061 # Check whether Unpickler was initialized correctly. This is
1062 # only needed to mimic the behavior of _pickle.Unpickler.dump().
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01001063 if not hasattr(self, "_file_read"):
Alexandre Vassalotti3cfcab92008-12-27 09:30:39 +00001064 raise UnpicklingError("Unpickler.__init__() was not called by "
1065 "%s.__init__()" % (self.__class__.__name__,))
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01001066 self._unframer = _Unframer(self._file_read, self._file_readline)
1067 self.read = self._unframer.read
1068 self.readline = self._unframer.readline
Serhiy Storchaka59fb6342015-12-06 22:01:35 +02001069 self.metastack = []
Guido van Rossumb72cf2d1997-04-09 17:32:51 +00001070 self.stack = []
1071 self.append = self.stack.append
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01001072 self.proto = 0
Guido van Rossumb72cf2d1997-04-09 17:32:51 +00001073 read = self.read
1074 dispatch = self.dispatch
1075 try:
Serhiy Storchakaa3e32c92013-04-14 13:37:02 +03001076 while True:
Guido van Rossumb72cf2d1997-04-09 17:32:51 +00001077 key = read(1)
Guido van Rossum2e6a4b32007-05-04 19:56:22 +00001078 if not key:
1079 raise EOFError
Guido van Rossum98297ee2007-11-06 21:34:58 +00001080 assert isinstance(key, bytes_types)
Guido van Rossum2e6a4b32007-05-04 19:56:22 +00001081 dispatch[key[0]](self)
Guido van Rossumb940e112007-01-10 16:19:56 +00001082 except _Stop as stopinst:
Guido van Rossumff871742000-12-13 18:11:56 +00001083 return stopinst.value
Guido van Rossumb72cf2d1997-04-09 17:32:51 +00001084
Serhiy Storchaka59fb6342015-12-06 22:01:35 +02001085 # Return a list of items pushed in the stack after last MARK instruction.
1086 def pop_mark(self):
1087 items = self.stack
1088 self.stack = self.metastack.pop()
1089 self.append = self.stack.append
1090 return items
Guido van Rossumb72cf2d1997-04-09 17:32:51 +00001091
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001092 def persistent_load(self, pid):
Benjamin Peterson49956b22009-01-10 17:05:44 +00001093 raise UnpicklingError("unsupported persistent id encountered")
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001094
Guido van Rossumb72cf2d1997-04-09 17:32:51 +00001095 dispatch = {}
1096
Guido van Rossumd6c9e632003-01-28 03:49:52 +00001097 def load_proto(self):
Serhiy Storchakaa3e32c92013-04-14 13:37:02 +03001098 proto = self.read(1)[0]
Guido van Rossumf4169812008-03-17 22:56:06 +00001099 if not 0 <= proto <= HIGHEST_PROTOCOL:
Guido van Rossum26d95c32007-08-27 23:18:54 +00001100 raise ValueError("unsupported pickle protocol: %d" % proto)
Antoine Pitroud9dfaa92009-06-04 20:32:06 +00001101 self.proto = proto
Guido van Rossum2e6a4b32007-05-04 19:56:22 +00001102 dispatch[PROTO[0]] = load_proto
Guido van Rossumd6c9e632003-01-28 03:49:52 +00001103
Alexandre Vassalottib6a2f2a2013-11-23 20:30:03 -08001104 def load_frame(self):
1105 frame_size, = unpack('<Q', self.read(8))
1106 if frame_size > sys.maxsize:
1107 raise ValueError("frame size > sys.maxsize: %d" % frame_size)
1108 self._unframer.load_frame(frame_size)
1109 dispatch[FRAME[0]] = load_frame
1110
Guido van Rossumb72cf2d1997-04-09 17:32:51 +00001111 def load_persid(self):
Serhiy Storchakadec25af2016-07-17 11:24:17 +03001112 try:
1113 pid = self.readline()[:-1].decode("ascii")
1114 except UnicodeDecodeError:
1115 raise UnpicklingError(
1116 "persistent IDs in protocol 0 must be ASCII strings")
Guido van Rossumb72cf2d1997-04-09 17:32:51 +00001117 self.append(self.persistent_load(pid))
Guido van Rossum2e6a4b32007-05-04 19:56:22 +00001118 dispatch[PERSID[0]] = load_persid
Guido van Rossumb72cf2d1997-04-09 17:32:51 +00001119
1120 def load_binpersid(self):
Raymond Hettinger46ac8eb2002-06-30 03:39:14 +00001121 pid = self.stack.pop()
Guido van Rossumb72cf2d1997-04-09 17:32:51 +00001122 self.append(self.persistent_load(pid))
Guido van Rossum2e6a4b32007-05-04 19:56:22 +00001123 dispatch[BINPERSID[0]] = load_binpersid
Guido van Rossumb72cf2d1997-04-09 17:32:51 +00001124
1125 def load_none(self):
1126 self.append(None)
Guido van Rossum2e6a4b32007-05-04 19:56:22 +00001127 dispatch[NONE[0]] = load_none
Guido van Rossumb72cf2d1997-04-09 17:32:51 +00001128
Guido van Rossum7d97d312003-01-28 04:25:27 +00001129 def load_false(self):
1130 self.append(False)
Guido van Rossum2e6a4b32007-05-04 19:56:22 +00001131 dispatch[NEWFALSE[0]] = load_false
Guido van Rossum7d97d312003-01-28 04:25:27 +00001132
1133 def load_true(self):
1134 self.append(True)
Guido van Rossum2e6a4b32007-05-04 19:56:22 +00001135 dispatch[NEWTRUE[0]] = load_true
Guido van Rossum7d97d312003-01-28 04:25:27 +00001136
Guido van Rossumb72cf2d1997-04-09 17:32:51 +00001137 def load_int(self):
Tim Peters19ef62d2001-08-28 22:21:18 +00001138 data = self.readline()
Guido van Rossume2763392002-04-05 19:30:08 +00001139 if data == FALSE[1:]:
1140 val = False
1141 elif data == TRUE[1:]:
1142 val = True
1143 else:
Serhiy Storchakaa3e32c92013-04-14 13:37:02 +03001144 val = int(data, 0)
Guido van Rossume2763392002-04-05 19:30:08 +00001145 self.append(val)
Guido van Rossum2e6a4b32007-05-04 19:56:22 +00001146 dispatch[INT[0]] = load_int
Guido van Rossumb72cf2d1997-04-09 17:32:51 +00001147
1148 def load_binint(self):
Serhiy Storchakaa3e32c92013-04-14 13:37:02 +03001149 self.append(unpack('<i', self.read(4))[0])
Guido van Rossum2e6a4b32007-05-04 19:56:22 +00001150 dispatch[BININT[0]] = load_binint
Guido van Rossumb72cf2d1997-04-09 17:32:51 +00001151
1152 def load_binint1(self):
Serhiy Storchakaa3e32c92013-04-14 13:37:02 +03001153 self.append(self.read(1)[0])
Guido van Rossum2e6a4b32007-05-04 19:56:22 +00001154 dispatch[BININT1[0]] = load_binint1
Guido van Rossumb72cf2d1997-04-09 17:32:51 +00001155
1156 def load_binint2(self):
Serhiy Storchakaa3e32c92013-04-14 13:37:02 +03001157 self.append(unpack('<H', self.read(2))[0])
Guido van Rossum2e6a4b32007-05-04 19:56:22 +00001158 dispatch[BININT2[0]] = load_binint2
Tim Peters2344fae2001-01-15 00:50:52 +00001159
Guido van Rossumb72cf2d1997-04-09 17:32:51 +00001160 def load_long(self):
Serhiy Storchakaa3e32c92013-04-14 13:37:02 +03001161 val = self.readline()[:-1]
1162 if val and val[-1] == b'L'[0]:
Mark Dickinson8dd05142009-01-20 20:43:58 +00001163 val = val[:-1]
Guido van Rossumfeea0782007-10-10 18:00:50 +00001164 self.append(int(val, 0))
Guido van Rossum2e6a4b32007-05-04 19:56:22 +00001165 dispatch[LONG[0]] = load_long
Guido van Rossumb72cf2d1997-04-09 17:32:51 +00001166
Guido van Rossumd6c9e632003-01-28 03:49:52 +00001167 def load_long1(self):
Serhiy Storchakaa3e32c92013-04-14 13:37:02 +03001168 n = self.read(1)[0]
Guido van Rossum2e6a4b32007-05-04 19:56:22 +00001169 data = self.read(n)
1170 self.append(decode_long(data))
1171 dispatch[LONG1[0]] = load_long1
Guido van Rossumd6c9e632003-01-28 03:49:52 +00001172
1173 def load_long4(self):
Serhiy Storchakaa3e32c92013-04-14 13:37:02 +03001174 n, = unpack('<i', self.read(4))
Antoine Pitroubf6ecf92012-11-24 20:40:21 +01001175 if n < 0:
1176 # Corrupt or hostile pickle -- we never write one like this
Alexandre Vassalotticc757172013-04-14 02:25:10 -07001177 raise UnpicklingError("LONG pickle has negative byte count")
Guido van Rossum2e6a4b32007-05-04 19:56:22 +00001178 data = self.read(n)
1179 self.append(decode_long(data))
1180 dispatch[LONG4[0]] = load_long4
Guido van Rossumd6c9e632003-01-28 03:49:52 +00001181
Guido van Rossumb72cf2d1997-04-09 17:32:51 +00001182 def load_float(self):
Guido van Rossumff871742000-12-13 18:11:56 +00001183 self.append(float(self.readline()[:-1]))
Guido van Rossum2e6a4b32007-05-04 19:56:22 +00001184 dispatch[FLOAT[0]] = load_float
Guido van Rossumb72cf2d1997-04-09 17:32:51 +00001185
Serhiy Storchakaa3e32c92013-04-14 13:37:02 +03001186 def load_binfloat(self):
Guido van Rossumd3703791998-10-22 20:15:36 +00001187 self.append(unpack('>d', self.read(8))[0])
Guido van Rossum2e6a4b32007-05-04 19:56:22 +00001188 dispatch[BINFLOAT[0]] = load_binfloat
Guido van Rossumd3703791998-10-22 20:15:36 +00001189
Alexandre Vassalottid05c9ff2013-12-07 01:09:27 -08001190 def _decode_string(self, value):
1191 # Used to allow strings from Python 2 to be decoded either as
1192 # bytes or Unicode strings. This should be used only with the
1193 # STRING, BINSTRING and SHORT_BINSTRING opcodes.
1194 if self.encoding == "bytes":
1195 return value
1196 else:
1197 return value.decode(self.encoding, self.errors)
1198
Guido van Rossumb72cf2d1997-04-09 17:32:51 +00001199 def load_string(self):
Alexandre Vassalotti7c5e0942013-04-15 23:14:55 -07001200 data = self.readline()[:-1]
Serhiy Storchakaa3e32c92013-04-14 13:37:02 +03001201 # Strip outermost quotes
Alexandre Vassalotti7c5e0942013-04-15 23:14:55 -07001202 if len(data) >= 2 and data[0] == data[-1] and data[0] in b'"\'':
1203 data = data[1:-1]
Martin v. Löwis8a8da792002-08-14 07:46:28 +00001204 else:
Alexandre Vassalotti7c5e0942013-04-15 23:14:55 -07001205 raise UnpicklingError("the STRING opcode argument must be quoted")
Alexandre Vassalottid05c9ff2013-12-07 01:09:27 -08001206 self.append(self._decode_string(codecs.escape_decode(data)[0]))
Guido van Rossum2e6a4b32007-05-04 19:56:22 +00001207 dispatch[STRING[0]] = load_string
Guido van Rossumb72cf2d1997-04-09 17:32:51 +00001208
1209 def load_binstring(self):
Antoine Pitroubf6ecf92012-11-24 20:40:21 +01001210 # Deprecated BINSTRING uses signed 32-bit length
Serhiy Storchakaa3e32c92013-04-14 13:37:02 +03001211 len, = unpack('<i', self.read(4))
Antoine Pitroubf6ecf92012-11-24 20:40:21 +01001212 if len < 0:
Alexandre Vassalotticc757172013-04-14 02:25:10 -07001213 raise UnpicklingError("BINSTRING pickle has negative byte count")
Guido van Rossumf4169812008-03-17 22:56:06 +00001214 data = self.read(len)
Alexandre Vassalottid05c9ff2013-12-07 01:09:27 -08001215 self.append(self._decode_string(data))
Guido van Rossum2e6a4b32007-05-04 19:56:22 +00001216 dispatch[BINSTRING[0]] = load_binstring
Guido van Rossumb72cf2d1997-04-09 17:32:51 +00001217
Serhiy Storchakaa3e32c92013-04-14 13:37:02 +03001218 def load_binbytes(self):
Antoine Pitroubf6ecf92012-11-24 20:40:21 +01001219 len, = unpack('<I', self.read(4))
1220 if len > maxsize:
Alexandre Vassalotticc757172013-04-14 02:25:10 -07001221 raise UnpicklingError("BINBYTES exceeds system's maximum size "
1222 "of %d bytes" % maxsize)
Guido van Rossumf4169812008-03-17 22:56:06 +00001223 self.append(self.read(len))
1224 dispatch[BINBYTES[0]] = load_binbytes
1225
Guido van Rossumb5f2f1b2000-03-10 23:20:09 +00001226 def load_unicode(self):
Guido van Rossum2e6a4b32007-05-04 19:56:22 +00001227 self.append(str(self.readline()[:-1], 'raw-unicode-escape'))
1228 dispatch[UNICODE[0]] = load_unicode
Guido van Rossumb5f2f1b2000-03-10 23:20:09 +00001229
Serhiy Storchakaa3e32c92013-04-14 13:37:02 +03001230 def load_binunicode(self):
Antoine Pitroubf6ecf92012-11-24 20:40:21 +01001231 len, = unpack('<I', self.read(4))
1232 if len > maxsize:
Alexandre Vassalotticc757172013-04-14 02:25:10 -07001233 raise UnpicklingError("BINUNICODE exceeds system's maximum size "
1234 "of %d bytes" % maxsize)
Victor Stinner485fb562010-04-13 11:07:24 +00001235 self.append(str(self.read(len), 'utf-8', 'surrogatepass'))
Guido van Rossum2e6a4b32007-05-04 19:56:22 +00001236 dispatch[BINUNICODE[0]] = load_binunicode
Guido van Rossumb5f2f1b2000-03-10 23:20:09 +00001237
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01001238 def load_binunicode8(self):
1239 len, = unpack('<Q', self.read(8))
1240 if len > maxsize:
1241 raise UnpicklingError("BINUNICODE8 exceeds system's maximum size "
1242 "of %d bytes" % maxsize)
1243 self.append(str(self.read(len), 'utf-8', 'surrogatepass'))
1244 dispatch[BINUNICODE8[0]] = load_binunicode8
1245
Serhiy Storchakae0606192015-09-29 22:10:07 +03001246 def load_binbytes8(self):
1247 len, = unpack('<Q', self.read(8))
1248 if len > maxsize:
1249 raise UnpicklingError("BINBYTES8 exceeds system's maximum size "
1250 "of %d bytes" % maxsize)
1251 self.append(self.read(len))
1252 dispatch[BINBYTES8[0]] = load_binbytes8
1253
Guido van Rossumb72cf2d1997-04-09 17:32:51 +00001254 def load_short_binstring(self):
Serhiy Storchakaa3e32c92013-04-14 13:37:02 +03001255 len = self.read(1)[0]
1256 data = self.read(len)
Alexandre Vassalottid05c9ff2013-12-07 01:09:27 -08001257 self.append(self._decode_string(data))
Guido van Rossum2e6a4b32007-05-04 19:56:22 +00001258 dispatch[SHORT_BINSTRING[0]] = load_short_binstring
Guido van Rossumb72cf2d1997-04-09 17:32:51 +00001259
Guido van Rossumf4169812008-03-17 22:56:06 +00001260 def load_short_binbytes(self):
Serhiy Storchakaa3e32c92013-04-14 13:37:02 +03001261 len = self.read(1)[0]
1262 self.append(self.read(len))
Guido van Rossumf4169812008-03-17 22:56:06 +00001263 dispatch[SHORT_BINBYTES[0]] = load_short_binbytes
1264
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01001265 def load_short_binunicode(self):
1266 len = self.read(1)[0]
1267 self.append(str(self.read(len), 'utf-8', 'surrogatepass'))
1268 dispatch[SHORT_BINUNICODE[0]] = load_short_binunicode
1269
Guido van Rossumb72cf2d1997-04-09 17:32:51 +00001270 def load_tuple(self):
Serhiy Storchaka59fb6342015-12-06 22:01:35 +02001271 items = self.pop_mark()
1272 self.append(tuple(items))
Guido van Rossum2e6a4b32007-05-04 19:56:22 +00001273 dispatch[TUPLE[0]] = load_tuple
Guido van Rossumb72cf2d1997-04-09 17:32:51 +00001274
1275 def load_empty_tuple(self):
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001276 self.append(())
Guido van Rossum2e6a4b32007-05-04 19:56:22 +00001277 dispatch[EMPTY_TUPLE[0]] = load_empty_tuple
Guido van Rossumb72cf2d1997-04-09 17:32:51 +00001278
Guido van Rossum44f0ea52003-01-28 04:14:51 +00001279 def load_tuple1(self):
1280 self.stack[-1] = (self.stack[-1],)
Guido van Rossum2e6a4b32007-05-04 19:56:22 +00001281 dispatch[TUPLE1[0]] = load_tuple1
Guido van Rossum44f0ea52003-01-28 04:14:51 +00001282
1283 def load_tuple2(self):
1284 self.stack[-2:] = [(self.stack[-2], self.stack[-1])]
Guido van Rossum2e6a4b32007-05-04 19:56:22 +00001285 dispatch[TUPLE2[0]] = load_tuple2
Guido van Rossum44f0ea52003-01-28 04:14:51 +00001286
1287 def load_tuple3(self):
1288 self.stack[-3:] = [(self.stack[-3], self.stack[-2], self.stack[-1])]
Guido van Rossum2e6a4b32007-05-04 19:56:22 +00001289 dispatch[TUPLE3[0]] = load_tuple3
Guido van Rossum44f0ea52003-01-28 04:14:51 +00001290
Guido van Rossumb72cf2d1997-04-09 17:32:51 +00001291 def load_empty_list(self):
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001292 self.append([])
Guido van Rossum2e6a4b32007-05-04 19:56:22 +00001293 dispatch[EMPTY_LIST[0]] = load_empty_list
Guido van Rossumb72cf2d1997-04-09 17:32:51 +00001294
1295 def load_empty_dictionary(self):
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001296 self.append({})
Guido van Rossum2e6a4b32007-05-04 19:56:22 +00001297 dispatch[EMPTY_DICT[0]] = load_empty_dictionary
Guido van Rossumb72cf2d1997-04-09 17:32:51 +00001298
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01001299 def load_empty_set(self):
1300 self.append(set())
1301 dispatch[EMPTY_SET[0]] = load_empty_set
1302
1303 def load_frozenset(self):
Serhiy Storchaka59fb6342015-12-06 22:01:35 +02001304 items = self.pop_mark()
1305 self.append(frozenset(items))
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01001306 dispatch[FROZENSET[0]] = load_frozenset
1307
Guido van Rossumb72cf2d1997-04-09 17:32:51 +00001308 def load_list(self):
Serhiy Storchaka59fb6342015-12-06 22:01:35 +02001309 items = self.pop_mark()
1310 self.append(items)
Guido van Rossum2e6a4b32007-05-04 19:56:22 +00001311 dispatch[LIST[0]] = load_list
Guido van Rossumb72cf2d1997-04-09 17:32:51 +00001312
1313 def load_dict(self):
Serhiy Storchaka59fb6342015-12-06 22:01:35 +02001314 items = self.pop_mark()
Serhiy Storchakaa3e32c92013-04-14 13:37:02 +03001315 d = {items[i]: items[i+1]
1316 for i in range(0, len(items), 2)}
Serhiy Storchaka59fb6342015-12-06 22:01:35 +02001317 self.append(d)
Guido van Rossum2e6a4b32007-05-04 19:56:22 +00001318 dispatch[DICT[0]] = load_dict
Guido van Rossumb72cf2d1997-04-09 17:32:51 +00001319
Tim Petersd01c1e92003-01-30 15:41:46 +00001320 # INST and OBJ differ only in how they get a class object. It's not
1321 # only sensible to do the rest in a common routine, the two routines
1322 # previously diverged and grew different bugs.
1323 # klass is the class to instantiate, and k points to the topmost mark
1324 # object, following which are the arguments for klass.__init__.
Serhiy Storchaka59fb6342015-12-06 22:01:35 +02001325 def _instantiate(self, klass, args):
Alexander Belopolskyd92f0402010-07-17 22:50:45 +00001326 if (args or not isinstance(klass, type) or
1327 hasattr(klass, "__getinitargs__")):
Guido van Rossum743d17e1998-09-15 20:25:57 +00001328 try:
Guido van Rossumb26a97a2003-01-28 22:29:13 +00001329 value = klass(*args)
Guido van Rossumb940e112007-01-10 16:19:56 +00001330 except TypeError as err:
Guido van Rossum26d95c32007-08-27 23:18:54 +00001331 raise TypeError("in constructor for %s: %s" %
1332 (klass.__name__, str(err)), sys.exc_info()[2])
Alexander Belopolskyd92f0402010-07-17 22:50:45 +00001333 else:
1334 value = klass.__new__(klass)
Guido van Rossumb72cf2d1997-04-09 17:32:51 +00001335 self.append(value)
Tim Petersd01c1e92003-01-30 15:41:46 +00001336
1337 def load_inst(self):
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001338 module = self.readline()[:-1].decode("ascii")
1339 name = self.readline()[:-1].decode("ascii")
Tim Petersd01c1e92003-01-30 15:41:46 +00001340 klass = self.find_class(module, name)
Serhiy Storchaka59fb6342015-12-06 22:01:35 +02001341 self._instantiate(klass, self.pop_mark())
Guido van Rossum2e6a4b32007-05-04 19:56:22 +00001342 dispatch[INST[0]] = load_inst
Guido van Rossumb72cf2d1997-04-09 17:32:51 +00001343
1344 def load_obj(self):
Tim Petersd01c1e92003-01-30 15:41:46 +00001345 # Stack is ... markobject classobject arg1 arg2 ...
Serhiy Storchaka59fb6342015-12-06 22:01:35 +02001346 args = self.pop_mark()
1347 cls = args.pop(0)
1348 self._instantiate(cls, args)
Guido van Rossum2e6a4b32007-05-04 19:56:22 +00001349 dispatch[OBJ[0]] = load_obj
Guido van Rossumb72cf2d1997-04-09 17:32:51 +00001350
Guido van Rossum3a41c612003-01-28 15:10:22 +00001351 def load_newobj(self):
1352 args = self.stack.pop()
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01001353 cls = self.stack.pop()
Guido van Rossum3a41c612003-01-28 15:10:22 +00001354 obj = cls.__new__(cls, *args)
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01001355 self.append(obj)
Guido van Rossum2e6a4b32007-05-04 19:56:22 +00001356 dispatch[NEWOBJ[0]] = load_newobj
Guido van Rossum3a41c612003-01-28 15:10:22 +00001357
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01001358 def load_newobj_ex(self):
1359 kwargs = self.stack.pop()
1360 args = self.stack.pop()
1361 cls = self.stack.pop()
1362 obj = cls.__new__(cls, *args, **kwargs)
1363 self.append(obj)
1364 dispatch[NEWOBJ_EX[0]] = load_newobj_ex
1365
Guido van Rossumb72cf2d1997-04-09 17:32:51 +00001366 def load_global(self):
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001367 module = self.readline()[:-1].decode("utf-8")
1368 name = self.readline()[:-1].decode("utf-8")
Guido van Rossumb72cf2d1997-04-09 17:32:51 +00001369 klass = self.find_class(module, name)
1370 self.append(klass)
Guido van Rossum2e6a4b32007-05-04 19:56:22 +00001371 dispatch[GLOBAL[0]] = load_global
Guido van Rossumb72cf2d1997-04-09 17:32:51 +00001372
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01001373 def load_stack_global(self):
1374 name = self.stack.pop()
1375 module = self.stack.pop()
1376 if type(name) is not str or type(module) is not str:
1377 raise UnpicklingError("STACK_GLOBAL requires str")
1378 self.append(self.find_class(module, name))
1379 dispatch[STACK_GLOBAL[0]] = load_stack_global
1380
Guido van Rossum255f3ee2003-01-29 06:14:11 +00001381 def load_ext1(self):
Serhiy Storchakaa3e32c92013-04-14 13:37:02 +03001382 code = self.read(1)[0]
Guido van Rossum255f3ee2003-01-29 06:14:11 +00001383 self.get_extension(code)
Guido van Rossum2e6a4b32007-05-04 19:56:22 +00001384 dispatch[EXT1[0]] = load_ext1
Guido van Rossum255f3ee2003-01-29 06:14:11 +00001385
1386 def load_ext2(self):
Serhiy Storchakaa3e32c92013-04-14 13:37:02 +03001387 code, = unpack('<H', self.read(2))
Guido van Rossum255f3ee2003-01-29 06:14:11 +00001388 self.get_extension(code)
Guido van Rossum2e6a4b32007-05-04 19:56:22 +00001389 dispatch[EXT2[0]] = load_ext2
Guido van Rossum255f3ee2003-01-29 06:14:11 +00001390
1391 def load_ext4(self):
Serhiy Storchakaa3e32c92013-04-14 13:37:02 +03001392 code, = unpack('<i', self.read(4))
Guido van Rossum255f3ee2003-01-29 06:14:11 +00001393 self.get_extension(code)
Guido van Rossum2e6a4b32007-05-04 19:56:22 +00001394 dispatch[EXT4[0]] = load_ext4
Guido van Rossum255f3ee2003-01-29 06:14:11 +00001395
1396 def get_extension(self, code):
1397 nil = []
Guido van Rossumd4b920c2003-02-04 01:54:49 +00001398 obj = _extension_cache.get(code, nil)
Guido van Rossum255f3ee2003-01-29 06:14:11 +00001399 if obj is not nil:
1400 self.append(obj)
1401 return
Guido van Rossumd4b920c2003-02-04 01:54:49 +00001402 key = _inverted_registry.get(code)
Guido van Rossum255f3ee2003-01-29 06:14:11 +00001403 if not key:
Antoine Pitroubf6ecf92012-11-24 20:40:21 +01001404 if code <= 0: # note that 0 is forbidden
1405 # Corrupt or hostile pickle.
Alexandre Vassalotticc757172013-04-14 02:25:10 -07001406 raise UnpicklingError("EXT specifies code <= 0")
Guido van Rossum255f3ee2003-01-29 06:14:11 +00001407 raise ValueError("unregistered extension code %d" % code)
1408 obj = self.find_class(*key)
Guido van Rossumd4b920c2003-02-04 01:54:49 +00001409 _extension_cache[code] = obj
Guido van Rossum255f3ee2003-01-29 06:14:11 +00001410 self.append(obj)
1411
Guido van Rossumb72cf2d1997-04-09 17:32:51 +00001412 def find_class(self, module, name):
Antoine Pitroud9dfaa92009-06-04 20:32:06 +00001413 # Subclasses may override this.
1414 if self.proto < 3 and self.fix_imports:
1415 if (module, name) in _compat_pickle.NAME_MAPPING:
1416 module, name = _compat_pickle.NAME_MAPPING[(module, name)]
Serhiy Storchakabfe18242015-03-31 13:12:37 +03001417 elif module in _compat_pickle.IMPORT_MAPPING:
Antoine Pitroud9dfaa92009-06-04 20:32:06 +00001418 module = _compat_pickle.IMPORT_MAPPING[module]
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001419 __import__(module, level=0)
Serhiy Storchaka58e41342015-03-31 14:07:24 +03001420 if self.proto >= 4:
1421 return _getattribute(sys.modules[module], name)[0]
1422 else:
1423 return getattr(sys.modules[module], name)
Guido van Rossumb72cf2d1997-04-09 17:32:51 +00001424
1425 def load_reduce(self):
1426 stack = self.stack
Guido van Rossumb26a97a2003-01-28 22:29:13 +00001427 args = stack.pop()
1428 func = stack[-1]
Serhiy Storchakaa8d83f52015-12-01 00:39:25 +02001429 stack[-1] = func(*args)
Guido van Rossum2e6a4b32007-05-04 19:56:22 +00001430 dispatch[REDUCE[0]] = load_reduce
Guido van Rossuma48061a1995-01-10 00:31:14 +00001431
Guido van Rossumb72cf2d1997-04-09 17:32:51 +00001432 def load_pop(self):
Serhiy Storchaka59fb6342015-12-06 22:01:35 +02001433 if self.stack:
1434 del self.stack[-1]
1435 else:
1436 self.pop_mark()
Guido van Rossum2e6a4b32007-05-04 19:56:22 +00001437 dispatch[POP[0]] = load_pop
Guido van Rossum7b5430f1995-03-04 22:25:21 +00001438
Guido van Rossumb72cf2d1997-04-09 17:32:51 +00001439 def load_pop_mark(self):
Serhiy Storchaka59fb6342015-12-06 22:01:35 +02001440 self.pop_mark()
Guido van Rossum2e6a4b32007-05-04 19:56:22 +00001441 dispatch[POP_MARK[0]] = load_pop_mark
Guido van Rossuma48061a1995-01-10 00:31:14 +00001442
Guido van Rossumb72cf2d1997-04-09 17:32:51 +00001443 def load_dup(self):
Guido van Rossumb1062fc1998-03-31 17:00:46 +00001444 self.append(self.stack[-1])
Guido van Rossum2e6a4b32007-05-04 19:56:22 +00001445 dispatch[DUP[0]] = load_dup
Guido van Rossuma48061a1995-01-10 00:31:14 +00001446
Guido van Rossumb72cf2d1997-04-09 17:32:51 +00001447 def load_get(self):
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001448 i = int(self.readline()[:-1])
1449 self.append(self.memo[i])
Guido van Rossum2e6a4b32007-05-04 19:56:22 +00001450 dispatch[GET[0]] = load_get
Guido van Rossum78536471996-04-12 13:36:27 +00001451
Guido van Rossumb72cf2d1997-04-09 17:32:51 +00001452 def load_binget(self):
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001453 i = self.read(1)[0]
1454 self.append(self.memo[i])
Guido van Rossum2e6a4b32007-05-04 19:56:22 +00001455 dispatch[BINGET[0]] = load_binget
Guido van Rossum78536471996-04-12 13:36:27 +00001456
Serhiy Storchakaa3e32c92013-04-14 13:37:02 +03001457 def load_long_binget(self):
Antoine Pitroubf6ecf92012-11-24 20:40:21 +01001458 i, = unpack('<I', self.read(4))
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001459 self.append(self.memo[i])
Guido van Rossum2e6a4b32007-05-04 19:56:22 +00001460 dispatch[LONG_BINGET[0]] = load_long_binget
Guido van Rossum78536471996-04-12 13:36:27 +00001461
Guido van Rossumb72cf2d1997-04-09 17:32:51 +00001462 def load_put(self):
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001463 i = int(self.readline()[:-1])
Antoine Pitrou55549ec2011-08-30 00:27:10 +02001464 if i < 0:
1465 raise ValueError("negative PUT argument")
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001466 self.memo[i] = self.stack[-1]
Guido van Rossum2e6a4b32007-05-04 19:56:22 +00001467 dispatch[PUT[0]] = load_put
Guido van Rossuma48061a1995-01-10 00:31:14 +00001468
Guido van Rossumb72cf2d1997-04-09 17:32:51 +00001469 def load_binput(self):
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001470 i = self.read(1)[0]
Antoine Pitrou55549ec2011-08-30 00:27:10 +02001471 if i < 0:
1472 raise ValueError("negative BINPUT argument")
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001473 self.memo[i] = self.stack[-1]
Guido van Rossum2e6a4b32007-05-04 19:56:22 +00001474 dispatch[BINPUT[0]] = load_binput
Guido van Rossuma48061a1995-01-10 00:31:14 +00001475
Serhiy Storchakaa3e32c92013-04-14 13:37:02 +03001476 def load_long_binput(self):
Antoine Pitroubf6ecf92012-11-24 20:40:21 +01001477 i, = unpack('<I', self.read(4))
1478 if i > maxsize:
Antoine Pitrou55549ec2011-08-30 00:27:10 +02001479 raise ValueError("negative LONG_BINPUT argument")
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001480 self.memo[i] = self.stack[-1]
Guido van Rossum2e6a4b32007-05-04 19:56:22 +00001481 dispatch[LONG_BINPUT[0]] = load_long_binput
Guido van Rossuma48061a1995-01-10 00:31:14 +00001482
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01001483 def load_memoize(self):
1484 memo = self.memo
1485 memo[len(memo)] = self.stack[-1]
1486 dispatch[MEMOIZE[0]] = load_memoize
1487
Guido van Rossumb72cf2d1997-04-09 17:32:51 +00001488 def load_append(self):
1489 stack = self.stack
Raymond Hettinger46ac8eb2002-06-30 03:39:14 +00001490 value = stack.pop()
Guido van Rossumb72cf2d1997-04-09 17:32:51 +00001491 list = stack[-1]
1492 list.append(value)
Guido van Rossum2e6a4b32007-05-04 19:56:22 +00001493 dispatch[APPEND[0]] = load_append
Guido van Rossuma48061a1995-01-10 00:31:14 +00001494
Guido van Rossumb72cf2d1997-04-09 17:32:51 +00001495 def load_appends(self):
Serhiy Storchaka59fb6342015-12-06 22:01:35 +02001496 items = self.pop_mark()
1497 list_obj = self.stack[-1]
Serhiy Storchakabee09ae2017-02-02 11:12:47 +02001498 try:
1499 extend = list_obj.extend
1500 except AttributeError:
1501 pass
Alexandre Vassalotti1f7492c2013-04-20 13:19:46 -07001502 else:
Serhiy Storchakabee09ae2017-02-02 11:12:47 +02001503 extend(items)
1504 return
1505 # Even if the PEP 307 requires extend() and append() methods,
1506 # fall back on append() if the object has no extend() method
1507 # for backward compatibility.
1508 append = list_obj.append
1509 for item in items:
1510 append(item)
Guido van Rossum2e6a4b32007-05-04 19:56:22 +00001511 dispatch[APPENDS[0]] = load_appends
Tim Peters2344fae2001-01-15 00:50:52 +00001512
Guido van Rossumb72cf2d1997-04-09 17:32:51 +00001513 def load_setitem(self):
1514 stack = self.stack
Raymond Hettinger46ac8eb2002-06-30 03:39:14 +00001515 value = stack.pop()
1516 key = stack.pop()
Guido van Rossumb72cf2d1997-04-09 17:32:51 +00001517 dict = stack[-1]
1518 dict[key] = value
Guido van Rossum2e6a4b32007-05-04 19:56:22 +00001519 dispatch[SETITEM[0]] = load_setitem
Guido van Rossum0c891ce1995-03-14 15:09:05 +00001520
Guido van Rossumb72cf2d1997-04-09 17:32:51 +00001521 def load_setitems(self):
Serhiy Storchaka59fb6342015-12-06 22:01:35 +02001522 items = self.pop_mark()
1523 dict = self.stack[-1]
1524 for i in range(0, len(items), 2):
1525 dict[items[i]] = items[i + 1]
Guido van Rossum2e6a4b32007-05-04 19:56:22 +00001526 dispatch[SETITEMS[0]] = load_setitems
Guido van Rossuma48061a1995-01-10 00:31:14 +00001527
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01001528 def load_additems(self):
Serhiy Storchaka59fb6342015-12-06 22:01:35 +02001529 items = self.pop_mark()
1530 set_obj = self.stack[-1]
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01001531 if isinstance(set_obj, set):
1532 set_obj.update(items)
1533 else:
1534 add = set_obj.add
1535 for item in items:
1536 add(item)
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01001537 dispatch[ADDITEMS[0]] = load_additems
1538
Guido van Rossumb72cf2d1997-04-09 17:32:51 +00001539 def load_build(self):
1540 stack = self.stack
Guido van Rossumac5b5d22003-01-28 22:01:16 +00001541 state = stack.pop()
Guido van Rossumb72cf2d1997-04-09 17:32:51 +00001542 inst = stack[-1]
Guido van Rossumac5b5d22003-01-28 22:01:16 +00001543 setstate = getattr(inst, "__setstate__", None)
Serhiy Storchakaa3e32c92013-04-14 13:37:02 +03001544 if setstate is not None:
Guido van Rossumac5b5d22003-01-28 22:01:16 +00001545 setstate(state)
1546 return
1547 slotstate = None
1548 if isinstance(state, tuple) and len(state) == 2:
1549 state, slotstate = state
1550 if state:
Alexandre Vassalottiebfecfd2009-05-25 18:50:33 +00001551 inst_dict = inst.__dict__
Antoine Pitroua9f48a02009-05-02 21:41:14 +00001552 intern = sys.intern
Alexandre Vassalottiebfecfd2009-05-25 18:50:33 +00001553 for k, v in state.items():
1554 if type(k) is str:
1555 inst_dict[intern(k)] = v
1556 else:
1557 inst_dict[k] = v
Guido van Rossumac5b5d22003-01-28 22:01:16 +00001558 if slotstate:
1559 for k, v in slotstate.items():
1560 setattr(inst, k, v)
Guido van Rossum2e6a4b32007-05-04 19:56:22 +00001561 dispatch[BUILD[0]] = load_build
Guido van Rossuma48061a1995-01-10 00:31:14 +00001562
Guido van Rossumb72cf2d1997-04-09 17:32:51 +00001563 def load_mark(self):
Serhiy Storchaka59fb6342015-12-06 22:01:35 +02001564 self.metastack.append(self.stack)
1565 self.stack = []
1566 self.append = self.stack.append
Guido van Rossum2e6a4b32007-05-04 19:56:22 +00001567 dispatch[MARK[0]] = load_mark
Guido van Rossuma48061a1995-01-10 00:31:14 +00001568
Guido van Rossumb72cf2d1997-04-09 17:32:51 +00001569 def load_stop(self):
Raymond Hettinger46ac8eb2002-06-30 03:39:14 +00001570 value = self.stack.pop()
Guido van Rossumff871742000-12-13 18:11:56 +00001571 raise _Stop(value)
Guido van Rossum2e6a4b32007-05-04 19:56:22 +00001572 dispatch[STOP[0]] = load_stop
Guido van Rossuma48061a1995-01-10 00:31:14 +00001573
Guido van Rossumd6c9e632003-01-28 03:49:52 +00001574
Guido van Rossum0c891ce1995-03-14 15:09:05 +00001575# Shorthands
1576
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01001577def _dump(obj, file, protocol=None, *, fix_imports=True):
1578 _Pickler(file, protocol, fix_imports=fix_imports).dump(obj)
Guido van Rossum0c891ce1995-03-14 15:09:05 +00001579
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01001580def _dumps(obj, protocol=None, *, fix_imports=True):
Guido van Rossumcfe5f202007-05-08 21:26:54 +00001581 f = io.BytesIO()
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01001582 _Pickler(f, protocol, fix_imports=fix_imports).dump(obj)
Guido van Rossumcfe5f202007-05-08 21:26:54 +00001583 res = f.getvalue()
Guido van Rossum98297ee2007-11-06 21:34:58 +00001584 assert isinstance(res, bytes_types)
Guido van Rossumcfe5f202007-05-08 21:26:54 +00001585 return res
Guido van Rossum0c891ce1995-03-14 15:09:05 +00001586
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01001587def _load(file, *, fix_imports=True, encoding="ASCII", errors="strict"):
1588 return _Unpickler(file, fix_imports=fix_imports,
Antoine Pitroud9dfaa92009-06-04 20:32:06 +00001589 encoding=encoding, errors=errors).load()
Guido van Rossum0c891ce1995-03-14 15:09:05 +00001590
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01001591def _loads(s, *, fix_imports=True, encoding="ASCII", errors="strict"):
Guido van Rossumcfe5f202007-05-08 21:26:54 +00001592 if isinstance(s, str):
1593 raise TypeError("Can't load pickle from unicode string")
1594 file = io.BytesIO(s)
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01001595 return _Unpickler(file, fix_imports=fix_imports,
1596 encoding=encoding, errors=errors).load()
Guido van Rossumd6c9e632003-01-28 03:49:52 +00001597
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00001598# Use the faster _pickle if possible
1599try:
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01001600 from _pickle import (
1601 PickleError,
1602 PicklingError,
1603 UnpicklingError,
1604 Pickler,
1605 Unpickler,
1606 dump,
1607 dumps,
1608 load,
1609 loads
1610 )
Brett Cannoncd171c82013-07-04 17:43:24 -04001611except ImportError:
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00001612 Pickler, Unpickler = _Pickler, _Unpickler
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01001613 dump, dumps, load, loads = _dump, _dumps, _load, _loads
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00001614
Guido van Rossumd6c9e632003-01-28 03:49:52 +00001615# Doctest
Guido van Rossumd6c9e632003-01-28 03:49:52 +00001616def _test():
1617 import doctest
1618 return doctest.testmod()
1619
1620if __name__ == "__main__":
Florent Xicluna54540ec2011-11-04 08:29:17 +01001621 import argparse
Alexander Belopolsky455f7bd2010-07-27 23:02:38 +00001622 parser = argparse.ArgumentParser(
1623 description='display contents of the pickle files')
1624 parser.add_argument(
1625 'pickle_file', type=argparse.FileType('br'),
1626 nargs='*', help='the pickle file')
1627 parser.add_argument(
1628 '-t', '--test', action='store_true',
1629 help='run self-test suite')
1630 parser.add_argument(
1631 '-v', action='store_true',
1632 help='run verbosely; only affects self-test run')
1633 args = parser.parse_args()
1634 if args.test:
1635 _test()
1636 else:
1637 if not args.pickle_file:
1638 parser.print_help()
1639 else:
1640 import pprint
1641 for f in args.pickle_file:
1642 obj = load(f)
1643 pprint.pprint(obj)