blob: d4085cfbc09b2d9aaff18416857bf21cd1b5b377 [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():
Jeremy Hylton065a5ab2002-09-19 22:57:26 +0000629 if module is None:
630 continue # skip dummy package entries
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000631 if name != '__main__' and \
632 hasattr(module, clsname) and \
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000633 getattr(module, clsname) is cls:
634 break
635 else:
636 name = '__main__'
637 classmap[cls] = name
638 return name
Guido van Rossuma48061a1995-01-10 00:31:14 +0000639
640
641class Unpickler:
642
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000643 def __init__(self, file):
Raymond Hettingeraef22fb2002-05-29 16:18:42 +0000644 """This takes a file-like object for reading a pickle data stream.
645
646 This class automatically determines whether the data stream was
647 written in binary mode or not, so it does not need a flag as in
648 the Pickler class factory.
649
650 The file-like object must have two methods, a read() method that
651 takes an integer argument, and a readline() method that requires no
652 arguments. Both methods should return a string. Thus file-like
653 object can be a file object opened for reading, a StringIO object,
654 or any other custom object that meets this interface.
655
656 """
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000657 self.readline = file.readline
658 self.read = file.read
659 self.memo = {}
Guido van Rossuma48061a1995-01-10 00:31:14 +0000660
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000661 def load(self):
Raymond Hettingeraef22fb2002-05-29 16:18:42 +0000662 """Read a pickled object representation from the open file object.
663
664 Return the reconstituted object hierarchy specified in the file
665 object.
666
667 """
Jeremy Hylton20747fa2001-11-09 16:15:04 +0000668 self.mark = object() # any new unique object
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000669 self.stack = []
670 self.append = self.stack.append
671 read = self.read
672 dispatch = self.dispatch
673 try:
674 while 1:
675 key = read(1)
676 dispatch[key](self)
Guido van Rossumff871742000-12-13 18:11:56 +0000677 except _Stop, stopinst:
678 return stopinst.value
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000679
680 def marker(self):
681 stack = self.stack
682 mark = self.mark
683 k = len(stack)-1
684 while stack[k] is not mark: k = k-1
685 return k
686
687 dispatch = {}
688
689 def load_eof(self):
690 raise EOFError
691 dispatch[''] = load_eof
692
693 def load_persid(self):
694 pid = self.readline()[:-1]
695 self.append(self.persistent_load(pid))
696 dispatch[PERSID] = load_persid
697
698 def load_binpersid(self):
Raymond Hettinger46ac8eb2002-06-30 03:39:14 +0000699 pid = self.stack.pop()
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000700 self.append(self.persistent_load(pid))
701 dispatch[BINPERSID] = load_binpersid
702
703 def load_none(self):
704 self.append(None)
705 dispatch[NONE] = load_none
706
707 def load_int(self):
Tim Peters19ef62d2001-08-28 22:21:18 +0000708 data = self.readline()
Guido van Rossume2763392002-04-05 19:30:08 +0000709 if data == FALSE[1:]:
710 val = False
711 elif data == TRUE[1:]:
712 val = True
713 else:
714 try:
715 val = int(data)
716 except ValueError:
717 val = long(data)
718 self.append(val)
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000719 dispatch[INT] = load_int
720
721 def load_binint(self):
722 self.append(mloads('i' + self.read(4)))
723 dispatch[BININT] = load_binint
724
725 def load_binint1(self):
726 self.append(mloads('i' + self.read(1) + '\000\000\000'))
727 dispatch[BININT1] = load_binint1
728
729 def load_binint2(self):
730 self.append(mloads('i' + self.read(2) + '\000\000'))
731 dispatch[BININT2] = load_binint2
Tim Peters2344fae2001-01-15 00:50:52 +0000732
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000733 def load_long(self):
Guido van Rossumff871742000-12-13 18:11:56 +0000734 self.append(long(self.readline()[:-1], 0))
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000735 dispatch[LONG] = load_long
736
737 def load_float(self):
Guido van Rossumff871742000-12-13 18:11:56 +0000738 self.append(float(self.readline()[:-1]))
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000739 dispatch[FLOAT] = load_float
740
Guido van Rossumd3703791998-10-22 20:15:36 +0000741 def load_binfloat(self, unpack=struct.unpack):
742 self.append(unpack('>d', self.read(8))[0])
743 dispatch[BINFLOAT] = load_binfloat
744
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000745 def load_string(self):
Jeremy Hyltonbe467e52000-09-15 15:14:51 +0000746 rep = self.readline()[:-1]
Martin v. Löwis8a8da792002-08-14 07:46:28 +0000747 for q in _quotes:
748 if rep.startswith(q):
749 if not rep.endswith(q):
750 raise ValueError, "insecure string pickle"
751 rep = rep[len(q):-len(q)]
752 break
753 else:
Jeremy Hyltonbe467e52000-09-15 15:14:51 +0000754 raise ValueError, "insecure string pickle"
Martin v. Löwis8a8da792002-08-14 07:46:28 +0000755 self.append(rep.decode("string-escape"))
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000756 dispatch[STRING] = load_string
757
Jeremy Hyltonbe467e52000-09-15 15:14:51 +0000758 def _is_string_secure(self, s):
759 """Return true if s contains a string that is safe to eval
760
761 The definition of secure string is based on the implementation
762 in cPickle. s is secure as long as it only contains a quoted
763 string and optional trailing whitespace.
764 """
765 q = s[0]
766 if q not in ("'", '"'):
767 return 0
768 # find the closing quote
769 offset = 1
770 i = None
771 while 1:
772 try:
773 i = s.index(q, offset)
774 except ValueError:
775 # if there is an error the first time, there is no
776 # close quote
777 if offset == 1:
778 return 0
779 if s[i-1] != '\\':
780 break
781 # check to see if this one is escaped
782 nslash = 0
783 j = i - 1
784 while j >= offset and s[j] == '\\':
785 j = j - 1
786 nslash = nslash + 1
787 if nslash % 2 == 0:
788 break
789 offset = i + 1
790 for c in s[i+1:]:
791 if ord(c) > 32:
792 return 0
793 return 1
794
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000795 def load_binstring(self):
796 len = mloads('i' + self.read(4))
797 self.append(self.read(len))
798 dispatch[BINSTRING] = load_binstring
799
Guido van Rossumb5f2f1b2000-03-10 23:20:09 +0000800 def load_unicode(self):
801 self.append(unicode(self.readline()[:-1],'raw-unicode-escape'))
802 dispatch[UNICODE] = load_unicode
803
804 def load_binunicode(self):
805 len = mloads('i' + self.read(4))
806 self.append(unicode(self.read(len),'utf-8'))
807 dispatch[BINUNICODE] = load_binunicode
808
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000809 def load_short_binstring(self):
810 len = mloads('i' + self.read(1) + '\000\000\000')
811 self.append(self.read(len))
812 dispatch[SHORT_BINSTRING] = load_short_binstring
813
814 def load_tuple(self):
815 k = self.marker()
816 self.stack[k:] = [tuple(self.stack[k+1:])]
817 dispatch[TUPLE] = load_tuple
818
819 def load_empty_tuple(self):
820 self.stack.append(())
821 dispatch[EMPTY_TUPLE] = load_empty_tuple
822
823 def load_empty_list(self):
824 self.stack.append([])
825 dispatch[EMPTY_LIST] = load_empty_list
826
827 def load_empty_dictionary(self):
828 self.stack.append({})
829 dispatch[EMPTY_DICT] = load_empty_dictionary
830
831 def load_list(self):
832 k = self.marker()
833 self.stack[k:] = [self.stack[k+1:]]
834 dispatch[LIST] = load_list
835
836 def load_dict(self):
837 k = self.marker()
838 d = {}
839 items = self.stack[k+1:]
840 for i in range(0, len(items), 2):
841 key = items[i]
842 value = items[i+1]
843 d[key] = value
844 self.stack[k:] = [d]
845 dispatch[DICT] = load_dict
846
847 def load_inst(self):
848 k = self.marker()
849 args = tuple(self.stack[k+1:])
850 del self.stack[k:]
851 module = self.readline()[:-1]
852 name = self.readline()[:-1]
853 klass = self.find_class(module, name)
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000854 instantiated = 0
855 if (not args and type(klass) is ClassType and
856 not hasattr(klass, "__getinitargs__")):
857 try:
858 value = _EmptyClass()
859 value.__class__ = klass
Guido van Rossumb19e2a31998-04-13 18:08:45 +0000860 instantiated = 1
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000861 except RuntimeError:
862 # In restricted execution, assignment to inst.__class__ is
863 # prohibited
864 pass
865 if not instantiated:
Guido van Rossum743d17e1998-09-15 20:25:57 +0000866 try:
Barry Warsawbf4d9592001-11-15 23:42:58 +0000867 if not hasattr(klass, '__safe_for_unpickling__'):
868 raise UnpicklingError('%s is not safe for unpickling' %
869 klass)
Guido van Rossum743d17e1998-09-15 20:25:57 +0000870 value = apply(klass, args)
871 except TypeError, err:
872 raise TypeError, "in constructor for %s: %s" % (
873 klass.__name__, str(err)), sys.exc_info()[2]
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000874 self.append(value)
875 dispatch[INST] = load_inst
876
877 def load_obj(self):
878 stack = self.stack
879 k = self.marker()
880 klass = stack[k + 1]
881 del stack[k + 1]
Tim Peters2344fae2001-01-15 00:50:52 +0000882 args = tuple(stack[k + 1:])
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000883 del stack[k:]
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000884 instantiated = 0
885 if (not args and type(klass) is ClassType and
886 not hasattr(klass, "__getinitargs__")):
887 try:
888 value = _EmptyClass()
889 value.__class__ = klass
890 instantiated = 1
891 except RuntimeError:
892 # In restricted execution, assignment to inst.__class__ is
893 # prohibited
894 pass
895 if not instantiated:
896 value = apply(klass, args)
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000897 self.append(value)
Tim Peters2344fae2001-01-15 00:50:52 +0000898 dispatch[OBJ] = load_obj
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000899
900 def load_global(self):
901 module = self.readline()[:-1]
902 name = self.readline()[:-1]
903 klass = self.find_class(module, name)
904 self.append(klass)
905 dispatch[GLOBAL] = load_global
906
907 def find_class(self, module, name):
Barry Warsawbf4d9592001-11-15 23:42:58 +0000908 __import__(module)
909 mod = sys.modules[module]
910 klass = getattr(mod, name)
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000911 return klass
912
913 def load_reduce(self):
914 stack = self.stack
915
916 callable = stack[-2]
917 arg_tup = stack[-1]
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000918 del stack[-2:]
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000919
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000920 if type(callable) is not ClassType:
Raymond Hettinger54f02222002-06-01 14:18:47 +0000921 if not callable in safe_constructors:
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000922 try:
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000923 safe = callable.__safe_for_unpickling__
924 except AttributeError:
925 safe = None
Guido van Rossuma48061a1995-01-10 00:31:14 +0000926
Tim Petersc32d8242001-04-10 02:48:53 +0000927 if not safe:
Tim Peters2344fae2001-01-15 00:50:52 +0000928 raise UnpicklingError, "%s is not safe for " \
929 "unpickling" % callable
Guido van Rossuma48061a1995-01-10 00:31:14 +0000930
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000931 if arg_tup is None:
Raymond Hettinger97394bc2002-05-21 17:22:02 +0000932 import warnings
933 warnings.warn("The None return argument form of __reduce__ is "
934 "deprecated. Return a tuple of arguments instead.",
Tim Peters8ac14952002-05-23 15:15:30 +0000935 DeprecationWarning)
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000936 value = callable.__basicnew__()
937 else:
938 value = apply(callable, arg_tup)
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000939 self.append(value)
940 dispatch[REDUCE] = load_reduce
Guido van Rossuma48061a1995-01-10 00:31:14 +0000941
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000942 def load_pop(self):
943 del self.stack[-1]
944 dispatch[POP] = load_pop
Guido van Rossum7b5430f1995-03-04 22:25:21 +0000945
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000946 def load_pop_mark(self):
947 k = self.marker()
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000948 del self.stack[k:]
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000949 dispatch[POP_MARK] = load_pop_mark
Guido van Rossuma48061a1995-01-10 00:31:14 +0000950
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000951 def load_dup(self):
Guido van Rossumb1062fc1998-03-31 17:00:46 +0000952 self.append(self.stack[-1])
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000953 dispatch[DUP] = load_dup
Guido van Rossuma48061a1995-01-10 00:31:14 +0000954
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000955 def load_get(self):
956 self.append(self.memo[self.readline()[:-1]])
957 dispatch[GET] = load_get
Guido van Rossum78536471996-04-12 13:36:27 +0000958
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000959 def load_binget(self):
960 i = mloads('i' + self.read(1) + '\000\000\000')
961 self.append(self.memo[`i`])
962 dispatch[BINGET] = load_binget
Guido van Rossum78536471996-04-12 13:36:27 +0000963
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000964 def load_long_binget(self):
965 i = mloads('i' + self.read(4))
966 self.append(self.memo[`i`])
967 dispatch[LONG_BINGET] = load_long_binget
Guido van Rossum78536471996-04-12 13:36:27 +0000968
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000969 def load_put(self):
970 self.memo[self.readline()[:-1]] = self.stack[-1]
971 dispatch[PUT] = load_put
Guido van Rossuma48061a1995-01-10 00:31:14 +0000972
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000973 def load_binput(self):
974 i = mloads('i' + self.read(1) + '\000\000\000')
975 self.memo[`i`] = self.stack[-1]
976 dispatch[BINPUT] = load_binput
Guido van Rossuma48061a1995-01-10 00:31:14 +0000977
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000978 def load_long_binput(self):
979 i = mloads('i' + self.read(4))
980 self.memo[`i`] = self.stack[-1]
981 dispatch[LONG_BINPUT] = load_long_binput
Guido van Rossuma48061a1995-01-10 00:31:14 +0000982
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000983 def load_append(self):
984 stack = self.stack
Raymond Hettinger46ac8eb2002-06-30 03:39:14 +0000985 value = stack.pop()
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000986 list = stack[-1]
987 list.append(value)
988 dispatch[APPEND] = load_append
Guido van Rossuma48061a1995-01-10 00:31:14 +0000989
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000990 def load_appends(self):
991 stack = self.stack
992 mark = self.marker()
993 list = stack[mark - 1]
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000994 for i in range(mark + 1, len(stack)):
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000995 list.append(stack[i])
Guido van Rossum0c891ce1995-03-14 15:09:05 +0000996
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000997 del stack[mark:]
998 dispatch[APPENDS] = load_appends
Tim Peters2344fae2001-01-15 00:50:52 +0000999
Guido van Rossumb72cf2d1997-04-09 17:32:51 +00001000 def load_setitem(self):
1001 stack = self.stack
Raymond Hettinger46ac8eb2002-06-30 03:39:14 +00001002 value = stack.pop()
1003 key = stack.pop()
Guido van Rossumb72cf2d1997-04-09 17:32:51 +00001004 dict = stack[-1]
1005 dict[key] = value
1006 dispatch[SETITEM] = load_setitem
Guido van Rossum0c891ce1995-03-14 15:09:05 +00001007
Guido van Rossumb72cf2d1997-04-09 17:32:51 +00001008 def load_setitems(self):
1009 stack = self.stack
1010 mark = self.marker()
1011 dict = stack[mark - 1]
Guido van Rossum45e2fbc1998-03-26 21:13:24 +00001012 for i in range(mark + 1, len(stack), 2):
Guido van Rossumb72cf2d1997-04-09 17:32:51 +00001013 dict[stack[i]] = stack[i + 1]
Guido van Rossuma48061a1995-01-10 00:31:14 +00001014
Guido van Rossumb72cf2d1997-04-09 17:32:51 +00001015 del stack[mark:]
1016 dispatch[SETITEMS] = load_setitems
Guido van Rossuma48061a1995-01-10 00:31:14 +00001017
Guido van Rossumb72cf2d1997-04-09 17:32:51 +00001018 def load_build(self):
1019 stack = self.stack
Raymond Hettinger46ac8eb2002-06-30 03:39:14 +00001020 value = stack.pop()
Guido van Rossumb72cf2d1997-04-09 17:32:51 +00001021 inst = stack[-1]
1022 try:
1023 setstate = inst.__setstate__
1024 except AttributeError:
Guido van Rossum45e2fbc1998-03-26 21:13:24 +00001025 try:
1026 inst.__dict__.update(value)
1027 except RuntimeError:
1028 # XXX In restricted execution, the instance's __dict__ is not
1029 # accessible. Use the old way of unpickling the instance
1030 # variables. This is a semantic different when unpickling in
1031 # restricted vs. unrestricted modes.
1032 for k, v in value.items():
1033 setattr(inst, k, v)
Guido van Rossumb72cf2d1997-04-09 17:32:51 +00001034 else:
1035 setstate(value)
1036 dispatch[BUILD] = load_build
Guido van Rossuma48061a1995-01-10 00:31:14 +00001037
Guido van Rossumb72cf2d1997-04-09 17:32:51 +00001038 def load_mark(self):
1039 self.append(self.mark)
1040 dispatch[MARK] = load_mark
Guido van Rossuma48061a1995-01-10 00:31:14 +00001041
Guido van Rossumb72cf2d1997-04-09 17:32:51 +00001042 def load_stop(self):
Raymond Hettinger46ac8eb2002-06-30 03:39:14 +00001043 value = self.stack.pop()
Guido van Rossumff871742000-12-13 18:11:56 +00001044 raise _Stop(value)
Guido van Rossumb72cf2d1997-04-09 17:32:51 +00001045 dispatch[STOP] = load_stop
Guido van Rossuma48061a1995-01-10 00:31:14 +00001046
Guido van Rossume467be61997-12-05 19:42:42 +00001047# Helper class for load_inst/load_obj
1048
1049class _EmptyClass:
1050 pass
Guido van Rossuma48061a1995-01-10 00:31:14 +00001051
Guido van Rossum0c891ce1995-03-14 15:09:05 +00001052# Shorthands
1053
Jeremy Hyltonabe2c622001-10-15 21:29:28 +00001054try:
1055 from cStringIO import StringIO
1056except ImportError:
1057 from StringIO import StringIO
Guido van Rossumc7c5e691996-07-22 22:26:07 +00001058
Guido van Rossumb72cf2d1997-04-09 17:32:51 +00001059def dump(object, file, bin = 0):
1060 Pickler(file, bin).dump(object)
Guido van Rossum0c891ce1995-03-14 15:09:05 +00001061
Guido van Rossumb72cf2d1997-04-09 17:32:51 +00001062def dumps(object, bin = 0):
1063 file = StringIO()
1064 Pickler(file, bin).dump(object)
1065 return file.getvalue()
Guido van Rossum0c891ce1995-03-14 15:09:05 +00001066
1067def load(file):
Guido van Rossumb72cf2d1997-04-09 17:32:51 +00001068 return Unpickler(file).load()
Guido van Rossum0c891ce1995-03-14 15:09:05 +00001069
1070def loads(str):
Guido van Rossumb72cf2d1997-04-09 17:32:51 +00001071 file = StringIO(str)
1072 return Unpickler(file).load()