blob: 4bc54ec5f9de96f222f502430d3df4ffb6567307 [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
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000170 def put(self, i):
Tim Petersc32d8242001-04-10 02:48:53 +0000171 if self.bin:
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000172 s = mdumps(i)[1:]
Tim Petersc32d8242001-04-10 02:48:53 +0000173 if i < 256:
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000174 return BINPUT + s[0]
Guido van Rossuma48061a1995-01-10 00:31:14 +0000175
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000176 return LONG_BINPUT + s
Guido van Rossuma48061a1995-01-10 00:31:14 +0000177
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000178 return PUT + `i` + '\n'
Guido van Rossuma48061a1995-01-10 00:31:14 +0000179
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000180 def get(self, i):
Tim Petersc32d8242001-04-10 02:48:53 +0000181 if self.bin:
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000182 s = mdumps(i)[1:]
Guido van Rossuma48061a1995-01-10 00:31:14 +0000183
Tim Petersc32d8242001-04-10 02:48:53 +0000184 if i < 256:
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000185 return BINGET + s[0]
Guido van Rossuma48061a1995-01-10 00:31:14 +0000186
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000187 return LONG_BINGET + s
Guido van Rossuma48061a1995-01-10 00:31:14 +0000188
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000189 return GET + `i` + '\n'
Tim Peters2344fae2001-01-15 00:50:52 +0000190
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000191 def save(self, object, pers_save = 0):
192 memo = self.memo
Guido van Rossuma48061a1995-01-10 00:31:14 +0000193
Tim Petersc32d8242001-04-10 02:48:53 +0000194 if not pers_save:
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000195 pid = self.persistent_id(object)
Tim Petersc32d8242001-04-10 02:48:53 +0000196 if pid is not None:
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000197 self.save_pers(pid)
198 return
Guido van Rossuma48061a1995-01-10 00:31:14 +0000199
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000200 d = id(object)
Tim Peters2344fae2001-01-15 00:50:52 +0000201
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000202 t = type(object)
Guido van Rossuma48061a1995-01-10 00:31:14 +0000203
Tim Petersc32d8242001-04-10 02:48:53 +0000204 if (t is TupleType) and (len(object) == 0):
205 if self.bin:
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000206 self.save_empty_tuple(object)
207 else:
208 self.save_tuple(object)
209 return
Guido van Rossuma48061a1995-01-10 00:31:14 +0000210
Raymond Hettinger54f02222002-06-01 14:18:47 +0000211 if d in memo:
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000212 self.write(self.get(memo[d][0]))
213 return
214
215 try:
216 f = self.dispatch[t]
217 except KeyError:
Jeremy Hylton39c61162002-07-16 19:47:43 +0000218 pid = self.inst_persistent_id(object)
219 if pid is not None:
220 self.save_pers(pid)
221 return
222
Guido van Rossum85ee4912002-03-26 00:51:56 +0000223 try:
224 issc = issubclass(t, TypeType)
225 except TypeError: # t is not a class
226 issc = 0
227 if issc:
Guido van Rossumf048a8f2001-12-19 16:55:02 +0000228 self.save_global(object)
229 return
230
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000231 try:
232 reduce = dispatch_table[t]
233 except KeyError:
234 try:
235 reduce = object.__reduce__
236 except AttributeError:
237 raise PicklingError, \
Guido van Rossum08a92cb1999-10-10 21:14:25 +0000238 "can't pickle %s object: %s" % (`t.__name__`,
239 `object`)
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000240 else:
241 tup = reduce()
242 else:
243 tup = reduce(object)
244
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000245 if type(tup) is StringType:
246 self.save_global(object, tup)
247 return
Guido van Rossumd1f49841997-12-10 23:40:18 +0000248
Tim Petersc32d8242001-04-10 02:48:53 +0000249 if type(tup) is not TupleType:
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000250 raise PicklingError, "Value returned by %s must be a " \
251 "tuple" % reduce
252
253 l = len(tup)
Tim Peters2344fae2001-01-15 00:50:52 +0000254
Tim Petersc32d8242001-04-10 02:48:53 +0000255 if (l != 2) and (l != 3):
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000256 raise PicklingError, "tuple returned by %s must contain " \
257 "only two or three elements" % reduce
258
259 callable = tup[0]
260 arg_tup = tup[1]
Tim Peters2344fae2001-01-15 00:50:52 +0000261
Tim Petersc32d8242001-04-10 02:48:53 +0000262 if l > 2:
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000263 state = tup[2]
264 else:
265 state = None
266
Guido van Rossumd1f49841997-12-10 23:40:18 +0000267 if type(arg_tup) is not TupleType and arg_tup is not None:
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000268 raise PicklingError, "Second element of tuple returned " \
269 "by %s must be a tuple" % reduce
270
Tim Peters2344fae2001-01-15 00:50:52 +0000271 self.save_reduce(callable, arg_tup, state)
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000272 memo_len = len(memo)
273 self.write(self.put(memo_len))
274 memo[d] = (memo_len, object)
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000275 return
276
277 f(self, object)
278
279 def persistent_id(self, object):
280 return None
281
282 def inst_persistent_id(self, object):
283 return None
284
285 def save_pers(self, pid):
Tim Petersc32d8242001-04-10 02:48:53 +0000286 if not self.bin:
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000287 self.write(PERSID + str(pid) + '\n')
288 else:
289 self.save(pid, 1)
290 self.write(BINPERSID)
291
292 def save_reduce(self, callable, arg_tup, state = None):
293 write = self.write
294 save = self.save
295
296 save(callable)
297 save(arg_tup)
298 write(REDUCE)
Tim Peters2344fae2001-01-15 00:50:52 +0000299
Tim Petersc32d8242001-04-10 02:48:53 +0000300 if state is not None:
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000301 save(state)
302 write(BUILD)
303
304 dispatch = {}
305
306 def save_none(self, object):
307 self.write(NONE)
308 dispatch[NoneType] = save_none
309
Guido van Rossum77f6a652002-04-03 22:41:51 +0000310 def save_bool(self, object):
311 if object:
312 self.write(TRUE)
313 else:
314 self.write(FALSE)
315 dispatch[bool] = save_bool
316
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000317 def save_int(self, object):
Tim Petersc32d8242001-04-10 02:48:53 +0000318 if self.bin:
Tim Peters44714002001-04-10 05:02:52 +0000319 # If the int is small enough to fit in a signed 4-byte 2's-comp
320 # format, we can store it more efficiently than the general
321 # case.
322 high_bits = object >> 31 # note that Python shift sign-extends
323 if high_bits == 0 or high_bits == -1:
324 # All high bits are copies of bit 2**31, so the value
325 # fits in a 4-byte signed int.
326 i = mdumps(object)[1:]
327 assert len(i) == 4
328 if i[-2:] == '\000\000': # fits in 2-byte unsigned int
329 if i[-3] == '\000': # fits in 1-byte unsigned int
330 self.write(BININT1 + i[0])
331 else:
332 self.write(BININT2 + i[:2])
333 else:
334 self.write(BININT + i)
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000335 return
Tim Peters44714002001-04-10 05:02:52 +0000336 # Text pickle, or int too big to fit in signed 4-byte format.
337 self.write(INT + `object` + '\n')
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000338 dispatch[IntType] = save_int
339
340 def save_long(self, object):
341 self.write(LONG + `object` + '\n')
342 dispatch[LongType] = save_long
343
Guido van Rossumd3703791998-10-22 20:15:36 +0000344 def save_float(self, object, pack=struct.pack):
345 if self.bin:
346 self.write(BINFLOAT + pack('>d', object))
347 else:
348 self.write(FLOAT + `object` + '\n')
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000349 dispatch[FloatType] = save_float
350
351 def save_string(self, object):
352 d = id(object)
353 memo = self.memo
354
Tim Petersc32d8242001-04-10 02:48:53 +0000355 if self.bin:
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000356 l = len(object)
357 s = mdumps(l)[1:]
Tim Petersc32d8242001-04-10 02:48:53 +0000358 if l < 256:
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000359 self.write(SHORT_BINSTRING + s[0] + object)
360 else:
361 self.write(BINSTRING + s + object)
362 else:
363 self.write(STRING + `object` + '\n')
364
365 memo_len = len(memo)
366 self.write(self.put(memo_len))
367 memo[d] = (memo_len, object)
368 dispatch[StringType] = save_string
369
Guido van Rossumb5f2f1b2000-03-10 23:20:09 +0000370 def save_unicode(self, object):
371 d = id(object)
372 memo = self.memo
373
Tim Petersc32d8242001-04-10 02:48:53 +0000374 if self.bin:
Guido van Rossumb5f2f1b2000-03-10 23:20:09 +0000375 encoding = object.encode('utf-8')
376 l = len(encoding)
377 s = mdumps(l)[1:]
378 self.write(BINUNICODE + s + encoding)
379 else:
Guido van Rossumdbb718f2001-09-21 19:22:34 +0000380 object = object.replace("\\", "\\u005c")
381 object = object.replace("\n", "\\u000a")
Guido van Rossumb5f2f1b2000-03-10 23:20:09 +0000382 self.write(UNICODE + object.encode('raw-unicode-escape') + '\n')
383
384 memo_len = len(memo)
385 self.write(self.put(memo_len))
386 memo[d] = (memo_len, object)
387 dispatch[UnicodeType] = save_unicode
388
Guido van Rossum31584cb2001-01-22 14:53:29 +0000389 if StringType == UnicodeType:
390 # This is true for Jython
391 def save_string(self, object):
392 d = id(object)
393 memo = self.memo
394 unicode = object.isunicode()
395
Tim Petersc32d8242001-04-10 02:48:53 +0000396 if self.bin:
Guido van Rossum31584cb2001-01-22 14:53:29 +0000397 if unicode:
398 object = object.encode("utf-8")
399 l = len(object)
400 s = mdumps(l)[1:]
Tim Petersc32d8242001-04-10 02:48:53 +0000401 if l < 256 and not unicode:
Guido van Rossum31584cb2001-01-22 14:53:29 +0000402 self.write(SHORT_BINSTRING + s[0] + object)
403 else:
404 if unicode:
405 self.write(BINUNICODE + s + object)
406 else:
407 self.write(BINSTRING + s + object)
408 else:
Tim Peters658cba62001-02-09 20:06:00 +0000409 if unicode:
Guido van Rossumdbb718f2001-09-21 19:22:34 +0000410 object = object.replace("\\", "\\u005c")
411 object = object.replace("\n", "\\u000a")
Guido van Rossum31584cb2001-01-22 14:53:29 +0000412 object = object.encode('raw-unicode-escape')
413 self.write(UNICODE + object + '\n')
414 else:
415 self.write(STRING + `object` + '\n')
416
417 memo_len = len(memo)
418 self.write(self.put(memo_len))
419 memo[d] = (memo_len, object)
420 dispatch[StringType] = save_string
Tim Peters658cba62001-02-09 20:06:00 +0000421
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000422 def save_tuple(self, object):
423
424 write = self.write
425 save = self.save
426 memo = self.memo
427
428 d = id(object)
429
430 write(MARK)
431
432 for element in object:
433 save(element)
434
Raymond Hettinger54f02222002-06-01 14:18:47 +0000435 if len(object) and d in memo:
Tim Petersc32d8242001-04-10 02:48:53 +0000436 if self.bin:
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000437 write(POP_MARK + self.get(memo[d][0]))
438 return
Tim Peters2344fae2001-01-15 00:50:52 +0000439
Guido van Rossum599174f1998-03-31 16:30:28 +0000440 write(POP * (len(object) + 1) + self.get(memo[d][0]))
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000441 return
442
443 memo_len = len(memo)
444 self.write(TUPLE + self.put(memo_len))
445 memo[d] = (memo_len, object)
446 dispatch[TupleType] = save_tuple
447
448 def save_empty_tuple(self, object):
449 self.write(EMPTY_TUPLE)
450
451 def save_list(self, object):
452 d = id(object)
453
454 write = self.write
455 save = self.save
456 memo = self.memo
457
Tim Petersc32d8242001-04-10 02:48:53 +0000458 if self.bin:
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000459 write(EMPTY_LIST)
460 else:
461 write(MARK + LIST)
462
463 memo_len = len(memo)
464 write(self.put(memo_len))
465 memo[d] = (memo_len, object)
466
467 using_appends = (self.bin and (len(object) > 1))
468
Tim Petersc32d8242001-04-10 02:48:53 +0000469 if using_appends:
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000470 write(MARK)
471
472 for element in object:
473 save(element)
Tim Peters2344fae2001-01-15 00:50:52 +0000474
Tim Petersc32d8242001-04-10 02:48:53 +0000475 if not using_appends:
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000476 write(APPEND)
477
Tim Petersc32d8242001-04-10 02:48:53 +0000478 if using_appends:
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000479 write(APPENDS)
480 dispatch[ListType] = save_list
481
482 def save_dict(self, object):
483 d = id(object)
484
485 write = self.write
486 save = self.save
487 memo = self.memo
488
Tim Petersc32d8242001-04-10 02:48:53 +0000489 if self.bin:
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000490 write(EMPTY_DICT)
491 else:
492 write(MARK + DICT)
493
494 memo_len = len(memo)
495 self.write(self.put(memo_len))
496 memo[d] = (memo_len, object)
497
498 using_setitems = (self.bin and (len(object) > 1))
499
Tim Petersc32d8242001-04-10 02:48:53 +0000500 if using_setitems:
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000501 write(MARK)
502
503 items = object.items()
504 for key, value in items:
505 save(key)
506 save(value)
507
Tim Petersc32d8242001-04-10 02:48:53 +0000508 if not using_setitems:
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000509 write(SETITEM)
510
Tim Petersc32d8242001-04-10 02:48:53 +0000511 if using_setitems:
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000512 write(SETITEMS)
513
514 dispatch[DictionaryType] = save_dict
Jeremy Hylton2b9d0291998-05-27 22:38:22 +0000515 if not PyStringMap is None:
516 dispatch[PyStringMap] = save_dict
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000517
518 def save_inst(self, object):
519 d = id(object)
520 cls = object.__class__
521
522 memo = self.memo
523 write = self.write
524 save = self.save
525
526 if hasattr(object, '__getinitargs__'):
527 args = object.__getinitargs__()
528 len(args) # XXX Assert it's a sequence
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000529 _keep_alive(args, memo)
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000530 else:
531 args = ()
532
533 write(MARK)
534
Tim Petersc32d8242001-04-10 02:48:53 +0000535 if self.bin:
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000536 save(cls)
537
538 for arg in args:
539 save(arg)
540
541 memo_len = len(memo)
Tim Petersc32d8242001-04-10 02:48:53 +0000542 if self.bin:
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000543 write(OBJ + self.put(memo_len))
544 else:
Guido van Rossum4fb5b281997-09-12 20:07:24 +0000545 write(INST + cls.__module__ + '\n' + cls.__name__ + '\n' +
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000546 self.put(memo_len))
547
548 memo[d] = (memo_len, object)
549
550 try:
551 getstate = object.__getstate__
552 except AttributeError:
553 stuff = object.__dict__
554 else:
555 stuff = getstate()
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000556 _keep_alive(stuff, memo)
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000557 save(stuff)
558 write(BUILD)
559 dispatch[InstanceType] = save_inst
560
561 def save_global(self, object, name = None):
562 write = self.write
563 memo = self.memo
564
Tim Petersc32d8242001-04-10 02:48:53 +0000565 if name is None:
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000566 name = object.__name__
567
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000568 try:
569 module = object.__module__
570 except AttributeError:
571 module = whichmodule(object, name)
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000572
Guido van Rossumb0a98e92001-08-17 18:49:52 +0000573 try:
574 __import__(module)
575 mod = sys.modules[module]
576 klass = getattr(mod, name)
577 except (ImportError, KeyError, AttributeError):
578 raise PicklingError(
579 "Can't pickle %r: it's not found as %s.%s" %
580 (object, module, name))
581 else:
582 if klass is not object:
583 raise PicklingError(
584 "Can't pickle %r: it's not the same object as %s.%s" %
585 (object, module, name))
586
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000587 memo_len = len(memo)
588 write(GLOBAL + module + '\n' + name + '\n' +
589 self.put(memo_len))
590 memo[id(object)] = (memo_len, object)
591 dispatch[ClassType] = save_global
592 dispatch[FunctionType] = save_global
593 dispatch[BuiltinFunctionType] = save_global
Tim Peters6d6c1a32001-08-02 04:15:00 +0000594 dispatch[TypeType] = save_global
Guido van Rossum0c891ce1995-03-14 15:09:05 +0000595
Guido van Rossuma48061a1995-01-10 00:31:14 +0000596
Guido van Rossum5ed5c4c1997-09-03 00:23:54 +0000597def _keep_alive(x, memo):
598 """Keeps a reference to the object x in the memo.
599
600 Because we remember objects by their id, we have
601 to assure that possibly temporary objects are kept
602 alive by referencing them.
603 We store a reference at the id of the memo, which should
604 normally not be used unless someone tries to deepcopy
605 the memo itself...
606 """
607 try:
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000608 memo[id(memo)].append(x)
Guido van Rossum5ed5c4c1997-09-03 00:23:54 +0000609 except KeyError:
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000610 # aha, this is the first one :-)
611 memo[id(memo)]=[x]
Guido van Rossum5ed5c4c1997-09-03 00:23:54 +0000612
613
Guido van Rossuma48061a1995-01-10 00:31:14 +0000614classmap = {}
615
Guido van Rossum4fb5b281997-09-12 20:07:24 +0000616# This is no longer used to find classes, but still for functions
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000617def whichmodule(cls, clsname):
618 """Figure out the module in which a class occurs.
Guido van Rossuma48061a1995-01-10 00:31:14 +0000619
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000620 Search sys.modules for the module.
621 Cache in classmap.
622 Return a module name.
623 If the class cannot be found, return __main__.
624 """
Raymond Hettinger54f02222002-06-01 14:18:47 +0000625 if cls in classmap:
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000626 return classmap[cls]
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000627
628 for name, module in sys.modules.items():
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000629 if name != '__main__' and \
630 hasattr(module, clsname) and \
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000631 getattr(module, clsname) is cls:
632 break
633 else:
634 name = '__main__'
635 classmap[cls] = name
636 return name
Guido van Rossuma48061a1995-01-10 00:31:14 +0000637
638
639class Unpickler:
640
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000641 def __init__(self, file):
Raymond Hettingeraef22fb2002-05-29 16:18:42 +0000642 """This takes a file-like object for reading a pickle data stream.
643
644 This class automatically determines whether the data stream was
645 written in binary mode or not, so it does not need a flag as in
646 the Pickler class factory.
647
648 The file-like object must have two methods, a read() method that
649 takes an integer argument, and a readline() method that requires no
650 arguments. Both methods should return a string. Thus file-like
651 object can be a file object opened for reading, a StringIO object,
652 or any other custom object that meets this interface.
653
654 """
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000655 self.readline = file.readline
656 self.read = file.read
657 self.memo = {}
Guido van Rossuma48061a1995-01-10 00:31:14 +0000658
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000659 def load(self):
Raymond Hettingeraef22fb2002-05-29 16:18:42 +0000660 """Read a pickled object representation from the open file object.
661
662 Return the reconstituted object hierarchy specified in the file
663 object.
664
665 """
Jeremy Hylton20747fa2001-11-09 16:15:04 +0000666 self.mark = object() # any new unique object
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000667 self.stack = []
668 self.append = self.stack.append
669 read = self.read
670 dispatch = self.dispatch
671 try:
672 while 1:
673 key = read(1)
674 dispatch[key](self)
Guido van Rossumff871742000-12-13 18:11:56 +0000675 except _Stop, stopinst:
676 return stopinst.value
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000677
678 def marker(self):
679 stack = self.stack
680 mark = self.mark
681 k = len(stack)-1
682 while stack[k] is not mark: k = k-1
683 return k
684
685 dispatch = {}
686
687 def load_eof(self):
688 raise EOFError
689 dispatch[''] = load_eof
690
691 def load_persid(self):
692 pid = self.readline()[:-1]
693 self.append(self.persistent_load(pid))
694 dispatch[PERSID] = load_persid
695
696 def load_binpersid(self):
Raymond Hettinger46ac8eb2002-06-30 03:39:14 +0000697 pid = self.stack.pop()
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000698 self.append(self.persistent_load(pid))
699 dispatch[BINPERSID] = load_binpersid
700
701 def load_none(self):
702 self.append(None)
703 dispatch[NONE] = load_none
704
705 def load_int(self):
Tim Peters19ef62d2001-08-28 22:21:18 +0000706 data = self.readline()
Guido van Rossume2763392002-04-05 19:30:08 +0000707 if data == FALSE[1:]:
708 val = False
709 elif data == TRUE[1:]:
710 val = True
711 else:
712 try:
713 val = int(data)
714 except ValueError:
715 val = long(data)
716 self.append(val)
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000717 dispatch[INT] = load_int
718
719 def load_binint(self):
720 self.append(mloads('i' + self.read(4)))
721 dispatch[BININT] = load_binint
722
723 def load_binint1(self):
724 self.append(mloads('i' + self.read(1) + '\000\000\000'))
725 dispatch[BININT1] = load_binint1
726
727 def load_binint2(self):
728 self.append(mloads('i' + self.read(2) + '\000\000'))
729 dispatch[BININT2] = load_binint2
Tim Peters2344fae2001-01-15 00:50:52 +0000730
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000731 def load_long(self):
Guido van Rossumff871742000-12-13 18:11:56 +0000732 self.append(long(self.readline()[:-1], 0))
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000733 dispatch[LONG] = load_long
734
735 def load_float(self):
Guido van Rossumff871742000-12-13 18:11:56 +0000736 self.append(float(self.readline()[:-1]))
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000737 dispatch[FLOAT] = load_float
738
Guido van Rossumd3703791998-10-22 20:15:36 +0000739 def load_binfloat(self, unpack=struct.unpack):
740 self.append(unpack('>d', self.read(8))[0])
741 dispatch[BINFLOAT] = load_binfloat
742
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000743 def load_string(self):
Jeremy Hyltonbe467e52000-09-15 15:14:51 +0000744 rep = self.readline()[:-1]
Martin v. Löwis8a8da792002-08-14 07:46:28 +0000745 for q in _quotes:
746 if rep.startswith(q):
747 if not rep.endswith(q):
748 raise ValueError, "insecure string pickle"
749 rep = rep[len(q):-len(q)]
750 break
751 else:
Jeremy Hyltonbe467e52000-09-15 15:14:51 +0000752 raise ValueError, "insecure string pickle"
Martin v. Löwis8a8da792002-08-14 07:46:28 +0000753 self.append(rep.decode("string-escape"))
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000754 dispatch[STRING] = load_string
755
Jeremy Hyltonbe467e52000-09-15 15:14:51 +0000756 def _is_string_secure(self, s):
757 """Return true if s contains a string that is safe to eval
758
759 The definition of secure string is based on the implementation
760 in cPickle. s is secure as long as it only contains a quoted
761 string and optional trailing whitespace.
762 """
763 q = s[0]
764 if q not in ("'", '"'):
765 return 0
766 # find the closing quote
767 offset = 1
768 i = None
769 while 1:
770 try:
771 i = s.index(q, offset)
772 except ValueError:
773 # if there is an error the first time, there is no
774 # close quote
775 if offset == 1:
776 return 0
777 if s[i-1] != '\\':
778 break
779 # check to see if this one is escaped
780 nslash = 0
781 j = i - 1
782 while j >= offset and s[j] == '\\':
783 j = j - 1
784 nslash = nslash + 1
785 if nslash % 2 == 0:
786 break
787 offset = i + 1
788 for c in s[i+1:]:
789 if ord(c) > 32:
790 return 0
791 return 1
792
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000793 def load_binstring(self):
794 len = mloads('i' + self.read(4))
795 self.append(self.read(len))
796 dispatch[BINSTRING] = load_binstring
797
Guido van Rossumb5f2f1b2000-03-10 23:20:09 +0000798 def load_unicode(self):
799 self.append(unicode(self.readline()[:-1],'raw-unicode-escape'))
800 dispatch[UNICODE] = load_unicode
801
802 def load_binunicode(self):
803 len = mloads('i' + self.read(4))
804 self.append(unicode(self.read(len),'utf-8'))
805 dispatch[BINUNICODE] = load_binunicode
806
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000807 def load_short_binstring(self):
808 len = mloads('i' + self.read(1) + '\000\000\000')
809 self.append(self.read(len))
810 dispatch[SHORT_BINSTRING] = load_short_binstring
811
812 def load_tuple(self):
813 k = self.marker()
814 self.stack[k:] = [tuple(self.stack[k+1:])]
815 dispatch[TUPLE] = load_tuple
816
817 def load_empty_tuple(self):
818 self.stack.append(())
819 dispatch[EMPTY_TUPLE] = load_empty_tuple
820
821 def load_empty_list(self):
822 self.stack.append([])
823 dispatch[EMPTY_LIST] = load_empty_list
824
825 def load_empty_dictionary(self):
826 self.stack.append({})
827 dispatch[EMPTY_DICT] = load_empty_dictionary
828
829 def load_list(self):
830 k = self.marker()
831 self.stack[k:] = [self.stack[k+1:]]
832 dispatch[LIST] = load_list
833
834 def load_dict(self):
835 k = self.marker()
836 d = {}
837 items = self.stack[k+1:]
838 for i in range(0, len(items), 2):
839 key = items[i]
840 value = items[i+1]
841 d[key] = value
842 self.stack[k:] = [d]
843 dispatch[DICT] = load_dict
844
845 def load_inst(self):
846 k = self.marker()
847 args = tuple(self.stack[k+1:])
848 del self.stack[k:]
849 module = self.readline()[:-1]
850 name = self.readline()[:-1]
851 klass = self.find_class(module, name)
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000852 instantiated = 0
853 if (not args and type(klass) is ClassType and
854 not hasattr(klass, "__getinitargs__")):
855 try:
856 value = _EmptyClass()
857 value.__class__ = klass
Guido van Rossumb19e2a31998-04-13 18:08:45 +0000858 instantiated = 1
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000859 except RuntimeError:
860 # In restricted execution, assignment to inst.__class__ is
861 # prohibited
862 pass
863 if not instantiated:
Guido van Rossum743d17e1998-09-15 20:25:57 +0000864 try:
Barry Warsawbf4d9592001-11-15 23:42:58 +0000865 if not hasattr(klass, '__safe_for_unpickling__'):
866 raise UnpicklingError('%s is not safe for unpickling' %
867 klass)
Guido van Rossum743d17e1998-09-15 20:25:57 +0000868 value = apply(klass, args)
869 except TypeError, err:
870 raise TypeError, "in constructor for %s: %s" % (
871 klass.__name__, str(err)), sys.exc_info()[2]
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000872 self.append(value)
873 dispatch[INST] = load_inst
874
875 def load_obj(self):
876 stack = self.stack
877 k = self.marker()
878 klass = stack[k + 1]
879 del stack[k + 1]
Tim Peters2344fae2001-01-15 00:50:52 +0000880 args = tuple(stack[k + 1:])
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000881 del stack[k:]
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000882 instantiated = 0
883 if (not args and type(klass) is ClassType and
884 not hasattr(klass, "__getinitargs__")):
885 try:
886 value = _EmptyClass()
887 value.__class__ = klass
888 instantiated = 1
889 except RuntimeError:
890 # In restricted execution, assignment to inst.__class__ is
891 # prohibited
892 pass
893 if not instantiated:
894 value = apply(klass, args)
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000895 self.append(value)
Tim Peters2344fae2001-01-15 00:50:52 +0000896 dispatch[OBJ] = load_obj
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000897
898 def load_global(self):
899 module = self.readline()[:-1]
900 name = self.readline()[:-1]
901 klass = self.find_class(module, name)
902 self.append(klass)
903 dispatch[GLOBAL] = load_global
904
905 def find_class(self, module, name):
Barry Warsawbf4d9592001-11-15 23:42:58 +0000906 __import__(module)
907 mod = sys.modules[module]
908 klass = getattr(mod, name)
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000909 return klass
910
911 def load_reduce(self):
912 stack = self.stack
913
914 callable = stack[-2]
915 arg_tup = stack[-1]
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000916 del stack[-2:]
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000917
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000918 if type(callable) is not ClassType:
Raymond Hettinger54f02222002-06-01 14:18:47 +0000919 if not callable in safe_constructors:
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000920 try:
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000921 safe = callable.__safe_for_unpickling__
922 except AttributeError:
923 safe = None
Guido van Rossuma48061a1995-01-10 00:31:14 +0000924
Tim Petersc32d8242001-04-10 02:48:53 +0000925 if not safe:
Tim Peters2344fae2001-01-15 00:50:52 +0000926 raise UnpicklingError, "%s is not safe for " \
927 "unpickling" % callable
Guido van Rossuma48061a1995-01-10 00:31:14 +0000928
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000929 if arg_tup is None:
Raymond Hettinger97394bc2002-05-21 17:22:02 +0000930 import warnings
931 warnings.warn("The None return argument form of __reduce__ is "
932 "deprecated. Return a tuple of arguments instead.",
Tim Peters8ac14952002-05-23 15:15:30 +0000933 DeprecationWarning)
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000934 value = callable.__basicnew__()
935 else:
936 value = apply(callable, arg_tup)
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000937 self.append(value)
938 dispatch[REDUCE] = load_reduce
Guido van Rossuma48061a1995-01-10 00:31:14 +0000939
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000940 def load_pop(self):
941 del self.stack[-1]
942 dispatch[POP] = load_pop
Guido van Rossum7b5430f1995-03-04 22:25:21 +0000943
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000944 def load_pop_mark(self):
945 k = self.marker()
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000946 del self.stack[k:]
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000947 dispatch[POP_MARK] = load_pop_mark
Guido van Rossuma48061a1995-01-10 00:31:14 +0000948
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000949 def load_dup(self):
Guido van Rossumb1062fc1998-03-31 17:00:46 +0000950 self.append(self.stack[-1])
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000951 dispatch[DUP] = load_dup
Guido van Rossuma48061a1995-01-10 00:31:14 +0000952
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000953 def load_get(self):
954 self.append(self.memo[self.readline()[:-1]])
955 dispatch[GET] = load_get
Guido van Rossum78536471996-04-12 13:36:27 +0000956
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000957 def load_binget(self):
958 i = mloads('i' + self.read(1) + '\000\000\000')
959 self.append(self.memo[`i`])
960 dispatch[BINGET] = load_binget
Guido van Rossum78536471996-04-12 13:36:27 +0000961
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000962 def load_long_binget(self):
963 i = mloads('i' + self.read(4))
964 self.append(self.memo[`i`])
965 dispatch[LONG_BINGET] = load_long_binget
Guido van Rossum78536471996-04-12 13:36:27 +0000966
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000967 def load_put(self):
968 self.memo[self.readline()[:-1]] = self.stack[-1]
969 dispatch[PUT] = load_put
Guido van Rossuma48061a1995-01-10 00:31:14 +0000970
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000971 def load_binput(self):
972 i = mloads('i' + self.read(1) + '\000\000\000')
973 self.memo[`i`] = self.stack[-1]
974 dispatch[BINPUT] = load_binput
Guido van Rossuma48061a1995-01-10 00:31:14 +0000975
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000976 def load_long_binput(self):
977 i = mloads('i' + self.read(4))
978 self.memo[`i`] = self.stack[-1]
979 dispatch[LONG_BINPUT] = load_long_binput
Guido van Rossuma48061a1995-01-10 00:31:14 +0000980
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000981 def load_append(self):
982 stack = self.stack
Raymond Hettinger46ac8eb2002-06-30 03:39:14 +0000983 value = stack.pop()
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000984 list = stack[-1]
985 list.append(value)
986 dispatch[APPEND] = load_append
Guido van Rossuma48061a1995-01-10 00:31:14 +0000987
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000988 def load_appends(self):
989 stack = self.stack
990 mark = self.marker()
991 list = stack[mark - 1]
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000992 for i in range(mark + 1, len(stack)):
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000993 list.append(stack[i])
Guido van Rossum0c891ce1995-03-14 15:09:05 +0000994
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000995 del stack[mark:]
996 dispatch[APPENDS] = load_appends
Tim Peters2344fae2001-01-15 00:50:52 +0000997
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000998 def load_setitem(self):
999 stack = self.stack
Raymond Hettinger46ac8eb2002-06-30 03:39:14 +00001000 value = stack.pop()
1001 key = stack.pop()
Guido van Rossumb72cf2d1997-04-09 17:32:51 +00001002 dict = stack[-1]
1003 dict[key] = value
1004 dispatch[SETITEM] = load_setitem
Guido van Rossum0c891ce1995-03-14 15:09:05 +00001005
Guido van Rossumb72cf2d1997-04-09 17:32:51 +00001006 def load_setitems(self):
1007 stack = self.stack
1008 mark = self.marker()
1009 dict = stack[mark - 1]
Guido van Rossum45e2fbc1998-03-26 21:13:24 +00001010 for i in range(mark + 1, len(stack), 2):
Guido van Rossumb72cf2d1997-04-09 17:32:51 +00001011 dict[stack[i]] = stack[i + 1]
Guido van Rossuma48061a1995-01-10 00:31:14 +00001012
Guido van Rossumb72cf2d1997-04-09 17:32:51 +00001013 del stack[mark:]
1014 dispatch[SETITEMS] = load_setitems
Guido van Rossuma48061a1995-01-10 00:31:14 +00001015
Guido van Rossumb72cf2d1997-04-09 17:32:51 +00001016 def load_build(self):
1017 stack = self.stack
Raymond Hettinger46ac8eb2002-06-30 03:39:14 +00001018 value = stack.pop()
Guido van Rossumb72cf2d1997-04-09 17:32:51 +00001019 inst = stack[-1]
1020 try:
1021 setstate = inst.__setstate__
1022 except AttributeError:
Guido van Rossum45e2fbc1998-03-26 21:13:24 +00001023 try:
1024 inst.__dict__.update(value)
1025 except RuntimeError:
1026 # XXX In restricted execution, the instance's __dict__ is not
1027 # accessible. Use the old way of unpickling the instance
1028 # variables. This is a semantic different when unpickling in
1029 # restricted vs. unrestricted modes.
1030 for k, v in value.items():
1031 setattr(inst, k, v)
Guido van Rossumb72cf2d1997-04-09 17:32:51 +00001032 else:
1033 setstate(value)
1034 dispatch[BUILD] = load_build
Guido van Rossuma48061a1995-01-10 00:31:14 +00001035
Guido van Rossumb72cf2d1997-04-09 17:32:51 +00001036 def load_mark(self):
1037 self.append(self.mark)
1038 dispatch[MARK] = load_mark
Guido van Rossuma48061a1995-01-10 00:31:14 +00001039
Guido van Rossumb72cf2d1997-04-09 17:32:51 +00001040 def load_stop(self):
Raymond Hettinger46ac8eb2002-06-30 03:39:14 +00001041 value = self.stack.pop()
Guido van Rossumff871742000-12-13 18:11:56 +00001042 raise _Stop(value)
Guido van Rossumb72cf2d1997-04-09 17:32:51 +00001043 dispatch[STOP] = load_stop
Guido van Rossuma48061a1995-01-10 00:31:14 +00001044
Guido van Rossume467be61997-12-05 19:42:42 +00001045# Helper class for load_inst/load_obj
1046
1047class _EmptyClass:
1048 pass
Guido van Rossuma48061a1995-01-10 00:31:14 +00001049
Guido van Rossum0c891ce1995-03-14 15:09:05 +00001050# Shorthands
1051
Jeremy Hyltonabe2c622001-10-15 21:29:28 +00001052try:
1053 from cStringIO import StringIO
1054except ImportError:
1055 from StringIO import StringIO
Guido van Rossumc7c5e691996-07-22 22:26:07 +00001056
Guido van Rossumb72cf2d1997-04-09 17:32:51 +00001057def dump(object, file, bin = 0):
1058 Pickler(file, bin).dump(object)
Guido van Rossum0c891ce1995-03-14 15:09:05 +00001059
Guido van Rossumb72cf2d1997-04-09 17:32:51 +00001060def dumps(object, bin = 0):
1061 file = StringIO()
1062 Pickler(file, bin).dump(object)
1063 return file.getvalue()
Guido van Rossum0c891ce1995-03-14 15:09:05 +00001064
1065def load(file):
Guido van Rossumb72cf2d1997-04-09 17:32:51 +00001066 return Unpickler(file).load()
Guido van Rossum0c891ce1995-03-14 15:09:05 +00001067
1068def loads(str):
Guido van Rossumb72cf2d1997-04-09 17:32:51 +00001069 file = StringIO(str)
1070 return Unpickler(file).load()