blob: 981cfe183f2895739a226a015022ed7e2f251a1a [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
Guido van Rossume467be61997-12-05 19:42:42 +00003See module cPickle for a (much) faster implementation.
4See module copy_reg for a mechanism for registering custom picklers.
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
Guido van Rossum743d17e1998-09-15 20:25:57 +000026__version__ = "$Revision$" # Code version
Guido van Rossuma48061a1995-01-10 00:31:14 +000027
28from types import *
Guido van Rossum4fb5b281997-09-12 20:07:24 +000029from copy_reg import dispatch_table, safe_constructors
Guido van Rossumd3703791998-10-22 20:15:36 +000030import marshal
31import sys
32import struct
Skip Montanaro23bafc62001-02-18 03:10:09 +000033import re
Guido van Rossuma48061a1995-01-10 00:31:14 +000034
Skip Montanaro352674d2001-02-07 23:14:30 +000035__all__ = ["PickleError", "PicklingError", "UnpicklingError", "Pickler",
36 "Unpickler", "dump", "dumps", "load", "loads"]
37
Guido van Rossumd3703791998-10-22 20:15:36 +000038format_version = "1.3" # File format version we write
39compatible_formats = ["1.0", "1.1", "1.2"] # Old format versions we can read
Guido van Rossumb72cf2d1997-04-09 17:32:51 +000040
41mdumps = marshal.dumps
42mloads = marshal.loads
Guido van Rossum0c891ce1995-03-14 15:09:05 +000043
Raymond Hettingeraef22fb2002-05-29 16:18:42 +000044class PickleError(Exception):
Neal Norwitzefbb67b2002-05-30 12:12:04 +000045 """A common base class for the other pickling exceptions."""
Raymond Hettingeraef22fb2002-05-29 16:18:42 +000046 pass
47
48class PicklingError(PickleError):
49 """This exception is raised when an unpicklable object is passed to the
50 dump() method.
51
52 """
53 pass
54
55class UnpicklingError(PickleError):
56 """This exception is raised when there is a problem unpickling an object,
57 such as a security violation.
58
59 Note that other exceptions may also be raised during unpickling, including
60 (but not necessarily limited to) AttributeError, EOFError, ImportError,
61 and IndexError.
62
63 """
64 pass
Guido van Rossum7849da81995-03-09 14:08:35 +000065
Guido van Rossumff871742000-12-13 18:11:56 +000066class _Stop(Exception):
67 def __init__(self, value):
68 self.value = value
69
Jeremy Hylton2b9d0291998-05-27 22:38:22 +000070try:
71 from org.python.core import PyStringMap
72except ImportError:
73 PyStringMap = None
74
Guido van Rossumdbb718f2001-09-21 19:22:34 +000075try:
76 UnicodeType
77except NameError:
78 UnicodeType = None
79
80
Guido van Rossumb72cf2d1997-04-09 17:32:51 +000081MARK = '('
82STOP = '.'
83POP = '0'
84POP_MARK = '1'
85DUP = '2'
86FLOAT = 'F'
87INT = 'I'
88BININT = 'J'
89BININT1 = 'K'
90LONG = 'L'
91BININT2 = 'M'
92NONE = 'N'
93PERSID = 'P'
94BINPERSID = 'Q'
95REDUCE = 'R'
96STRING = 'S'
97BINSTRING = 'T'
98SHORT_BINSTRING = 'U'
Guido van Rossumb5f2f1b2000-03-10 23:20:09 +000099UNICODE = 'V'
100BINUNICODE = 'X'
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000101APPEND = 'a'
102BUILD = 'b'
103GLOBAL = 'c'
104DICT = 'd'
105EMPTY_DICT = '}'
106APPENDS = 'e'
107GET = 'g'
108BINGET = 'h'
109INST = 'i'
110LONG_BINGET = 'j'
111LIST = 'l'
112EMPTY_LIST = ']'
113OBJ = 'o'
114PUT = 'p'
115BINPUT = 'q'
116LONG_BINPUT = 'r'
117SETITEM = 's'
118TUPLE = 't'
119EMPTY_TUPLE = ')'
120SETITEMS = 'u'
Guido van Rossumd3703791998-10-22 20:15:36 +0000121BINFLOAT = 'G'
Guido van Rossume2763392002-04-05 19:30:08 +0000122TRUE = 'I01\n'
123FALSE = 'I00\n'
Guido van Rossum77f6a652002-04-03 22:41:51 +0000124
Guido van Rossuma48061a1995-01-10 00:31:14 +0000125
Skip Montanaro23bafc62001-02-18 03:10:09 +0000126__all__.extend([x for x in dir() if re.match("[A-Z][A-Z0-9_]+$",x)])
Neal Norwitzd5ba4ae2002-02-11 18:12:06 +0000127del x
Skip Montanaro23bafc62001-02-18 03:10:09 +0000128
Martin v. Löwis8a8da792002-08-14 07:46:28 +0000129_quotes = ["'", '"']
130
Guido van Rossuma48061a1995-01-10 00:31:14 +0000131class Pickler:
132
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000133 def __init__(self, file, bin = 0):
Raymond Hettingeraef22fb2002-05-29 16:18:42 +0000134 """This takes a file-like object for writing a pickle data stream.
135
136 The optional bin parameter if true, tells the pickler to use the more
137 efficient binary pickle format, otherwise the ASCII format is used
138 (this is the default).
139
140 The file parameter must have a write() method that accepts a single
141 string argument. It can thus be an open file object, a StringIO
142 object, or any other custom object that meets this interface.
143
144 """
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000145 self.write = file.write
146 self.memo = {}
147 self.bin = bin
Guido van Rossuma48061a1995-01-10 00:31:14 +0000148
Fred Drake7f781c92002-05-01 20:33:53 +0000149 def clear_memo(self):
Raymond Hettingeraef22fb2002-05-29 16:18:42 +0000150 """Clears the pickler's "memo".
151
152 The memo is the data structure that remembers which objects the
153 pickler has already seen, so that shared or recursive objects pickled
154 by reference and not by value. This method is useful when re-using
155 picklers.
156
157 """
Fred Drake7f781c92002-05-01 20:33:53 +0000158 self.memo.clear()
159
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000160 def dump(self, object):
Raymond Hettingeraef22fb2002-05-29 16:18:42 +0000161 """Write a pickled representation of object to the open file object.
162
163 Either the binary or ASCII format will be used, depending on the
164 value of the bin flag passed to the constructor.
165
166 """
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000167 self.save(object)
168 self.write(STOP)
Guido van Rossuma48061a1995-01-10 00:31:14 +0000169
Jeremy Hylton3422c992003-01-24 19:29:52 +0000170 def memoize(self, obj):
171 """Store an object in the memo."""
172
173 # The memo is a dictionary mapping object ids to 2-tuples
174 # that contains the memo value and the object being memoized.
175 # The memo value is written to the pickle and will become
176 # the key in the Unpickler's memo. The object is stored in the
177 # memo so that transient objects are kept alive during pickling.
178
179 # The use of the memo length as the memo value is just a convention.
180 # The only requirement is that the memo values by unique.
181 d = id(obj)
182 memo_len = len(self.memo)
183 self.write(self.put(memo_len))
184 self.memo[d] = memo_len, obj
185
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000186 def put(self, i):
Tim Petersc32d8242001-04-10 02:48:53 +0000187 if self.bin:
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000188 s = mdumps(i)[1:]
Tim Petersc32d8242001-04-10 02:48:53 +0000189 if i < 256:
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000190 return BINPUT + s[0]
Guido van Rossuma48061a1995-01-10 00:31:14 +0000191
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000192 return LONG_BINPUT + s
Guido van Rossuma48061a1995-01-10 00:31:14 +0000193
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000194 return PUT + `i` + '\n'
Guido van Rossuma48061a1995-01-10 00:31:14 +0000195
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000196 def get(self, i):
Tim Petersc32d8242001-04-10 02:48:53 +0000197 if self.bin:
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000198 s = mdumps(i)[1:]
Guido van Rossuma48061a1995-01-10 00:31:14 +0000199
Tim Petersc32d8242001-04-10 02:48:53 +0000200 if i < 256:
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000201 return BINGET + s[0]
Guido van Rossuma48061a1995-01-10 00:31:14 +0000202
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000203 return LONG_BINGET + s
Guido van Rossuma48061a1995-01-10 00:31:14 +0000204
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000205 return GET + `i` + '\n'
Tim Peters2344fae2001-01-15 00:50:52 +0000206
Jeremy Hylton5e0f4e72002-11-13 22:01:27 +0000207 def save(self, object):
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000208 memo = self.memo
Guido van Rossuma48061a1995-01-10 00:31:14 +0000209
Jeremy Hylton5e0f4e72002-11-13 22:01:27 +0000210 pid = self.persistent_id(object)
211 if pid is not None:
212 self.save_pers(pid)
213 return
Guido van Rossuma48061a1995-01-10 00:31:14 +0000214
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000215 d = id(object)
Tim Peters2344fae2001-01-15 00:50:52 +0000216
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000217 t = type(object)
Guido van Rossuma48061a1995-01-10 00:31:14 +0000218
Tim Petersc32d8242001-04-10 02:48:53 +0000219 if (t is TupleType) and (len(object) == 0):
220 if self.bin:
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000221 self.save_empty_tuple(object)
222 else:
223 self.save_tuple(object)
224 return
Guido van Rossuma48061a1995-01-10 00:31:14 +0000225
Raymond Hettinger54f02222002-06-01 14:18:47 +0000226 if d in memo:
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000227 self.write(self.get(memo[d][0]))
228 return
229
230 try:
231 f = self.dispatch[t]
232 except KeyError:
Guido van Rossum85ee4912002-03-26 00:51:56 +0000233 try:
234 issc = issubclass(t, TypeType)
235 except TypeError: # t is not a class
236 issc = 0
237 if issc:
Guido van Rossumf048a8f2001-12-19 16:55:02 +0000238 self.save_global(object)
239 return
240
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000241 try:
242 reduce = dispatch_table[t]
243 except KeyError:
244 try:
245 reduce = object.__reduce__
246 except AttributeError:
247 raise PicklingError, \
Guido van Rossum08a92cb1999-10-10 21:14:25 +0000248 "can't pickle %s object: %s" % (`t.__name__`,
249 `object`)
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000250 else:
251 tup = reduce()
252 else:
253 tup = reduce(object)
254
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000255 if type(tup) is StringType:
256 self.save_global(object, tup)
257 return
Guido van Rossumd1f49841997-12-10 23:40:18 +0000258
Tim Petersc32d8242001-04-10 02:48:53 +0000259 if type(tup) is not TupleType:
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000260 raise PicklingError, "Value returned by %s must be a " \
261 "tuple" % reduce
262
263 l = len(tup)
Tim Peters2344fae2001-01-15 00:50:52 +0000264
Tim Petersc32d8242001-04-10 02:48:53 +0000265 if (l != 2) and (l != 3):
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000266 raise PicklingError, "tuple returned by %s must contain " \
267 "only two or three elements" % reduce
268
269 callable = tup[0]
270 arg_tup = tup[1]
Tim Peters2344fae2001-01-15 00:50:52 +0000271
Tim Petersc32d8242001-04-10 02:48:53 +0000272 if l > 2:
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000273 state = tup[2]
274 else:
275 state = None
276
Guido van Rossumd1f49841997-12-10 23:40:18 +0000277 if type(arg_tup) is not TupleType and arg_tup is not None:
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000278 raise PicklingError, "Second element of tuple returned " \
279 "by %s must be a tuple" % reduce
280
Tim Peters2344fae2001-01-15 00:50:52 +0000281 self.save_reduce(callable, arg_tup, state)
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000282 memo_len = len(memo)
283 self.write(self.put(memo_len))
284 memo[d] = (memo_len, object)
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000285 return
286
287 f(self, object)
288
289 def persistent_id(self, object):
290 return None
291
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000292 def save_pers(self, pid):
Tim Petersc32d8242001-04-10 02:48:53 +0000293 if not self.bin:
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000294 self.write(PERSID + str(pid) + '\n')
295 else:
Jeremy Hylton5e0f4e72002-11-13 22:01:27 +0000296 self.save(pid)
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000297 self.write(BINPERSID)
298
Jeremy Hylton3422c992003-01-24 19:29:52 +0000299 def save_reduce(self, acallable, arg_tup, state = None):
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000300 write = self.write
301 save = self.save
302
Jeremy Hylton3422c992003-01-24 19:29:52 +0000303 if not callable(acallable):
304 raise PicklingError("__reduce__() must return callable as "
305 "first argument, not %s" % `acallable`)
306
307 save(acallable)
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000308 save(arg_tup)
309 write(REDUCE)
Tim Peters2344fae2001-01-15 00:50:52 +0000310
Tim Petersc32d8242001-04-10 02:48:53 +0000311 if state is not None:
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000312 save(state)
313 write(BUILD)
314
315 dispatch = {}
316
317 def save_none(self, object):
318 self.write(NONE)
319 dispatch[NoneType] = save_none
320
Guido van Rossum77f6a652002-04-03 22:41:51 +0000321 def save_bool(self, object):
322 if object:
323 self.write(TRUE)
324 else:
325 self.write(FALSE)
326 dispatch[bool] = save_bool
327
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000328 def save_int(self, object):
Tim Petersc32d8242001-04-10 02:48:53 +0000329 if self.bin:
Tim Peters44714002001-04-10 05:02:52 +0000330 # If the int is small enough to fit in a signed 4-byte 2's-comp
331 # format, we can store it more efficiently than the general
332 # case.
333 high_bits = object >> 31 # note that Python shift sign-extends
334 if high_bits == 0 or high_bits == -1:
335 # All high bits are copies of bit 2**31, so the value
336 # fits in a 4-byte signed int.
337 i = mdumps(object)[1:]
338 assert len(i) == 4
339 if i[-2:] == '\000\000': # fits in 2-byte unsigned int
340 if i[-3] == '\000': # fits in 1-byte unsigned int
341 self.write(BININT1 + i[0])
342 else:
343 self.write(BININT2 + i[:2])
344 else:
345 self.write(BININT + i)
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000346 return
Tim Peters44714002001-04-10 05:02:52 +0000347 # Text pickle, or int too big to fit in signed 4-byte format.
348 self.write(INT + `object` + '\n')
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000349 dispatch[IntType] = save_int
350
351 def save_long(self, object):
352 self.write(LONG + `object` + '\n')
353 dispatch[LongType] = save_long
354
Guido van Rossumd3703791998-10-22 20:15:36 +0000355 def save_float(self, object, pack=struct.pack):
356 if self.bin:
357 self.write(BINFLOAT + pack('>d', object))
358 else:
359 self.write(FLOAT + `object` + '\n')
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000360 dispatch[FloatType] = save_float
361
362 def save_string(self, object):
Tim Petersc32d8242001-04-10 02:48:53 +0000363 if self.bin:
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000364 l = len(object)
365 s = mdumps(l)[1:]
Tim Petersc32d8242001-04-10 02:48:53 +0000366 if l < 256:
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000367 self.write(SHORT_BINSTRING + s[0] + object)
368 else:
369 self.write(BINSTRING + s + object)
370 else:
371 self.write(STRING + `object` + '\n')
Jeremy Hylton3422c992003-01-24 19:29:52 +0000372 self.memoize(object)
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000373 dispatch[StringType] = save_string
374
Guido van Rossumb5f2f1b2000-03-10 23:20:09 +0000375 def save_unicode(self, object):
Tim Petersc32d8242001-04-10 02:48:53 +0000376 if self.bin:
Guido van Rossumb5f2f1b2000-03-10 23:20:09 +0000377 encoding = object.encode('utf-8')
378 l = len(encoding)
379 s = mdumps(l)[1:]
380 self.write(BINUNICODE + s + encoding)
381 else:
Guido van Rossumdbb718f2001-09-21 19:22:34 +0000382 object = object.replace("\\", "\\u005c")
383 object = object.replace("\n", "\\u000a")
Guido van Rossumb5f2f1b2000-03-10 23:20:09 +0000384 self.write(UNICODE + object.encode('raw-unicode-escape') + '\n')
Jeremy Hylton3422c992003-01-24 19:29:52 +0000385 self.memoize(object)
Guido van Rossumb5f2f1b2000-03-10 23:20:09 +0000386 dispatch[UnicodeType] = save_unicode
387
Guido van Rossum31584cb2001-01-22 14:53:29 +0000388 if StringType == UnicodeType:
389 # This is true for Jython
390 def save_string(self, object):
Guido van Rossum31584cb2001-01-22 14:53:29 +0000391 unicode = object.isunicode()
392
Tim Petersc32d8242001-04-10 02:48:53 +0000393 if self.bin:
Guido van Rossum31584cb2001-01-22 14:53:29 +0000394 if unicode:
395 object = object.encode("utf-8")
396 l = len(object)
397 s = mdumps(l)[1:]
Tim Petersc32d8242001-04-10 02:48:53 +0000398 if l < 256 and not unicode:
Guido van Rossum31584cb2001-01-22 14:53:29 +0000399 self.write(SHORT_BINSTRING + s[0] + object)
400 else:
401 if unicode:
402 self.write(BINUNICODE + s + object)
403 else:
404 self.write(BINSTRING + s + object)
405 else:
Tim Peters658cba62001-02-09 20:06:00 +0000406 if unicode:
Guido van Rossumdbb718f2001-09-21 19:22:34 +0000407 object = object.replace("\\", "\\u005c")
408 object = object.replace("\n", "\\u000a")
Guido van Rossum31584cb2001-01-22 14:53:29 +0000409 object = object.encode('raw-unicode-escape')
410 self.write(UNICODE + object + '\n')
411 else:
412 self.write(STRING + `object` + '\n')
Jeremy Hylton3422c992003-01-24 19:29:52 +0000413 self.memoize(object)
Guido van Rossum31584cb2001-01-22 14:53:29 +0000414 dispatch[StringType] = save_string
Tim Peters658cba62001-02-09 20:06:00 +0000415
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000416 def save_tuple(self, object):
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000417 write = self.write
418 save = self.save
419 memo = self.memo
420
421 d = id(object)
422
423 write(MARK)
424
425 for element in object:
426 save(element)
427
Raymond Hettinger54f02222002-06-01 14:18:47 +0000428 if len(object) and d in memo:
Tim Petersc32d8242001-04-10 02:48:53 +0000429 if self.bin:
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000430 write(POP_MARK + self.get(memo[d][0]))
431 return
Tim Peters2344fae2001-01-15 00:50:52 +0000432
Guido van Rossum599174f1998-03-31 16:30:28 +0000433 write(POP * (len(object) + 1) + self.get(memo[d][0]))
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000434 return
435
436 memo_len = len(memo)
437 self.write(TUPLE + self.put(memo_len))
438 memo[d] = (memo_len, object)
Jeremy Hylton3422c992003-01-24 19:29:52 +0000439
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000440 dispatch[TupleType] = save_tuple
441
442 def save_empty_tuple(self, object):
443 self.write(EMPTY_TUPLE)
444
445 def save_list(self, object):
446 d = id(object)
447
448 write = self.write
449 save = self.save
450 memo = self.memo
451
Tim Petersc32d8242001-04-10 02:48:53 +0000452 if self.bin:
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000453 write(EMPTY_LIST)
454 else:
455 write(MARK + LIST)
456
Jeremy Hylton3422c992003-01-24 19:29:52 +0000457 self.memoize(object)
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000458
459 using_appends = (self.bin and (len(object) > 1))
460
Tim Petersc32d8242001-04-10 02:48:53 +0000461 if using_appends:
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000462 write(MARK)
463
464 for element in object:
465 save(element)
Tim Peters2344fae2001-01-15 00:50:52 +0000466
Tim Petersc32d8242001-04-10 02:48:53 +0000467 if not using_appends:
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000468 write(APPEND)
469
Tim Petersc32d8242001-04-10 02:48:53 +0000470 if using_appends:
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000471 write(APPENDS)
472 dispatch[ListType] = save_list
473
474 def save_dict(self, object):
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000475 write = self.write
476 save = self.save
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000477
Tim Petersc32d8242001-04-10 02:48:53 +0000478 if self.bin:
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000479 write(EMPTY_DICT)
480 else:
481 write(MARK + DICT)
482
Jeremy Hylton3422c992003-01-24 19:29:52 +0000483 self.memoize(object)
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000484
485 using_setitems = (self.bin and (len(object) > 1))
486
Tim Petersc32d8242001-04-10 02:48:53 +0000487 if using_setitems:
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000488 write(MARK)
489
490 items = object.items()
491 for key, value in items:
492 save(key)
493 save(value)
494
Tim Petersc32d8242001-04-10 02:48:53 +0000495 if not using_setitems:
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000496 write(SETITEM)
497
Tim Petersc32d8242001-04-10 02:48:53 +0000498 if using_setitems:
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000499 write(SETITEMS)
500
501 dispatch[DictionaryType] = save_dict
Jeremy Hylton2b9d0291998-05-27 22:38:22 +0000502 if not PyStringMap is None:
503 dispatch[PyStringMap] = save_dict
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000504
505 def save_inst(self, object):
506 d = id(object)
507 cls = object.__class__
508
509 memo = self.memo
510 write = self.write
511 save = self.save
512
513 if hasattr(object, '__getinitargs__'):
514 args = object.__getinitargs__()
515 len(args) # XXX Assert it's a sequence
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000516 _keep_alive(args, memo)
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000517 else:
518 args = ()
519
520 write(MARK)
521
Tim Petersc32d8242001-04-10 02:48:53 +0000522 if self.bin:
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000523 save(cls)
524
525 for arg in args:
526 save(arg)
527
Jeremy Hylton3422c992003-01-24 19:29:52 +0000528 # This method does not use memoize() so that it can handle
529 # the special case for non-binary mode.
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000530 memo_len = len(memo)
Tim Petersc32d8242001-04-10 02:48:53 +0000531 if self.bin:
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000532 write(OBJ + self.put(memo_len))
533 else:
Guido van Rossum4fb5b281997-09-12 20:07:24 +0000534 write(INST + cls.__module__ + '\n' + cls.__name__ + '\n' +
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000535 self.put(memo_len))
536
537 memo[d] = (memo_len, object)
538
539 try:
540 getstate = object.__getstate__
541 except AttributeError:
542 stuff = object.__dict__
543 else:
544 stuff = getstate()
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000545 _keep_alive(stuff, memo)
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000546 save(stuff)
547 write(BUILD)
548 dispatch[InstanceType] = save_inst
549
550 def save_global(self, object, name = None):
551 write = self.write
552 memo = self.memo
553
Tim Petersc32d8242001-04-10 02:48:53 +0000554 if name is None:
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000555 name = object.__name__
556
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000557 try:
558 module = object.__module__
559 except AttributeError:
560 module = whichmodule(object, name)
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000561
Guido van Rossumb0a98e92001-08-17 18:49:52 +0000562 try:
563 __import__(module)
564 mod = sys.modules[module]
565 klass = getattr(mod, name)
566 except (ImportError, KeyError, AttributeError):
567 raise PicklingError(
568 "Can't pickle %r: it's not found as %s.%s" %
569 (object, module, name))
570 else:
571 if klass is not object:
572 raise PicklingError(
573 "Can't pickle %r: it's not the same object as %s.%s" %
574 (object, module, name))
575
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000576 memo_len = len(memo)
577 write(GLOBAL + module + '\n' + name + '\n' +
578 self.put(memo_len))
579 memo[id(object)] = (memo_len, object)
580 dispatch[ClassType] = save_global
581 dispatch[FunctionType] = save_global
582 dispatch[BuiltinFunctionType] = save_global
Tim Peters6d6c1a32001-08-02 04:15:00 +0000583 dispatch[TypeType] = save_global
Guido van Rossum0c891ce1995-03-14 15:09:05 +0000584
Guido van Rossuma48061a1995-01-10 00:31:14 +0000585
Guido van Rossum5ed5c4c1997-09-03 00:23:54 +0000586def _keep_alive(x, memo):
587 """Keeps a reference to the object x in the memo.
588
589 Because we remember objects by their id, we have
590 to assure that possibly temporary objects are kept
591 alive by referencing them.
592 We store a reference at the id of the memo, which should
593 normally not be used unless someone tries to deepcopy
594 the memo itself...
595 """
596 try:
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000597 memo[id(memo)].append(x)
Guido van Rossum5ed5c4c1997-09-03 00:23:54 +0000598 except KeyError:
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000599 # aha, this is the first one :-)
600 memo[id(memo)]=[x]
Guido van Rossum5ed5c4c1997-09-03 00:23:54 +0000601
602
Jeremy Hyltonf0cfdf72002-09-19 23:00:12 +0000603classmap = {} # called classmap for backwards compatibility
Guido van Rossuma48061a1995-01-10 00:31:14 +0000604
Jeremy Hyltonf0cfdf72002-09-19 23:00:12 +0000605def whichmodule(func, funcname):
606 """Figure out the module in which a function occurs.
Guido van Rossuma48061a1995-01-10 00:31:14 +0000607
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000608 Search sys.modules for the module.
609 Cache in classmap.
610 Return a module name.
Jeremy Hyltonf0cfdf72002-09-19 23:00:12 +0000611 If the function cannot be found, return __main__.
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000612 """
Jeremy Hyltonf0cfdf72002-09-19 23:00:12 +0000613 if func in classmap:
614 return classmap[func]
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000615
616 for name, module in sys.modules.items():
Jeremy Hyltonf0cfdf72002-09-19 23:00:12 +0000617 if module is None:
Jeremy Hylton065a5ab2002-09-19 22:57:26 +0000618 continue # skip dummy package entries
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000619 if name != '__main__' and \
Jeremy Hyltonf0cfdf72002-09-19 23:00:12 +0000620 hasattr(module, funcname) and \
621 getattr(module, funcname) is func:
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000622 break
623 else:
624 name = '__main__'
Jeremy Hyltonf0cfdf72002-09-19 23:00:12 +0000625 classmap[func] = name
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000626 return name
Guido van Rossuma48061a1995-01-10 00:31:14 +0000627
628
629class Unpickler:
630
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000631 def __init__(self, file):
Raymond Hettingeraef22fb2002-05-29 16:18:42 +0000632 """This takes a file-like object for reading a pickle data stream.
633
634 This class automatically determines whether the data stream was
635 written in binary mode or not, so it does not need a flag as in
636 the Pickler class factory.
637
638 The file-like object must have two methods, a read() method that
639 takes an integer argument, and a readline() method that requires no
640 arguments. Both methods should return a string. Thus file-like
641 object can be a file object opened for reading, a StringIO object,
642 or any other custom object that meets this interface.
643
644 """
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000645 self.readline = file.readline
646 self.read = file.read
647 self.memo = {}
Guido van Rossuma48061a1995-01-10 00:31:14 +0000648
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000649 def load(self):
Raymond Hettingeraef22fb2002-05-29 16:18:42 +0000650 """Read a pickled object representation from the open file object.
651
652 Return the reconstituted object hierarchy specified in the file
653 object.
654
655 """
Jeremy Hylton20747fa2001-11-09 16:15:04 +0000656 self.mark = object() # any new unique object
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000657 self.stack = []
658 self.append = self.stack.append
659 read = self.read
660 dispatch = self.dispatch
661 try:
662 while 1:
663 key = read(1)
664 dispatch[key](self)
Guido van Rossumff871742000-12-13 18:11:56 +0000665 except _Stop, stopinst:
666 return stopinst.value
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000667
668 def marker(self):
669 stack = self.stack
670 mark = self.mark
671 k = len(stack)-1
672 while stack[k] is not mark: k = k-1
673 return k
674
675 dispatch = {}
676
677 def load_eof(self):
678 raise EOFError
679 dispatch[''] = load_eof
680
681 def load_persid(self):
682 pid = self.readline()[:-1]
683 self.append(self.persistent_load(pid))
684 dispatch[PERSID] = load_persid
685
686 def load_binpersid(self):
Raymond Hettinger46ac8eb2002-06-30 03:39:14 +0000687 pid = self.stack.pop()
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000688 self.append(self.persistent_load(pid))
689 dispatch[BINPERSID] = load_binpersid
690
691 def load_none(self):
692 self.append(None)
693 dispatch[NONE] = load_none
694
695 def load_int(self):
Tim Peters19ef62d2001-08-28 22:21:18 +0000696 data = self.readline()
Guido van Rossume2763392002-04-05 19:30:08 +0000697 if data == FALSE[1:]:
698 val = False
699 elif data == TRUE[1:]:
700 val = True
701 else:
702 try:
703 val = int(data)
704 except ValueError:
705 val = long(data)
706 self.append(val)
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000707 dispatch[INT] = load_int
708
709 def load_binint(self):
710 self.append(mloads('i' + self.read(4)))
711 dispatch[BININT] = load_binint
712
713 def load_binint1(self):
714 self.append(mloads('i' + self.read(1) + '\000\000\000'))
715 dispatch[BININT1] = load_binint1
716
717 def load_binint2(self):
718 self.append(mloads('i' + self.read(2) + '\000\000'))
719 dispatch[BININT2] = load_binint2
Tim Peters2344fae2001-01-15 00:50:52 +0000720
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000721 def load_long(self):
Guido van Rossumff871742000-12-13 18:11:56 +0000722 self.append(long(self.readline()[:-1], 0))
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000723 dispatch[LONG] = load_long
724
725 def load_float(self):
Guido van Rossumff871742000-12-13 18:11:56 +0000726 self.append(float(self.readline()[:-1]))
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000727 dispatch[FLOAT] = load_float
728
Guido van Rossumd3703791998-10-22 20:15:36 +0000729 def load_binfloat(self, unpack=struct.unpack):
730 self.append(unpack('>d', self.read(8))[0])
731 dispatch[BINFLOAT] = load_binfloat
732
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000733 def load_string(self):
Jeremy Hyltonbe467e52000-09-15 15:14:51 +0000734 rep = self.readline()[:-1]
Martin v. Löwis8a8da792002-08-14 07:46:28 +0000735 for q in _quotes:
736 if rep.startswith(q):
737 if not rep.endswith(q):
738 raise ValueError, "insecure string pickle"
739 rep = rep[len(q):-len(q)]
740 break
741 else:
Jeremy Hyltonbe467e52000-09-15 15:14:51 +0000742 raise ValueError, "insecure string pickle"
Martin v. Löwis8a8da792002-08-14 07:46:28 +0000743 self.append(rep.decode("string-escape"))
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000744 dispatch[STRING] = load_string
745
Jeremy Hyltonbe467e52000-09-15 15:14:51 +0000746 def _is_string_secure(self, s):
747 """Return true if s contains a string that is safe to eval
748
749 The definition of secure string is based on the implementation
750 in cPickle. s is secure as long as it only contains a quoted
751 string and optional trailing whitespace.
752 """
753 q = s[0]
754 if q not in ("'", '"'):
755 return 0
756 # find the closing quote
757 offset = 1
758 i = None
759 while 1:
760 try:
761 i = s.index(q, offset)
762 except ValueError:
763 # if there is an error the first time, there is no
764 # close quote
765 if offset == 1:
766 return 0
767 if s[i-1] != '\\':
768 break
769 # check to see if this one is escaped
770 nslash = 0
771 j = i - 1
772 while j >= offset and s[j] == '\\':
773 j = j - 1
774 nslash = nslash + 1
775 if nslash % 2 == 0:
776 break
777 offset = i + 1
778 for c in s[i+1:]:
779 if ord(c) > 32:
780 return 0
781 return 1
782
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000783 def load_binstring(self):
784 len = mloads('i' + self.read(4))
785 self.append(self.read(len))
786 dispatch[BINSTRING] = load_binstring
787
Guido van Rossumb5f2f1b2000-03-10 23:20:09 +0000788 def load_unicode(self):
789 self.append(unicode(self.readline()[:-1],'raw-unicode-escape'))
790 dispatch[UNICODE] = load_unicode
791
792 def load_binunicode(self):
793 len = mloads('i' + self.read(4))
794 self.append(unicode(self.read(len),'utf-8'))
795 dispatch[BINUNICODE] = load_binunicode
796
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000797 def load_short_binstring(self):
798 len = mloads('i' + self.read(1) + '\000\000\000')
799 self.append(self.read(len))
800 dispatch[SHORT_BINSTRING] = load_short_binstring
801
802 def load_tuple(self):
803 k = self.marker()
804 self.stack[k:] = [tuple(self.stack[k+1:])]
805 dispatch[TUPLE] = load_tuple
806
807 def load_empty_tuple(self):
808 self.stack.append(())
809 dispatch[EMPTY_TUPLE] = load_empty_tuple
810
811 def load_empty_list(self):
812 self.stack.append([])
813 dispatch[EMPTY_LIST] = load_empty_list
814
815 def load_empty_dictionary(self):
816 self.stack.append({})
817 dispatch[EMPTY_DICT] = load_empty_dictionary
818
819 def load_list(self):
820 k = self.marker()
821 self.stack[k:] = [self.stack[k+1:]]
822 dispatch[LIST] = load_list
823
824 def load_dict(self):
825 k = self.marker()
826 d = {}
827 items = self.stack[k+1:]
828 for i in range(0, len(items), 2):
829 key = items[i]
830 value = items[i+1]
831 d[key] = value
832 self.stack[k:] = [d]
833 dispatch[DICT] = load_dict
834
835 def load_inst(self):
836 k = self.marker()
837 args = tuple(self.stack[k+1:])
838 del self.stack[k:]
839 module = self.readline()[:-1]
840 name = self.readline()[:-1]
841 klass = self.find_class(module, name)
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000842 instantiated = 0
843 if (not args and type(klass) is ClassType and
844 not hasattr(klass, "__getinitargs__")):
845 try:
846 value = _EmptyClass()
847 value.__class__ = klass
Guido van Rossumb19e2a31998-04-13 18:08:45 +0000848 instantiated = 1
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000849 except RuntimeError:
850 # In restricted execution, assignment to inst.__class__ is
851 # prohibited
852 pass
853 if not instantiated:
Guido van Rossum743d17e1998-09-15 20:25:57 +0000854 try:
Barry Warsawbf4d9592001-11-15 23:42:58 +0000855 if not hasattr(klass, '__safe_for_unpickling__'):
856 raise UnpicklingError('%s is not safe for unpickling' %
857 klass)
Guido van Rossum743d17e1998-09-15 20:25:57 +0000858 value = apply(klass, args)
859 except TypeError, err:
860 raise TypeError, "in constructor for %s: %s" % (
861 klass.__name__, str(err)), sys.exc_info()[2]
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000862 self.append(value)
863 dispatch[INST] = load_inst
864
865 def load_obj(self):
866 stack = self.stack
867 k = self.marker()
868 klass = stack[k + 1]
869 del stack[k + 1]
Tim Peters2344fae2001-01-15 00:50:52 +0000870 args = tuple(stack[k + 1:])
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000871 del stack[k:]
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000872 instantiated = 0
873 if (not args and type(klass) is ClassType and
874 not hasattr(klass, "__getinitargs__")):
875 try:
876 value = _EmptyClass()
877 value.__class__ = klass
878 instantiated = 1
879 except RuntimeError:
880 # In restricted execution, assignment to inst.__class__ is
881 # prohibited
882 pass
883 if not instantiated:
884 value = apply(klass, args)
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000885 self.append(value)
Tim Peters2344fae2001-01-15 00:50:52 +0000886 dispatch[OBJ] = load_obj
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000887
888 def load_global(self):
889 module = self.readline()[:-1]
890 name = self.readline()[:-1]
891 klass = self.find_class(module, name)
892 self.append(klass)
893 dispatch[GLOBAL] = load_global
894
895 def find_class(self, module, name):
Barry Warsawbf4d9592001-11-15 23:42:58 +0000896 __import__(module)
897 mod = sys.modules[module]
898 klass = getattr(mod, name)
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000899 return klass
900
901 def load_reduce(self):
902 stack = self.stack
903
904 callable = stack[-2]
905 arg_tup = stack[-1]
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000906 del stack[-2:]
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000907
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000908 if type(callable) is not ClassType:
Raymond Hettinger54f02222002-06-01 14:18:47 +0000909 if not callable in safe_constructors:
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000910 try:
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000911 safe = callable.__safe_for_unpickling__
912 except AttributeError:
913 safe = None
Guido van Rossuma48061a1995-01-10 00:31:14 +0000914
Tim Petersc32d8242001-04-10 02:48:53 +0000915 if not safe:
Tim Peters2344fae2001-01-15 00:50:52 +0000916 raise UnpicklingError, "%s is not safe for " \
917 "unpickling" % callable
Guido van Rossuma48061a1995-01-10 00:31:14 +0000918
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000919 if arg_tup is None:
Raymond Hettinger97394bc2002-05-21 17:22:02 +0000920 import warnings
921 warnings.warn("The None return argument form of __reduce__ is "
922 "deprecated. Return a tuple of arguments instead.",
Tim Peters8ac14952002-05-23 15:15:30 +0000923 DeprecationWarning)
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000924 value = callable.__basicnew__()
925 else:
926 value = apply(callable, arg_tup)
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000927 self.append(value)
928 dispatch[REDUCE] = load_reduce
Guido van Rossuma48061a1995-01-10 00:31:14 +0000929
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000930 def load_pop(self):
931 del self.stack[-1]
932 dispatch[POP] = load_pop
Guido van Rossum7b5430f1995-03-04 22:25:21 +0000933
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000934 def load_pop_mark(self):
935 k = self.marker()
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000936 del self.stack[k:]
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000937 dispatch[POP_MARK] = load_pop_mark
Guido van Rossuma48061a1995-01-10 00:31:14 +0000938
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000939 def load_dup(self):
Guido van Rossumb1062fc1998-03-31 17:00:46 +0000940 self.append(self.stack[-1])
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000941 dispatch[DUP] = load_dup
Guido van Rossuma48061a1995-01-10 00:31:14 +0000942
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000943 def load_get(self):
944 self.append(self.memo[self.readline()[:-1]])
945 dispatch[GET] = load_get
Guido van Rossum78536471996-04-12 13:36:27 +0000946
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000947 def load_binget(self):
948 i = mloads('i' + self.read(1) + '\000\000\000')
949 self.append(self.memo[`i`])
950 dispatch[BINGET] = load_binget
Guido van Rossum78536471996-04-12 13:36:27 +0000951
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000952 def load_long_binget(self):
953 i = mloads('i' + self.read(4))
954 self.append(self.memo[`i`])
955 dispatch[LONG_BINGET] = load_long_binget
Guido van Rossum78536471996-04-12 13:36:27 +0000956
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000957 def load_put(self):
958 self.memo[self.readline()[:-1]] = self.stack[-1]
959 dispatch[PUT] = load_put
Guido van Rossuma48061a1995-01-10 00:31:14 +0000960
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000961 def load_binput(self):
962 i = mloads('i' + self.read(1) + '\000\000\000')
963 self.memo[`i`] = self.stack[-1]
964 dispatch[BINPUT] = load_binput
Guido van Rossuma48061a1995-01-10 00:31:14 +0000965
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000966 def load_long_binput(self):
967 i = mloads('i' + self.read(4))
968 self.memo[`i`] = self.stack[-1]
969 dispatch[LONG_BINPUT] = load_long_binput
Guido van Rossuma48061a1995-01-10 00:31:14 +0000970
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000971 def load_append(self):
972 stack = self.stack
Raymond Hettinger46ac8eb2002-06-30 03:39:14 +0000973 value = stack.pop()
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000974 list = stack[-1]
975 list.append(value)
976 dispatch[APPEND] = load_append
Guido van Rossuma48061a1995-01-10 00:31:14 +0000977
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000978 def load_appends(self):
979 stack = self.stack
980 mark = self.marker()
981 list = stack[mark - 1]
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000982 for i in range(mark + 1, len(stack)):
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000983 list.append(stack[i])
Guido van Rossum0c891ce1995-03-14 15:09:05 +0000984
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000985 del stack[mark:]
986 dispatch[APPENDS] = load_appends
Tim Peters2344fae2001-01-15 00:50:52 +0000987
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000988 def load_setitem(self):
989 stack = self.stack
Raymond Hettinger46ac8eb2002-06-30 03:39:14 +0000990 value = stack.pop()
991 key = stack.pop()
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000992 dict = stack[-1]
993 dict[key] = value
994 dispatch[SETITEM] = load_setitem
Guido van Rossum0c891ce1995-03-14 15:09:05 +0000995
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000996 def load_setitems(self):
997 stack = self.stack
998 mark = self.marker()
999 dict = stack[mark - 1]
Guido van Rossum45e2fbc1998-03-26 21:13:24 +00001000 for i in range(mark + 1, len(stack), 2):
Guido van Rossumb72cf2d1997-04-09 17:32:51 +00001001 dict[stack[i]] = stack[i + 1]
Guido van Rossuma48061a1995-01-10 00:31:14 +00001002
Guido van Rossumb72cf2d1997-04-09 17:32:51 +00001003 del stack[mark:]
1004 dispatch[SETITEMS] = load_setitems
Guido van Rossuma48061a1995-01-10 00:31:14 +00001005
Guido van Rossumb72cf2d1997-04-09 17:32:51 +00001006 def load_build(self):
1007 stack = self.stack
Raymond Hettinger46ac8eb2002-06-30 03:39:14 +00001008 value = stack.pop()
Guido van Rossumb72cf2d1997-04-09 17:32:51 +00001009 inst = stack[-1]
1010 try:
1011 setstate = inst.__setstate__
1012 except AttributeError:
Guido van Rossum45e2fbc1998-03-26 21:13:24 +00001013 try:
1014 inst.__dict__.update(value)
1015 except RuntimeError:
1016 # XXX In restricted execution, the instance's __dict__ is not
1017 # accessible. Use the old way of unpickling the instance
1018 # variables. This is a semantic different when unpickling in
1019 # restricted vs. unrestricted modes.
1020 for k, v in value.items():
1021 setattr(inst, k, v)
Guido van Rossumb72cf2d1997-04-09 17:32:51 +00001022 else:
1023 setstate(value)
1024 dispatch[BUILD] = load_build
Guido van Rossuma48061a1995-01-10 00:31:14 +00001025
Guido van Rossumb72cf2d1997-04-09 17:32:51 +00001026 def load_mark(self):
1027 self.append(self.mark)
1028 dispatch[MARK] = load_mark
Guido van Rossuma48061a1995-01-10 00:31:14 +00001029
Guido van Rossumb72cf2d1997-04-09 17:32:51 +00001030 def load_stop(self):
Raymond Hettinger46ac8eb2002-06-30 03:39:14 +00001031 value = self.stack.pop()
Guido van Rossumff871742000-12-13 18:11:56 +00001032 raise _Stop(value)
Guido van Rossumb72cf2d1997-04-09 17:32:51 +00001033 dispatch[STOP] = load_stop
Guido van Rossuma48061a1995-01-10 00:31:14 +00001034
Guido van Rossume467be61997-12-05 19:42:42 +00001035# Helper class for load_inst/load_obj
1036
1037class _EmptyClass:
1038 pass
Guido van Rossuma48061a1995-01-10 00:31:14 +00001039
Guido van Rossum0c891ce1995-03-14 15:09:05 +00001040# Shorthands
1041
Jeremy Hyltonabe2c622001-10-15 21:29:28 +00001042try:
1043 from cStringIO import StringIO
1044except ImportError:
1045 from StringIO import StringIO
Guido van Rossumc7c5e691996-07-22 22:26:07 +00001046
Guido van Rossumb72cf2d1997-04-09 17:32:51 +00001047def dump(object, file, bin = 0):
1048 Pickler(file, bin).dump(object)
Guido van Rossum0c891ce1995-03-14 15:09:05 +00001049
Guido van Rossumb72cf2d1997-04-09 17:32:51 +00001050def dumps(object, bin = 0):
1051 file = StringIO()
1052 Pickler(file, bin).dump(object)
1053 return file.getvalue()
Guido van Rossum0c891ce1995-03-14 15:09:05 +00001054
1055def load(file):
Guido van Rossumb72cf2d1997-04-09 17:32:51 +00001056 return Unpickler(file).load()
Guido van Rossum0c891ce1995-03-14 15:09:05 +00001057
1058def loads(str):
Guido van Rossumb72cf2d1997-04-09 17:32:51 +00001059 file = StringIO(str)
1060 return Unpickler(file).load()