blob: 954da4e1c697d5c21a61f0cab54dc1c18809933a [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
Jeremy Hyltonf0cfdf72002-09-19 23:00:12 +0000614classmap = {} # called classmap for backwards compatibility
Guido van Rossuma48061a1995-01-10 00:31:14 +0000615
Jeremy Hyltonf0cfdf72002-09-19 23:00:12 +0000616def whichmodule(func, funcname):
617 """Figure out the module in which a function occurs.
Guido van Rossuma48061a1995-01-10 00:31:14 +0000618
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000619 Search sys.modules for the module.
620 Cache in classmap.
621 Return a module name.
Jeremy Hyltonf0cfdf72002-09-19 23:00:12 +0000622 If the function cannot be found, return __main__.
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000623 """
Jeremy Hyltonf0cfdf72002-09-19 23:00:12 +0000624 if func in classmap:
625 return classmap[func]
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000626
627 for name, module in sys.modules.items():
Jeremy Hyltonf0cfdf72002-09-19 23:00:12 +0000628 if module is None:
Jeremy Hylton065a5ab2002-09-19 22:57:26 +0000629 continue # skip dummy package entries
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000630 if name != '__main__' and \
Jeremy Hyltonf0cfdf72002-09-19 23:00:12 +0000631 hasattr(module, funcname) and \
632 getattr(module, funcname) is func:
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000633 break
634 else:
635 name = '__main__'
Jeremy Hyltonf0cfdf72002-09-19 23:00:12 +0000636 classmap[func] = name
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000637 return name
Guido van Rossuma48061a1995-01-10 00:31:14 +0000638
639
640class Unpickler:
641
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000642 def __init__(self, file):
Raymond Hettingeraef22fb2002-05-29 16:18:42 +0000643 """This takes a file-like object for reading a pickle data stream.
644
645 This class automatically determines whether the data stream was
646 written in binary mode or not, so it does not need a flag as in
647 the Pickler class factory.
648
649 The file-like object must have two methods, a read() method that
650 takes an integer argument, and a readline() method that requires no
651 arguments. Both methods should return a string. Thus file-like
652 object can be a file object opened for reading, a StringIO object,
653 or any other custom object that meets this interface.
654
655 """
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000656 self.readline = file.readline
657 self.read = file.read
658 self.memo = {}
Guido van Rossuma48061a1995-01-10 00:31:14 +0000659
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000660 def load(self):
Raymond Hettingeraef22fb2002-05-29 16:18:42 +0000661 """Read a pickled object representation from the open file object.
662
663 Return the reconstituted object hierarchy specified in the file
664 object.
665
666 """
Jeremy Hylton20747fa2001-11-09 16:15:04 +0000667 self.mark = object() # any new unique object
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000668 self.stack = []
669 self.append = self.stack.append
670 read = self.read
671 dispatch = self.dispatch
672 try:
673 while 1:
674 key = read(1)
675 dispatch[key](self)
Guido van Rossumff871742000-12-13 18:11:56 +0000676 except _Stop, stopinst:
677 return stopinst.value
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000678
679 def marker(self):
680 stack = self.stack
681 mark = self.mark
682 k = len(stack)-1
683 while stack[k] is not mark: k = k-1
684 return k
685
686 dispatch = {}
687
688 def load_eof(self):
689 raise EOFError
690 dispatch[''] = load_eof
691
692 def load_persid(self):
693 pid = self.readline()[:-1]
694 self.append(self.persistent_load(pid))
695 dispatch[PERSID] = load_persid
696
697 def load_binpersid(self):
Raymond Hettinger46ac8eb2002-06-30 03:39:14 +0000698 pid = self.stack.pop()
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000699 self.append(self.persistent_load(pid))
700 dispatch[BINPERSID] = load_binpersid
701
702 def load_none(self):
703 self.append(None)
704 dispatch[NONE] = load_none
705
706 def load_int(self):
Tim Peters19ef62d2001-08-28 22:21:18 +0000707 data = self.readline()
Guido van Rossume2763392002-04-05 19:30:08 +0000708 if data == FALSE[1:]:
709 val = False
710 elif data == TRUE[1:]:
711 val = True
712 else:
713 try:
714 val = int(data)
715 except ValueError:
716 val = long(data)
717 self.append(val)
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000718 dispatch[INT] = load_int
719
720 def load_binint(self):
721 self.append(mloads('i' + self.read(4)))
722 dispatch[BININT] = load_binint
723
724 def load_binint1(self):
725 self.append(mloads('i' + self.read(1) + '\000\000\000'))
726 dispatch[BININT1] = load_binint1
727
728 def load_binint2(self):
729 self.append(mloads('i' + self.read(2) + '\000\000'))
730 dispatch[BININT2] = load_binint2
Tim Peters2344fae2001-01-15 00:50:52 +0000731
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000732 def load_long(self):
Guido van Rossumff871742000-12-13 18:11:56 +0000733 self.append(long(self.readline()[:-1], 0))
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000734 dispatch[LONG] = load_long
735
736 def load_float(self):
Guido van Rossumff871742000-12-13 18:11:56 +0000737 self.append(float(self.readline()[:-1]))
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000738 dispatch[FLOAT] = load_float
739
Guido van Rossumd3703791998-10-22 20:15:36 +0000740 def load_binfloat(self, unpack=struct.unpack):
741 self.append(unpack('>d', self.read(8))[0])
742 dispatch[BINFLOAT] = load_binfloat
743
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000744 def load_string(self):
Jeremy Hyltonbe467e52000-09-15 15:14:51 +0000745 rep = self.readline()[:-1]
Martin v. Löwis8a8da792002-08-14 07:46:28 +0000746 for q in _quotes:
747 if rep.startswith(q):
748 if not rep.endswith(q):
749 raise ValueError, "insecure string pickle"
750 rep = rep[len(q):-len(q)]
751 break
752 else:
Jeremy Hyltonbe467e52000-09-15 15:14:51 +0000753 raise ValueError, "insecure string pickle"
Martin v. Löwis8a8da792002-08-14 07:46:28 +0000754 self.append(rep.decode("string-escape"))
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000755 dispatch[STRING] = load_string
756
Jeremy Hyltonbe467e52000-09-15 15:14:51 +0000757 def _is_string_secure(self, s):
758 """Return true if s contains a string that is safe to eval
759
760 The definition of secure string is based on the implementation
761 in cPickle. s is secure as long as it only contains a quoted
762 string and optional trailing whitespace.
763 """
764 q = s[0]
765 if q not in ("'", '"'):
766 return 0
767 # find the closing quote
768 offset = 1
769 i = None
770 while 1:
771 try:
772 i = s.index(q, offset)
773 except ValueError:
774 # if there is an error the first time, there is no
775 # close quote
776 if offset == 1:
777 return 0
778 if s[i-1] != '\\':
779 break
780 # check to see if this one is escaped
781 nslash = 0
782 j = i - 1
783 while j >= offset and s[j] == '\\':
784 j = j - 1
785 nslash = nslash + 1
786 if nslash % 2 == 0:
787 break
788 offset = i + 1
789 for c in s[i+1:]:
790 if ord(c) > 32:
791 return 0
792 return 1
793
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000794 def load_binstring(self):
795 len = mloads('i' + self.read(4))
796 self.append(self.read(len))
797 dispatch[BINSTRING] = load_binstring
798
Guido van Rossumb5f2f1b2000-03-10 23:20:09 +0000799 def load_unicode(self):
800 self.append(unicode(self.readline()[:-1],'raw-unicode-escape'))
801 dispatch[UNICODE] = load_unicode
802
803 def load_binunicode(self):
804 len = mloads('i' + self.read(4))
805 self.append(unicode(self.read(len),'utf-8'))
806 dispatch[BINUNICODE] = load_binunicode
807
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000808 def load_short_binstring(self):
809 len = mloads('i' + self.read(1) + '\000\000\000')
810 self.append(self.read(len))
811 dispatch[SHORT_BINSTRING] = load_short_binstring
812
813 def load_tuple(self):
814 k = self.marker()
815 self.stack[k:] = [tuple(self.stack[k+1:])]
816 dispatch[TUPLE] = load_tuple
817
818 def load_empty_tuple(self):
819 self.stack.append(())
820 dispatch[EMPTY_TUPLE] = load_empty_tuple
821
822 def load_empty_list(self):
823 self.stack.append([])
824 dispatch[EMPTY_LIST] = load_empty_list
825
826 def load_empty_dictionary(self):
827 self.stack.append({})
828 dispatch[EMPTY_DICT] = load_empty_dictionary
829
830 def load_list(self):
831 k = self.marker()
832 self.stack[k:] = [self.stack[k+1:]]
833 dispatch[LIST] = load_list
834
835 def load_dict(self):
836 k = self.marker()
837 d = {}
838 items = self.stack[k+1:]
839 for i in range(0, len(items), 2):
840 key = items[i]
841 value = items[i+1]
842 d[key] = value
843 self.stack[k:] = [d]
844 dispatch[DICT] = load_dict
845
846 def load_inst(self):
847 k = self.marker()
848 args = tuple(self.stack[k+1:])
849 del self.stack[k:]
850 module = self.readline()[:-1]
851 name = self.readline()[:-1]
852 klass = self.find_class(module, name)
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000853 instantiated = 0
854 if (not args and type(klass) is ClassType and
855 not hasattr(klass, "__getinitargs__")):
856 try:
857 value = _EmptyClass()
858 value.__class__ = klass
Guido van Rossumb19e2a31998-04-13 18:08:45 +0000859 instantiated = 1
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000860 except RuntimeError:
861 # In restricted execution, assignment to inst.__class__ is
862 # prohibited
863 pass
864 if not instantiated:
Guido van Rossum743d17e1998-09-15 20:25:57 +0000865 try:
Barry Warsawbf4d9592001-11-15 23:42:58 +0000866 if not hasattr(klass, '__safe_for_unpickling__'):
867 raise UnpicklingError('%s is not safe for unpickling' %
868 klass)
Guido van Rossum743d17e1998-09-15 20:25:57 +0000869 value = apply(klass, args)
870 except TypeError, err:
871 raise TypeError, "in constructor for %s: %s" % (
872 klass.__name__, str(err)), sys.exc_info()[2]
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000873 self.append(value)
874 dispatch[INST] = load_inst
875
876 def load_obj(self):
877 stack = self.stack
878 k = self.marker()
879 klass = stack[k + 1]
880 del stack[k + 1]
Tim Peters2344fae2001-01-15 00:50:52 +0000881 args = tuple(stack[k + 1:])
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000882 del stack[k:]
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000883 instantiated = 0
884 if (not args and type(klass) is ClassType and
885 not hasattr(klass, "__getinitargs__")):
886 try:
887 value = _EmptyClass()
888 value.__class__ = klass
889 instantiated = 1
890 except RuntimeError:
891 # In restricted execution, assignment to inst.__class__ is
892 # prohibited
893 pass
894 if not instantiated:
895 value = apply(klass, args)
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000896 self.append(value)
Tim Peters2344fae2001-01-15 00:50:52 +0000897 dispatch[OBJ] = load_obj
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000898
899 def load_global(self):
900 module = self.readline()[:-1]
901 name = self.readline()[:-1]
902 klass = self.find_class(module, name)
903 self.append(klass)
904 dispatch[GLOBAL] = load_global
905
906 def find_class(self, module, name):
Barry Warsawbf4d9592001-11-15 23:42:58 +0000907 __import__(module)
908 mod = sys.modules[module]
909 klass = getattr(mod, name)
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000910 return klass
911
912 def load_reduce(self):
913 stack = self.stack
914
915 callable = stack[-2]
916 arg_tup = stack[-1]
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000917 del stack[-2:]
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000918
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000919 if type(callable) is not ClassType:
Raymond Hettinger54f02222002-06-01 14:18:47 +0000920 if not callable in safe_constructors:
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000921 try:
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000922 safe = callable.__safe_for_unpickling__
923 except AttributeError:
924 safe = None
Guido van Rossuma48061a1995-01-10 00:31:14 +0000925
Tim Petersc32d8242001-04-10 02:48:53 +0000926 if not safe:
Tim Peters2344fae2001-01-15 00:50:52 +0000927 raise UnpicklingError, "%s is not safe for " \
928 "unpickling" % callable
Guido van Rossuma48061a1995-01-10 00:31:14 +0000929
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000930 if arg_tup is None:
Raymond Hettinger97394bc2002-05-21 17:22:02 +0000931 import warnings
932 warnings.warn("The None return argument form of __reduce__ is "
933 "deprecated. Return a tuple of arguments instead.",
Tim Peters8ac14952002-05-23 15:15:30 +0000934 DeprecationWarning)
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000935 value = callable.__basicnew__()
936 else:
937 value = apply(callable, arg_tup)
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000938 self.append(value)
939 dispatch[REDUCE] = load_reduce
Guido van Rossuma48061a1995-01-10 00:31:14 +0000940
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000941 def load_pop(self):
942 del self.stack[-1]
943 dispatch[POP] = load_pop
Guido van Rossum7b5430f1995-03-04 22:25:21 +0000944
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000945 def load_pop_mark(self):
946 k = self.marker()
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000947 del self.stack[k:]
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000948 dispatch[POP_MARK] = load_pop_mark
Guido van Rossuma48061a1995-01-10 00:31:14 +0000949
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000950 def load_dup(self):
Guido van Rossumb1062fc1998-03-31 17:00:46 +0000951 self.append(self.stack[-1])
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000952 dispatch[DUP] = load_dup
Guido van Rossuma48061a1995-01-10 00:31:14 +0000953
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000954 def load_get(self):
955 self.append(self.memo[self.readline()[:-1]])
956 dispatch[GET] = load_get
Guido van Rossum78536471996-04-12 13:36:27 +0000957
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000958 def load_binget(self):
959 i = mloads('i' + self.read(1) + '\000\000\000')
960 self.append(self.memo[`i`])
961 dispatch[BINGET] = load_binget
Guido van Rossum78536471996-04-12 13:36:27 +0000962
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000963 def load_long_binget(self):
964 i = mloads('i' + self.read(4))
965 self.append(self.memo[`i`])
966 dispatch[LONG_BINGET] = load_long_binget
Guido van Rossum78536471996-04-12 13:36:27 +0000967
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000968 def load_put(self):
969 self.memo[self.readline()[:-1]] = self.stack[-1]
970 dispatch[PUT] = load_put
Guido van Rossuma48061a1995-01-10 00:31:14 +0000971
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000972 def load_binput(self):
973 i = mloads('i' + self.read(1) + '\000\000\000')
974 self.memo[`i`] = self.stack[-1]
975 dispatch[BINPUT] = load_binput
Guido van Rossuma48061a1995-01-10 00:31:14 +0000976
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000977 def load_long_binput(self):
978 i = mloads('i' + self.read(4))
979 self.memo[`i`] = self.stack[-1]
980 dispatch[LONG_BINPUT] = load_long_binput
Guido van Rossuma48061a1995-01-10 00:31:14 +0000981
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000982 def load_append(self):
983 stack = self.stack
Raymond Hettinger46ac8eb2002-06-30 03:39:14 +0000984 value = stack.pop()
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000985 list = stack[-1]
986 list.append(value)
987 dispatch[APPEND] = load_append
Guido van Rossuma48061a1995-01-10 00:31:14 +0000988
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000989 def load_appends(self):
990 stack = self.stack
991 mark = self.marker()
992 list = stack[mark - 1]
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000993 for i in range(mark + 1, len(stack)):
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000994 list.append(stack[i])
Guido van Rossum0c891ce1995-03-14 15:09:05 +0000995
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000996 del stack[mark:]
997 dispatch[APPENDS] = load_appends
Tim Peters2344fae2001-01-15 00:50:52 +0000998
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000999 def load_setitem(self):
1000 stack = self.stack
Raymond Hettinger46ac8eb2002-06-30 03:39:14 +00001001 value = stack.pop()
1002 key = stack.pop()
Guido van Rossumb72cf2d1997-04-09 17:32:51 +00001003 dict = stack[-1]
1004 dict[key] = value
1005 dispatch[SETITEM] = load_setitem
Guido van Rossum0c891ce1995-03-14 15:09:05 +00001006
Guido van Rossumb72cf2d1997-04-09 17:32:51 +00001007 def load_setitems(self):
1008 stack = self.stack
1009 mark = self.marker()
1010 dict = stack[mark - 1]
Guido van Rossum45e2fbc1998-03-26 21:13:24 +00001011 for i in range(mark + 1, len(stack), 2):
Guido van Rossumb72cf2d1997-04-09 17:32:51 +00001012 dict[stack[i]] = stack[i + 1]
Guido van Rossuma48061a1995-01-10 00:31:14 +00001013
Guido van Rossumb72cf2d1997-04-09 17:32:51 +00001014 del stack[mark:]
1015 dispatch[SETITEMS] = load_setitems
Guido van Rossuma48061a1995-01-10 00:31:14 +00001016
Guido van Rossumb72cf2d1997-04-09 17:32:51 +00001017 def load_build(self):
1018 stack = self.stack
Raymond Hettinger46ac8eb2002-06-30 03:39:14 +00001019 value = stack.pop()
Guido van Rossumb72cf2d1997-04-09 17:32:51 +00001020 inst = stack[-1]
1021 try:
1022 setstate = inst.__setstate__
1023 except AttributeError:
Guido van Rossum45e2fbc1998-03-26 21:13:24 +00001024 try:
1025 inst.__dict__.update(value)
1026 except RuntimeError:
1027 # XXX In restricted execution, the instance's __dict__ is not
1028 # accessible. Use the old way of unpickling the instance
1029 # variables. This is a semantic different when unpickling in
1030 # restricted vs. unrestricted modes.
1031 for k, v in value.items():
1032 setattr(inst, k, v)
Guido van Rossumb72cf2d1997-04-09 17:32:51 +00001033 else:
1034 setstate(value)
1035 dispatch[BUILD] = load_build
Guido van Rossuma48061a1995-01-10 00:31:14 +00001036
Guido van Rossumb72cf2d1997-04-09 17:32:51 +00001037 def load_mark(self):
1038 self.append(self.mark)
1039 dispatch[MARK] = load_mark
Guido van Rossuma48061a1995-01-10 00:31:14 +00001040
Guido van Rossumb72cf2d1997-04-09 17:32:51 +00001041 def load_stop(self):
Raymond Hettinger46ac8eb2002-06-30 03:39:14 +00001042 value = self.stack.pop()
Guido van Rossumff871742000-12-13 18:11:56 +00001043 raise _Stop(value)
Guido van Rossumb72cf2d1997-04-09 17:32:51 +00001044 dispatch[STOP] = load_stop
Guido van Rossuma48061a1995-01-10 00:31:14 +00001045
Guido van Rossume467be61997-12-05 19:42:42 +00001046# Helper class for load_inst/load_obj
1047
1048class _EmptyClass:
1049 pass
Guido van Rossuma48061a1995-01-10 00:31:14 +00001050
Guido van Rossum0c891ce1995-03-14 15:09:05 +00001051# Shorthands
1052
Jeremy Hyltonabe2c622001-10-15 21:29:28 +00001053try:
1054 from cStringIO import StringIO
1055except ImportError:
1056 from StringIO import StringIO
Guido van Rossumc7c5e691996-07-22 22:26:07 +00001057
Guido van Rossumb72cf2d1997-04-09 17:32:51 +00001058def dump(object, file, bin = 0):
1059 Pickler(file, bin).dump(object)
Guido van Rossum0c891ce1995-03-14 15:09:05 +00001060
Guido van Rossumb72cf2d1997-04-09 17:32:51 +00001061def dumps(object, bin = 0):
1062 file = StringIO()
1063 Pickler(file, bin).dump(object)
1064 return file.getvalue()
Guido van Rossum0c891ce1995-03-14 15:09:05 +00001065
1066def load(file):
Guido van Rossumb72cf2d1997-04-09 17:32:51 +00001067 return Unpickler(file).load()
Guido van Rossum0c891ce1995-03-14 15:09:05 +00001068
1069def loads(str):
Guido van Rossumb72cf2d1997-04-09 17:32:51 +00001070 file = StringIO(str)
1071 return Unpickler(file).load()