blob: b0c6a79fdfe7cfd9d65ae18e051cf78066ccf93a [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
Guido van Rossuma48061a1995-01-10 00:31:14 +000033
Skip Montanaro352674d2001-02-07 23:14:30 +000034__all__ = ["PickleError", "PicklingError", "UnpicklingError", "Pickler",
35 "Unpickler", "dump", "dumps", "load", "loads"]
36
Guido van Rossumd3703791998-10-22 20:15:36 +000037format_version = "1.3" # File format version we write
38compatible_formats = ["1.0", "1.1", "1.2"] # Old format versions we can read
Guido van Rossumb72cf2d1997-04-09 17:32:51 +000039
40mdumps = marshal.dumps
41mloads = marshal.loads
Guido van Rossum0c891ce1995-03-14 15:09:05 +000042
Guido van Rossum26e89d02000-06-29 16:15:52 +000043class PickleError(Exception): pass
44class PicklingError(PickleError): pass
45class UnpicklingError(PickleError): pass
Guido van Rossum7849da81995-03-09 14:08:35 +000046
Guido van Rossumff871742000-12-13 18:11:56 +000047class _Stop(Exception):
48 def __init__(self, value):
49 self.value = value
50
Jeremy Hylton2b9d0291998-05-27 22:38:22 +000051try:
52 from org.python.core import PyStringMap
53except ImportError:
54 PyStringMap = None
55
Guido van Rossumb72cf2d1997-04-09 17:32:51 +000056MARK = '('
57STOP = '.'
58POP = '0'
59POP_MARK = '1'
60DUP = '2'
61FLOAT = 'F'
62INT = 'I'
63BININT = 'J'
64BININT1 = 'K'
65LONG = 'L'
66BININT2 = 'M'
67NONE = 'N'
68PERSID = 'P'
69BINPERSID = 'Q'
70REDUCE = 'R'
71STRING = 'S'
72BINSTRING = 'T'
73SHORT_BINSTRING = 'U'
Guido van Rossumb5f2f1b2000-03-10 23:20:09 +000074UNICODE = 'V'
75BINUNICODE = 'X'
Guido van Rossumb72cf2d1997-04-09 17:32:51 +000076APPEND = 'a'
77BUILD = 'b'
78GLOBAL = 'c'
79DICT = 'd'
80EMPTY_DICT = '}'
81APPENDS = 'e'
82GET = 'g'
83BINGET = 'h'
84INST = 'i'
85LONG_BINGET = 'j'
86LIST = 'l'
87EMPTY_LIST = ']'
88OBJ = 'o'
89PUT = 'p'
90BINPUT = 'q'
91LONG_BINPUT = 'r'
92SETITEM = 's'
93TUPLE = 't'
94EMPTY_TUPLE = ')'
95SETITEMS = 'u'
Guido van Rossumd3703791998-10-22 20:15:36 +000096BINFLOAT = 'G'
Guido van Rossuma48061a1995-01-10 00:31:14 +000097
98class Pickler:
99
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000100 def __init__(self, file, bin = 0):
101 self.write = file.write
102 self.memo = {}
103 self.bin = bin
Guido van Rossuma48061a1995-01-10 00:31:14 +0000104
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000105 def dump(self, object):
106 self.save(object)
107 self.write(STOP)
Guido van Rossuma48061a1995-01-10 00:31:14 +0000108
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000109 def put(self, i):
110 if (self.bin):
111 s = mdumps(i)[1:]
112 if (i < 256):
113 return BINPUT + s[0]
Guido van Rossuma48061a1995-01-10 00:31:14 +0000114
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000115 return LONG_BINPUT + s
Guido van Rossuma48061a1995-01-10 00:31:14 +0000116
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000117 return PUT + `i` + '\n'
Guido van Rossuma48061a1995-01-10 00:31:14 +0000118
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000119 def get(self, i):
120 if (self.bin):
121 s = mdumps(i)[1:]
Guido van Rossuma48061a1995-01-10 00:31:14 +0000122
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000123 if (i < 256):
124 return BINGET + s[0]
Guido van Rossuma48061a1995-01-10 00:31:14 +0000125
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000126 return LONG_BINGET + s
Guido van Rossuma48061a1995-01-10 00:31:14 +0000127
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000128 return GET + `i` + '\n'
Tim Peters2344fae2001-01-15 00:50:52 +0000129
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000130 def save(self, object, pers_save = 0):
131 memo = self.memo
Guido van Rossuma48061a1995-01-10 00:31:14 +0000132
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000133 if (not pers_save):
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000134 pid = self.persistent_id(object)
135 if (pid is not None):
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000136 self.save_pers(pid)
137 return
Guido van Rossuma48061a1995-01-10 00:31:14 +0000138
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000139 d = id(object)
Tim Peters2344fae2001-01-15 00:50:52 +0000140
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000141 t = type(object)
Guido van Rossuma48061a1995-01-10 00:31:14 +0000142
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000143 if ((t is TupleType) and (len(object) == 0)):
144 if (self.bin):
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000145 self.save_empty_tuple(object)
146 else:
147 self.save_tuple(object)
148 return
Guido van Rossuma48061a1995-01-10 00:31:14 +0000149
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000150 if memo.has_key(d):
151 self.write(self.get(memo[d][0]))
152 return
153
154 try:
155 f = self.dispatch[t]
156 except KeyError:
157 pid = self.inst_persistent_id(object)
158 if pid is not None:
159 self.save_pers(pid)
160 return
161
162 try:
163 reduce = dispatch_table[t]
164 except KeyError:
165 try:
166 reduce = object.__reduce__
167 except AttributeError:
168 raise PicklingError, \
Guido van Rossum08a92cb1999-10-10 21:14:25 +0000169 "can't pickle %s object: %s" % (`t.__name__`,
170 `object`)
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000171 else:
172 tup = reduce()
173 else:
174 tup = reduce(object)
175
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000176 if type(tup) is StringType:
177 self.save_global(object, tup)
178 return
Guido van Rossumd1f49841997-12-10 23:40:18 +0000179
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000180 if (type(tup) is not TupleType):
181 raise PicklingError, "Value returned by %s must be a " \
182 "tuple" % reduce
183
184 l = len(tup)
Tim Peters2344fae2001-01-15 00:50:52 +0000185
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000186 if ((l != 2) and (l != 3)):
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000187 raise PicklingError, "tuple returned by %s must contain " \
188 "only two or three elements" % reduce
189
190 callable = tup[0]
191 arg_tup = tup[1]
Tim Peters2344fae2001-01-15 00:50:52 +0000192
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000193 if (l > 2):
194 state = tup[2]
195 else:
196 state = None
197
Guido van Rossumd1f49841997-12-10 23:40:18 +0000198 if type(arg_tup) is not TupleType and arg_tup is not None:
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000199 raise PicklingError, "Second element of tuple returned " \
200 "by %s must be a tuple" % reduce
201
Tim Peters2344fae2001-01-15 00:50:52 +0000202 self.save_reduce(callable, arg_tup, state)
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000203 memo_len = len(memo)
204 self.write(self.put(memo_len))
205 memo[d] = (memo_len, object)
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000206 return
207
208 f(self, object)
209
210 def persistent_id(self, object):
211 return None
212
213 def inst_persistent_id(self, object):
214 return None
215
216 def save_pers(self, pid):
217 if (not self.bin):
218 self.write(PERSID + str(pid) + '\n')
219 else:
220 self.save(pid, 1)
221 self.write(BINPERSID)
222
223 def save_reduce(self, callable, arg_tup, state = None):
224 write = self.write
225 save = self.save
226
227 save(callable)
228 save(arg_tup)
229 write(REDUCE)
Tim Peters2344fae2001-01-15 00:50:52 +0000230
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000231 if (state is not None):
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000232 save(state)
233 write(BUILD)
234
235 dispatch = {}
236
237 def save_none(self, object):
238 self.write(NONE)
239 dispatch[NoneType] = save_none
240
241 def save_int(self, object):
242 if (self.bin):
243 i = mdumps(object)[1:]
244 if (i[-2:] == '\000\000'):
245 if (i[-3] == '\000'):
246 self.write(BININT1 + i[:-3])
247 return
248
249 self.write(BININT2 + i[:-2])
250 return
251
252 self.write(BININT + i)
253 else:
254 self.write(INT + `object` + '\n')
255 dispatch[IntType] = save_int
256
257 def save_long(self, object):
258 self.write(LONG + `object` + '\n')
259 dispatch[LongType] = save_long
260
Guido van Rossumd3703791998-10-22 20:15:36 +0000261 def save_float(self, object, pack=struct.pack):
262 if self.bin:
263 self.write(BINFLOAT + pack('>d', object))
264 else:
265 self.write(FLOAT + `object` + '\n')
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000266 dispatch[FloatType] = save_float
267
268 def save_string(self, object):
269 d = id(object)
270 memo = self.memo
271
272 if (self.bin):
273 l = len(object)
274 s = mdumps(l)[1:]
275 if (l < 256):
276 self.write(SHORT_BINSTRING + s[0] + object)
277 else:
278 self.write(BINSTRING + s + object)
279 else:
280 self.write(STRING + `object` + '\n')
281
282 memo_len = len(memo)
283 self.write(self.put(memo_len))
284 memo[d] = (memo_len, object)
285 dispatch[StringType] = save_string
286
Guido van Rossumb5f2f1b2000-03-10 23:20:09 +0000287 def save_unicode(self, object):
288 d = id(object)
289 memo = self.memo
290
291 if (self.bin):
292 encoding = object.encode('utf-8')
293 l = len(encoding)
294 s = mdumps(l)[1:]
295 self.write(BINUNICODE + s + encoding)
296 else:
Guido van Rossuma31b4ef2000-12-19 01:29:00 +0000297 object = object.replace(u"\\", u"\\u005c")
298 object = object.replace(u"\n", u"\\u000a")
Guido van Rossumb5f2f1b2000-03-10 23:20:09 +0000299 self.write(UNICODE + object.encode('raw-unicode-escape') + '\n')
300
301 memo_len = len(memo)
302 self.write(self.put(memo_len))
303 memo[d] = (memo_len, object)
304 dispatch[UnicodeType] = save_unicode
305
Guido van Rossum31584cb2001-01-22 14:53:29 +0000306 if StringType == UnicodeType:
307 # This is true for Jython
308 def save_string(self, object):
309 d = id(object)
310 memo = self.memo
311 unicode = object.isunicode()
312
313 if (self.bin):
314 if unicode:
315 object = object.encode("utf-8")
316 l = len(object)
317 s = mdumps(l)[1:]
318 if (l < 256 and not unicode):
319 self.write(SHORT_BINSTRING + s[0] + object)
320 else:
321 if unicode:
322 self.write(BINUNICODE + s + object)
323 else:
324 self.write(BINSTRING + s + object)
325 else:
326 if unicode:
327 object = object.replace(u"\\", u"\\u005c")
328 object = object.replace(u"\n", u"\\u000a")
329 object = object.encode('raw-unicode-escape')
330 self.write(UNICODE + object + '\n')
331 else:
332 self.write(STRING + `object` + '\n')
333
334 memo_len = len(memo)
335 self.write(self.put(memo_len))
336 memo[d] = (memo_len, object)
337 dispatch[StringType] = save_string
338
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000339 def save_tuple(self, object):
340
341 write = self.write
342 save = self.save
343 memo = self.memo
344
345 d = id(object)
346
347 write(MARK)
348
349 for element in object:
350 save(element)
351
352 if (len(object) and memo.has_key(d)):
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000353 if (self.bin):
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000354 write(POP_MARK + self.get(memo[d][0]))
355 return
Tim Peters2344fae2001-01-15 00:50:52 +0000356
Guido van Rossum599174f1998-03-31 16:30:28 +0000357 write(POP * (len(object) + 1) + self.get(memo[d][0]))
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000358 return
359
360 memo_len = len(memo)
361 self.write(TUPLE + self.put(memo_len))
362 memo[d] = (memo_len, object)
363 dispatch[TupleType] = save_tuple
364
365 def save_empty_tuple(self, object):
366 self.write(EMPTY_TUPLE)
367
368 def save_list(self, object):
369 d = id(object)
370
371 write = self.write
372 save = self.save
373 memo = self.memo
374
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000375 if (self.bin):
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000376 write(EMPTY_LIST)
377 else:
378 write(MARK + LIST)
379
380 memo_len = len(memo)
381 write(self.put(memo_len))
382 memo[d] = (memo_len, object)
383
384 using_appends = (self.bin and (len(object) > 1))
385
386 if (using_appends):
387 write(MARK)
388
389 for element in object:
390 save(element)
Tim Peters2344fae2001-01-15 00:50:52 +0000391
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000392 if (not using_appends):
393 write(APPEND)
394
395 if (using_appends):
396 write(APPENDS)
397 dispatch[ListType] = save_list
398
399 def save_dict(self, object):
400 d = id(object)
401
402 write = self.write
403 save = self.save
404 memo = self.memo
405
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000406 if (self.bin):
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000407 write(EMPTY_DICT)
408 else:
409 write(MARK + DICT)
410
411 memo_len = len(memo)
412 self.write(self.put(memo_len))
413 memo[d] = (memo_len, object)
414
415 using_setitems = (self.bin and (len(object) > 1))
416
417 if (using_setitems):
418 write(MARK)
419
420 items = object.items()
421 for key, value in items:
422 save(key)
423 save(value)
424
425 if (not using_setitems):
426 write(SETITEM)
427
428 if (using_setitems):
429 write(SETITEMS)
430
431 dispatch[DictionaryType] = save_dict
Jeremy Hylton2b9d0291998-05-27 22:38:22 +0000432 if not PyStringMap is None:
433 dispatch[PyStringMap] = save_dict
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000434
435 def save_inst(self, object):
436 d = id(object)
437 cls = object.__class__
438
439 memo = self.memo
440 write = self.write
441 save = self.save
442
443 if hasattr(object, '__getinitargs__'):
444 args = object.__getinitargs__()
445 len(args) # XXX Assert it's a sequence
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000446 _keep_alive(args, memo)
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000447 else:
448 args = ()
449
450 write(MARK)
451
452 if (self.bin):
453 save(cls)
454
455 for arg in args:
456 save(arg)
457
458 memo_len = len(memo)
459 if (self.bin):
460 write(OBJ + self.put(memo_len))
461 else:
Guido van Rossum4fb5b281997-09-12 20:07:24 +0000462 write(INST + cls.__module__ + '\n' + cls.__name__ + '\n' +
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000463 self.put(memo_len))
464
465 memo[d] = (memo_len, object)
466
467 try:
468 getstate = object.__getstate__
469 except AttributeError:
470 stuff = object.__dict__
471 else:
472 stuff = getstate()
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000473 _keep_alive(stuff, memo)
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000474 save(stuff)
475 write(BUILD)
476 dispatch[InstanceType] = save_inst
477
478 def save_global(self, object, name = None):
479 write = self.write
480 memo = self.memo
481
482 if (name is None):
483 name = object.__name__
484
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000485 try:
486 module = object.__module__
487 except AttributeError:
488 module = whichmodule(object, name)
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000489
490 memo_len = len(memo)
491 write(GLOBAL + module + '\n' + name + '\n' +
492 self.put(memo_len))
493 memo[id(object)] = (memo_len, object)
494 dispatch[ClassType] = save_global
495 dispatch[FunctionType] = save_global
496 dispatch[BuiltinFunctionType] = save_global
Guido van Rossum0c891ce1995-03-14 15:09:05 +0000497
Guido van Rossuma48061a1995-01-10 00:31:14 +0000498
Guido van Rossum5ed5c4c1997-09-03 00:23:54 +0000499def _keep_alive(x, memo):
500 """Keeps a reference to the object x in the memo.
501
502 Because we remember objects by their id, we have
503 to assure that possibly temporary objects are kept
504 alive by referencing them.
505 We store a reference at the id of the memo, which should
506 normally not be used unless someone tries to deepcopy
507 the memo itself...
508 """
509 try:
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000510 memo[id(memo)].append(x)
Guido van Rossum5ed5c4c1997-09-03 00:23:54 +0000511 except KeyError:
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000512 # aha, this is the first one :-)
513 memo[id(memo)]=[x]
Guido van Rossum5ed5c4c1997-09-03 00:23:54 +0000514
515
Guido van Rossuma48061a1995-01-10 00:31:14 +0000516classmap = {}
517
Guido van Rossum4fb5b281997-09-12 20:07:24 +0000518# This is no longer used to find classes, but still for functions
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000519def whichmodule(cls, clsname):
520 """Figure out the module in which a class occurs.
Guido van Rossuma48061a1995-01-10 00:31:14 +0000521
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000522 Search sys.modules for the module.
523 Cache in classmap.
524 Return a module name.
525 If the class cannot be found, return __main__.
526 """
527 if classmap.has_key(cls):
528 return classmap[cls]
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000529
530 for name, module in sys.modules.items():
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000531 if name != '__main__' and \
532 hasattr(module, clsname) and \
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000533 getattr(module, clsname) is cls:
534 break
535 else:
536 name = '__main__'
537 classmap[cls] = name
538 return name
Guido van Rossuma48061a1995-01-10 00:31:14 +0000539
540
541class Unpickler:
542
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000543 def __init__(self, file):
544 self.readline = file.readline
545 self.read = file.read
546 self.memo = {}
Guido van Rossuma48061a1995-01-10 00:31:14 +0000547
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000548 def load(self):
549 self.mark = ['spam'] # Any new unique object
550 self.stack = []
551 self.append = self.stack.append
552 read = self.read
553 dispatch = self.dispatch
554 try:
555 while 1:
556 key = read(1)
557 dispatch[key](self)
Guido van Rossumff871742000-12-13 18:11:56 +0000558 except _Stop, stopinst:
559 return stopinst.value
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000560
561 def marker(self):
562 stack = self.stack
563 mark = self.mark
564 k = len(stack)-1
565 while stack[k] is not mark: k = k-1
566 return k
567
568 dispatch = {}
569
570 def load_eof(self):
571 raise EOFError
572 dispatch[''] = load_eof
573
574 def load_persid(self):
575 pid = self.readline()[:-1]
576 self.append(self.persistent_load(pid))
577 dispatch[PERSID] = load_persid
578
579 def load_binpersid(self):
580 stack = self.stack
Tim Peters2344fae2001-01-15 00:50:52 +0000581
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000582 pid = stack[-1]
583 del stack[-1]
584
585 self.append(self.persistent_load(pid))
586 dispatch[BINPERSID] = load_binpersid
587
588 def load_none(self):
589 self.append(None)
590 dispatch[NONE] = load_none
591
592 def load_int(self):
Guido van Rossumff871742000-12-13 18:11:56 +0000593 self.append(int(self.readline()[:-1]))
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000594 dispatch[INT] = load_int
595
596 def load_binint(self):
597 self.append(mloads('i' + self.read(4)))
598 dispatch[BININT] = load_binint
599
600 def load_binint1(self):
601 self.append(mloads('i' + self.read(1) + '\000\000\000'))
602 dispatch[BININT1] = load_binint1
603
604 def load_binint2(self):
605 self.append(mloads('i' + self.read(2) + '\000\000'))
606 dispatch[BININT2] = load_binint2
Tim Peters2344fae2001-01-15 00:50:52 +0000607
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000608 def load_long(self):
Guido van Rossumff871742000-12-13 18:11:56 +0000609 self.append(long(self.readline()[:-1], 0))
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000610 dispatch[LONG] = load_long
611
612 def load_float(self):
Guido van Rossumff871742000-12-13 18:11:56 +0000613 self.append(float(self.readline()[:-1]))
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000614 dispatch[FLOAT] = load_float
615
Guido van Rossumd3703791998-10-22 20:15:36 +0000616 def load_binfloat(self, unpack=struct.unpack):
617 self.append(unpack('>d', self.read(8))[0])
618 dispatch[BINFLOAT] = load_binfloat
619
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000620 def load_string(self):
Jeremy Hyltonbe467e52000-09-15 15:14:51 +0000621 rep = self.readline()[:-1]
622 if not self._is_string_secure(rep):
623 raise ValueError, "insecure string pickle"
624 self.append(eval(rep,
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000625 {'__builtins__': {}})) # Let's be careful
626 dispatch[STRING] = load_string
627
Jeremy Hyltonbe467e52000-09-15 15:14:51 +0000628 def _is_string_secure(self, s):
629 """Return true if s contains a string that is safe to eval
630
631 The definition of secure string is based on the implementation
632 in cPickle. s is secure as long as it only contains a quoted
633 string and optional trailing whitespace.
634 """
635 q = s[0]
636 if q not in ("'", '"'):
637 return 0
638 # find the closing quote
639 offset = 1
640 i = None
641 while 1:
642 try:
643 i = s.index(q, offset)
644 except ValueError:
645 # if there is an error the first time, there is no
646 # close quote
647 if offset == 1:
648 return 0
649 if s[i-1] != '\\':
650 break
651 # check to see if this one is escaped
652 nslash = 0
653 j = i - 1
654 while j >= offset and s[j] == '\\':
655 j = j - 1
656 nslash = nslash + 1
657 if nslash % 2 == 0:
658 break
659 offset = i + 1
660 for c in s[i+1:]:
661 if ord(c) > 32:
662 return 0
663 return 1
664
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000665 def load_binstring(self):
666 len = mloads('i' + self.read(4))
667 self.append(self.read(len))
668 dispatch[BINSTRING] = load_binstring
669
Guido van Rossumb5f2f1b2000-03-10 23:20:09 +0000670 def load_unicode(self):
671 self.append(unicode(self.readline()[:-1],'raw-unicode-escape'))
672 dispatch[UNICODE] = load_unicode
673
674 def load_binunicode(self):
675 len = mloads('i' + self.read(4))
676 self.append(unicode(self.read(len),'utf-8'))
677 dispatch[BINUNICODE] = load_binunicode
678
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000679 def load_short_binstring(self):
680 len = mloads('i' + self.read(1) + '\000\000\000')
681 self.append(self.read(len))
682 dispatch[SHORT_BINSTRING] = load_short_binstring
683
684 def load_tuple(self):
685 k = self.marker()
686 self.stack[k:] = [tuple(self.stack[k+1:])]
687 dispatch[TUPLE] = load_tuple
688
689 def load_empty_tuple(self):
690 self.stack.append(())
691 dispatch[EMPTY_TUPLE] = load_empty_tuple
692
693 def load_empty_list(self):
694 self.stack.append([])
695 dispatch[EMPTY_LIST] = load_empty_list
696
697 def load_empty_dictionary(self):
698 self.stack.append({})
699 dispatch[EMPTY_DICT] = load_empty_dictionary
700
701 def load_list(self):
702 k = self.marker()
703 self.stack[k:] = [self.stack[k+1:]]
704 dispatch[LIST] = load_list
705
706 def load_dict(self):
707 k = self.marker()
708 d = {}
709 items = self.stack[k+1:]
710 for i in range(0, len(items), 2):
711 key = items[i]
712 value = items[i+1]
713 d[key] = value
714 self.stack[k:] = [d]
715 dispatch[DICT] = load_dict
716
717 def load_inst(self):
718 k = self.marker()
719 args = tuple(self.stack[k+1:])
720 del self.stack[k:]
721 module = self.readline()[:-1]
722 name = self.readline()[:-1]
723 klass = self.find_class(module, name)
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000724 instantiated = 0
725 if (not args and type(klass) is ClassType and
726 not hasattr(klass, "__getinitargs__")):
727 try:
728 value = _EmptyClass()
729 value.__class__ = klass
Guido van Rossumb19e2a31998-04-13 18:08:45 +0000730 instantiated = 1
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000731 except RuntimeError:
732 # In restricted execution, assignment to inst.__class__ is
733 # prohibited
734 pass
735 if not instantiated:
Guido van Rossum743d17e1998-09-15 20:25:57 +0000736 try:
737 value = apply(klass, args)
738 except TypeError, err:
739 raise TypeError, "in constructor for %s: %s" % (
740 klass.__name__, str(err)), sys.exc_info()[2]
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000741 self.append(value)
742 dispatch[INST] = load_inst
743
744 def load_obj(self):
745 stack = self.stack
746 k = self.marker()
747 klass = stack[k + 1]
748 del stack[k + 1]
Tim Peters2344fae2001-01-15 00:50:52 +0000749 args = tuple(stack[k + 1:])
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000750 del stack[k:]
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000751 instantiated = 0
752 if (not args and type(klass) is ClassType and
753 not hasattr(klass, "__getinitargs__")):
754 try:
755 value = _EmptyClass()
756 value.__class__ = klass
757 instantiated = 1
758 except RuntimeError:
759 # In restricted execution, assignment to inst.__class__ is
760 # prohibited
761 pass
762 if not instantiated:
763 value = apply(klass, args)
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000764 self.append(value)
Tim Peters2344fae2001-01-15 00:50:52 +0000765 dispatch[OBJ] = load_obj
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000766
767 def load_global(self):
768 module = self.readline()[:-1]
769 name = self.readline()[:-1]
770 klass = self.find_class(module, name)
771 self.append(klass)
772 dispatch[GLOBAL] = load_global
773
774 def find_class(self, module, name):
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000775 try:
Guido van Rossum397032a1999-03-25 21:58:59 +0000776 __import__(module)
777 mod = sys.modules[module]
778 klass = getattr(mod, name)
779 except (ImportError, KeyError, AttributeError):
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000780 raise SystemError, \
781 "Failed to import class %s from module %s" % \
782 (name, module)
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000783 return klass
784
785 def load_reduce(self):
786 stack = self.stack
787
788 callable = stack[-2]
789 arg_tup = stack[-1]
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000790 del stack[-2:]
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000791
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000792 if type(callable) is not ClassType:
793 if not safe_constructors.has_key(callable):
794 try:
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000795 safe = callable.__safe_for_unpickling__
796 except AttributeError:
797 safe = None
Guido van Rossuma48061a1995-01-10 00:31:14 +0000798
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000799 if (not safe):
Tim Peters2344fae2001-01-15 00:50:52 +0000800 raise UnpicklingError, "%s is not safe for " \
801 "unpickling" % callable
Guido van Rossuma48061a1995-01-10 00:31:14 +0000802
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000803 if arg_tup is None:
804 value = callable.__basicnew__()
805 else:
806 value = apply(callable, arg_tup)
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000807 self.append(value)
808 dispatch[REDUCE] = load_reduce
Guido van Rossuma48061a1995-01-10 00:31:14 +0000809
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000810 def load_pop(self):
811 del self.stack[-1]
812 dispatch[POP] = load_pop
Guido van Rossum7b5430f1995-03-04 22:25:21 +0000813
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000814 def load_pop_mark(self):
815 k = self.marker()
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000816 del self.stack[k:]
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000817 dispatch[POP_MARK] = load_pop_mark
Guido van Rossuma48061a1995-01-10 00:31:14 +0000818
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000819 def load_dup(self):
Guido van Rossumb1062fc1998-03-31 17:00:46 +0000820 self.append(self.stack[-1])
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000821 dispatch[DUP] = load_dup
Guido van Rossuma48061a1995-01-10 00:31:14 +0000822
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000823 def load_get(self):
824 self.append(self.memo[self.readline()[:-1]])
825 dispatch[GET] = load_get
Guido van Rossum78536471996-04-12 13:36:27 +0000826
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000827 def load_binget(self):
828 i = mloads('i' + self.read(1) + '\000\000\000')
829 self.append(self.memo[`i`])
830 dispatch[BINGET] = load_binget
Guido van Rossum78536471996-04-12 13:36:27 +0000831
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000832 def load_long_binget(self):
833 i = mloads('i' + self.read(4))
834 self.append(self.memo[`i`])
835 dispatch[LONG_BINGET] = load_long_binget
Guido van Rossum78536471996-04-12 13:36:27 +0000836
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000837 def load_put(self):
838 self.memo[self.readline()[:-1]] = self.stack[-1]
839 dispatch[PUT] = load_put
Guido van Rossuma48061a1995-01-10 00:31:14 +0000840
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000841 def load_binput(self):
842 i = mloads('i' + self.read(1) + '\000\000\000')
843 self.memo[`i`] = self.stack[-1]
844 dispatch[BINPUT] = load_binput
Guido van Rossuma48061a1995-01-10 00:31:14 +0000845
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000846 def load_long_binput(self):
847 i = mloads('i' + self.read(4))
848 self.memo[`i`] = self.stack[-1]
849 dispatch[LONG_BINPUT] = load_long_binput
Guido van Rossuma48061a1995-01-10 00:31:14 +0000850
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000851 def load_append(self):
852 stack = self.stack
853 value = stack[-1]
854 del stack[-1]
855 list = stack[-1]
856 list.append(value)
857 dispatch[APPEND] = load_append
Guido van Rossuma48061a1995-01-10 00:31:14 +0000858
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000859 def load_appends(self):
860 stack = self.stack
861 mark = self.marker()
862 list = stack[mark - 1]
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000863 for i in range(mark + 1, len(stack)):
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000864 list.append(stack[i])
Guido van Rossum0c891ce1995-03-14 15:09:05 +0000865
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000866 del stack[mark:]
867 dispatch[APPENDS] = load_appends
Tim Peters2344fae2001-01-15 00:50:52 +0000868
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000869 def load_setitem(self):
870 stack = self.stack
871 value = stack[-1]
872 key = stack[-2]
873 del stack[-2:]
874 dict = stack[-1]
875 dict[key] = value
876 dispatch[SETITEM] = load_setitem
Guido van Rossum0c891ce1995-03-14 15:09:05 +0000877
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000878 def load_setitems(self):
879 stack = self.stack
880 mark = self.marker()
881 dict = stack[mark - 1]
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000882 for i in range(mark + 1, len(stack), 2):
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000883 dict[stack[i]] = stack[i + 1]
Guido van Rossuma48061a1995-01-10 00:31:14 +0000884
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000885 del stack[mark:]
886 dispatch[SETITEMS] = load_setitems
Guido van Rossuma48061a1995-01-10 00:31:14 +0000887
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000888 def load_build(self):
889 stack = self.stack
890 value = stack[-1]
891 del stack[-1]
892 inst = stack[-1]
893 try:
894 setstate = inst.__setstate__
895 except AttributeError:
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000896 try:
897 inst.__dict__.update(value)
898 except RuntimeError:
899 # XXX In restricted execution, the instance's __dict__ is not
900 # accessible. Use the old way of unpickling the instance
901 # variables. This is a semantic different when unpickling in
902 # restricted vs. unrestricted modes.
903 for k, v in value.items():
904 setattr(inst, k, v)
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000905 else:
906 setstate(value)
907 dispatch[BUILD] = load_build
Guido van Rossuma48061a1995-01-10 00:31:14 +0000908
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000909 def load_mark(self):
910 self.append(self.mark)
911 dispatch[MARK] = load_mark
Guido van Rossuma48061a1995-01-10 00:31:14 +0000912
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000913 def load_stop(self):
914 value = self.stack[-1]
915 del self.stack[-1]
Guido van Rossumff871742000-12-13 18:11:56 +0000916 raise _Stop(value)
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000917 dispatch[STOP] = load_stop
Guido van Rossuma48061a1995-01-10 00:31:14 +0000918
Guido van Rossume467be61997-12-05 19:42:42 +0000919# Helper class for load_inst/load_obj
920
921class _EmptyClass:
922 pass
Guido van Rossuma48061a1995-01-10 00:31:14 +0000923
Guido van Rossum0c891ce1995-03-14 15:09:05 +0000924# Shorthands
925
Guido van Rossumc7c5e691996-07-22 22:26:07 +0000926from StringIO import StringIO
927
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000928def dump(object, file, bin = 0):
929 Pickler(file, bin).dump(object)
Guido van Rossum0c891ce1995-03-14 15:09:05 +0000930
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000931def dumps(object, bin = 0):
932 file = StringIO()
933 Pickler(file, bin).dump(object)
934 return file.getvalue()
Guido van Rossum0c891ce1995-03-14 15:09:05 +0000935
936def load(file):
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000937 return Unpickler(file).load()
Guido van Rossum0c891ce1995-03-14 15:09:05 +0000938
939def loads(str):
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000940 file = StringIO(str)
941 return Unpickler(file).load()
Guido van Rossum0c891ce1995-03-14 15:09:05 +0000942
943
944# The rest is used for testing only
945
Guido van Rossuma48061a1995-01-10 00:31:14 +0000946class C:
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000947 def __cmp__(self, other):
948 return cmp(self.__dict__, other.__dict__)
Guido van Rossuma48061a1995-01-10 00:31:14 +0000949
950def test():
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000951 fn = 'out'
952 c = C()
953 c.foo = 1
954 c.bar = 2
955 x = [0, 1, 2, 3]
956 y = ('abc', 'abc', c, c)
957 x.append(y)
958 x.append(y)
959 x.append(5)
960 f = open(fn, 'w')
961 F = Pickler(f)
962 F.dump(x)
963 f.close()
964 f = open(fn, 'r')
965 U = Unpickler(f)
966 x2 = U.load()
967 print x
968 print x2
969 print x == x2
970 print map(id, x)
971 print map(id, x2)
972 print F.memo
973 print U.memo
Guido van Rossuma48061a1995-01-10 00:31:14 +0000974
975if __name__ == '__main__':
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000976 test()