blob: 1ec5b496d49125c10cf9758b1356d834c76db059 [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
Guido van Rossumd3703791998-10-22 20:15:36 +000034format_version = "1.3" # File format version we write
35compatible_formats = ["1.0", "1.1", "1.2"] # Old format versions we can read
Guido van Rossumb72cf2d1997-04-09 17:32:51 +000036
37mdumps = marshal.dumps
38mloads = marshal.loads
Guido van Rossum0c891ce1995-03-14 15:09:05 +000039
Guido van Rossum26e89d02000-06-29 16:15:52 +000040class PickleError(Exception): pass
41class PicklingError(PickleError): pass
42class UnpicklingError(PickleError): pass
Guido van Rossum7849da81995-03-09 14:08:35 +000043
Guido van Rossumff871742000-12-13 18:11:56 +000044class _Stop(Exception):
45 def __init__(self, value):
46 self.value = value
47
Jeremy Hylton2b9d0291998-05-27 22:38:22 +000048try:
49 from org.python.core import PyStringMap
50except ImportError:
51 PyStringMap = None
52
Guido van Rossumb72cf2d1997-04-09 17:32:51 +000053MARK = '('
54STOP = '.'
55POP = '0'
56POP_MARK = '1'
57DUP = '2'
58FLOAT = 'F'
59INT = 'I'
60BININT = 'J'
61BININT1 = 'K'
62LONG = 'L'
63BININT2 = 'M'
64NONE = 'N'
65PERSID = 'P'
66BINPERSID = 'Q'
67REDUCE = 'R'
68STRING = 'S'
69BINSTRING = 'T'
70SHORT_BINSTRING = 'U'
Guido van Rossumb5f2f1b2000-03-10 23:20:09 +000071UNICODE = 'V'
72BINUNICODE = 'X'
Guido van Rossumb72cf2d1997-04-09 17:32:51 +000073APPEND = 'a'
74BUILD = 'b'
75GLOBAL = 'c'
76DICT = 'd'
77EMPTY_DICT = '}'
78APPENDS = 'e'
79GET = 'g'
80BINGET = 'h'
81INST = 'i'
82LONG_BINGET = 'j'
83LIST = 'l'
84EMPTY_LIST = ']'
85OBJ = 'o'
86PUT = 'p'
87BINPUT = 'q'
88LONG_BINPUT = 'r'
89SETITEM = 's'
90TUPLE = 't'
91EMPTY_TUPLE = ')'
92SETITEMS = 'u'
Guido van Rossumd3703791998-10-22 20:15:36 +000093BINFLOAT = 'G'
Guido van Rossuma48061a1995-01-10 00:31:14 +000094
95class Pickler:
96
Guido van Rossumb72cf2d1997-04-09 17:32:51 +000097 def __init__(self, file, bin = 0):
98 self.write = file.write
99 self.memo = {}
100 self.bin = bin
Guido van Rossuma48061a1995-01-10 00:31:14 +0000101
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000102 def dump(self, object):
103 self.save(object)
104 self.write(STOP)
Guido van Rossuma48061a1995-01-10 00:31:14 +0000105
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000106 def put(self, i):
107 if (self.bin):
108 s = mdumps(i)[1:]
109 if (i < 256):
110 return BINPUT + s[0]
Guido van Rossuma48061a1995-01-10 00:31:14 +0000111
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000112 return LONG_BINPUT + s
Guido van Rossuma48061a1995-01-10 00:31:14 +0000113
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000114 return PUT + `i` + '\n'
Guido van Rossuma48061a1995-01-10 00:31:14 +0000115
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000116 def get(self, i):
117 if (self.bin):
118 s = mdumps(i)[1:]
Guido van Rossuma48061a1995-01-10 00:31:14 +0000119
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000120 if (i < 256):
121 return BINGET + s[0]
Guido van Rossuma48061a1995-01-10 00:31:14 +0000122
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000123 return LONG_BINGET + s
Guido van Rossuma48061a1995-01-10 00:31:14 +0000124
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000125 return GET + `i` + '\n'
Tim Peters2344fae2001-01-15 00:50:52 +0000126
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000127 def save(self, object, pers_save = 0):
128 memo = self.memo
Guido van Rossuma48061a1995-01-10 00:31:14 +0000129
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000130 if (not pers_save):
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000131 pid = self.persistent_id(object)
132 if (pid is not None):
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000133 self.save_pers(pid)
134 return
Guido van Rossuma48061a1995-01-10 00:31:14 +0000135
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000136 d = id(object)
Tim Peters2344fae2001-01-15 00:50:52 +0000137
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000138 t = type(object)
Guido van Rossuma48061a1995-01-10 00:31:14 +0000139
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000140 if ((t is TupleType) and (len(object) == 0)):
141 if (self.bin):
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000142 self.save_empty_tuple(object)
143 else:
144 self.save_tuple(object)
145 return
Guido van Rossuma48061a1995-01-10 00:31:14 +0000146
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000147 if memo.has_key(d):
148 self.write(self.get(memo[d][0]))
149 return
150
151 try:
152 f = self.dispatch[t]
153 except KeyError:
154 pid = self.inst_persistent_id(object)
155 if pid is not None:
156 self.save_pers(pid)
157 return
158
159 try:
160 reduce = dispatch_table[t]
161 except KeyError:
162 try:
163 reduce = object.__reduce__
164 except AttributeError:
165 raise PicklingError, \
Guido van Rossum08a92cb1999-10-10 21:14:25 +0000166 "can't pickle %s object: %s" % (`t.__name__`,
167 `object`)
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000168 else:
169 tup = reduce()
170 else:
171 tup = reduce(object)
172
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000173 if type(tup) is StringType:
174 self.save_global(object, tup)
175 return
Guido van Rossumd1f49841997-12-10 23:40:18 +0000176
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000177 if (type(tup) is not TupleType):
178 raise PicklingError, "Value returned by %s must be a " \
179 "tuple" % reduce
180
181 l = len(tup)
Tim Peters2344fae2001-01-15 00:50:52 +0000182
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000183 if ((l != 2) and (l != 3)):
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000184 raise PicklingError, "tuple returned by %s must contain " \
185 "only two or three elements" % reduce
186
187 callable = tup[0]
188 arg_tup = tup[1]
Tim Peters2344fae2001-01-15 00:50:52 +0000189
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000190 if (l > 2):
191 state = tup[2]
192 else:
193 state = None
194
Guido van Rossumd1f49841997-12-10 23:40:18 +0000195 if type(arg_tup) is not TupleType and arg_tup is not None:
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000196 raise PicklingError, "Second element of tuple returned " \
197 "by %s must be a tuple" % reduce
198
Tim Peters2344fae2001-01-15 00:50:52 +0000199 self.save_reduce(callable, arg_tup, state)
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000200 memo_len = len(memo)
201 self.write(self.put(memo_len))
202 memo[d] = (memo_len, object)
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000203 return
204
205 f(self, object)
206
207 def persistent_id(self, object):
208 return None
209
210 def inst_persistent_id(self, object):
211 return None
212
213 def save_pers(self, pid):
214 if (not self.bin):
215 self.write(PERSID + str(pid) + '\n')
216 else:
217 self.save(pid, 1)
218 self.write(BINPERSID)
219
220 def save_reduce(self, callable, arg_tup, state = None):
221 write = self.write
222 save = self.save
223
224 save(callable)
225 save(arg_tup)
226 write(REDUCE)
Tim Peters2344fae2001-01-15 00:50:52 +0000227
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000228 if (state is not None):
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000229 save(state)
230 write(BUILD)
231
232 dispatch = {}
233
234 def save_none(self, object):
235 self.write(NONE)
236 dispatch[NoneType] = save_none
237
238 def save_int(self, object):
239 if (self.bin):
240 i = mdumps(object)[1:]
241 if (i[-2:] == '\000\000'):
242 if (i[-3] == '\000'):
243 self.write(BININT1 + i[:-3])
244 return
245
246 self.write(BININT2 + i[:-2])
247 return
248
249 self.write(BININT + i)
250 else:
251 self.write(INT + `object` + '\n')
252 dispatch[IntType] = save_int
253
254 def save_long(self, object):
255 self.write(LONG + `object` + '\n')
256 dispatch[LongType] = save_long
257
Guido van Rossumd3703791998-10-22 20:15:36 +0000258 def save_float(self, object, pack=struct.pack):
259 if self.bin:
260 self.write(BINFLOAT + pack('>d', object))
261 else:
262 self.write(FLOAT + `object` + '\n')
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000263 dispatch[FloatType] = save_float
264
265 def save_string(self, object):
266 d = id(object)
267 memo = self.memo
268
269 if (self.bin):
270 l = len(object)
271 s = mdumps(l)[1:]
272 if (l < 256):
273 self.write(SHORT_BINSTRING + s[0] + object)
274 else:
275 self.write(BINSTRING + s + object)
276 else:
277 self.write(STRING + `object` + '\n')
278
279 memo_len = len(memo)
280 self.write(self.put(memo_len))
281 memo[d] = (memo_len, object)
282 dispatch[StringType] = save_string
283
Guido van Rossumb5f2f1b2000-03-10 23:20:09 +0000284 def save_unicode(self, object):
285 d = id(object)
286 memo = self.memo
287
288 if (self.bin):
289 encoding = object.encode('utf-8')
290 l = len(encoding)
291 s = mdumps(l)[1:]
292 self.write(BINUNICODE + s + encoding)
293 else:
Guido van Rossuma31b4ef2000-12-19 01:29:00 +0000294 object = object.replace(u"\\", u"\\u005c")
295 object = object.replace(u"\n", u"\\u000a")
Guido van Rossumb5f2f1b2000-03-10 23:20:09 +0000296 self.write(UNICODE + object.encode('raw-unicode-escape') + '\n')
297
298 memo_len = len(memo)
299 self.write(self.put(memo_len))
300 memo[d] = (memo_len, object)
301 dispatch[UnicodeType] = save_unicode
302
Guido van Rossum31584cb2001-01-22 14:53:29 +0000303 if StringType == UnicodeType:
304 # This is true for Jython
305 def save_string(self, object):
306 d = id(object)
307 memo = self.memo
308 unicode = object.isunicode()
309
310 if (self.bin):
311 if unicode:
312 object = object.encode("utf-8")
313 l = len(object)
314 s = mdumps(l)[1:]
315 if (l < 256 and not unicode):
316 self.write(SHORT_BINSTRING + s[0] + object)
317 else:
318 if unicode:
319 self.write(BINUNICODE + s + object)
320 else:
321 self.write(BINSTRING + s + object)
322 else:
323 if unicode:
324 object = object.replace(u"\\", u"\\u005c")
325 object = object.replace(u"\n", u"\\u000a")
326 object = object.encode('raw-unicode-escape')
327 self.write(UNICODE + object + '\n')
328 else:
329 self.write(STRING + `object` + '\n')
330
331 memo_len = len(memo)
332 self.write(self.put(memo_len))
333 memo[d] = (memo_len, object)
334 dispatch[StringType] = save_string
335
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000336 def save_tuple(self, object):
337
338 write = self.write
339 save = self.save
340 memo = self.memo
341
342 d = id(object)
343
344 write(MARK)
345
346 for element in object:
347 save(element)
348
349 if (len(object) and memo.has_key(d)):
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000350 if (self.bin):
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000351 write(POP_MARK + self.get(memo[d][0]))
352 return
Tim Peters2344fae2001-01-15 00:50:52 +0000353
Guido van Rossum599174f1998-03-31 16:30:28 +0000354 write(POP * (len(object) + 1) + self.get(memo[d][0]))
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000355 return
356
357 memo_len = len(memo)
358 self.write(TUPLE + self.put(memo_len))
359 memo[d] = (memo_len, object)
360 dispatch[TupleType] = save_tuple
361
362 def save_empty_tuple(self, object):
363 self.write(EMPTY_TUPLE)
364
365 def save_list(self, object):
366 d = id(object)
367
368 write = self.write
369 save = self.save
370 memo = self.memo
371
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000372 if (self.bin):
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000373 write(EMPTY_LIST)
374 else:
375 write(MARK + LIST)
376
377 memo_len = len(memo)
378 write(self.put(memo_len))
379 memo[d] = (memo_len, object)
380
381 using_appends = (self.bin and (len(object) > 1))
382
383 if (using_appends):
384 write(MARK)
385
386 for element in object:
387 save(element)
Tim Peters2344fae2001-01-15 00:50:52 +0000388
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000389 if (not using_appends):
390 write(APPEND)
391
392 if (using_appends):
393 write(APPENDS)
394 dispatch[ListType] = save_list
395
396 def save_dict(self, object):
397 d = id(object)
398
399 write = self.write
400 save = self.save
401 memo = self.memo
402
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000403 if (self.bin):
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000404 write(EMPTY_DICT)
405 else:
406 write(MARK + DICT)
407
408 memo_len = len(memo)
409 self.write(self.put(memo_len))
410 memo[d] = (memo_len, object)
411
412 using_setitems = (self.bin and (len(object) > 1))
413
414 if (using_setitems):
415 write(MARK)
416
417 items = object.items()
418 for key, value in items:
419 save(key)
420 save(value)
421
422 if (not using_setitems):
423 write(SETITEM)
424
425 if (using_setitems):
426 write(SETITEMS)
427
428 dispatch[DictionaryType] = save_dict
Jeremy Hylton2b9d0291998-05-27 22:38:22 +0000429 if not PyStringMap is None:
430 dispatch[PyStringMap] = save_dict
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000431
432 def save_inst(self, object):
433 d = id(object)
434 cls = object.__class__
435
436 memo = self.memo
437 write = self.write
438 save = self.save
439
440 if hasattr(object, '__getinitargs__'):
441 args = object.__getinitargs__()
442 len(args) # XXX Assert it's a sequence
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000443 _keep_alive(args, memo)
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000444 else:
445 args = ()
446
447 write(MARK)
448
449 if (self.bin):
450 save(cls)
451
452 for arg in args:
453 save(arg)
454
455 memo_len = len(memo)
456 if (self.bin):
457 write(OBJ + self.put(memo_len))
458 else:
Guido van Rossum4fb5b281997-09-12 20:07:24 +0000459 write(INST + cls.__module__ + '\n' + cls.__name__ + '\n' +
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000460 self.put(memo_len))
461
462 memo[d] = (memo_len, object)
463
464 try:
465 getstate = object.__getstate__
466 except AttributeError:
467 stuff = object.__dict__
468 else:
469 stuff = getstate()
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000470 _keep_alive(stuff, memo)
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000471 save(stuff)
472 write(BUILD)
473 dispatch[InstanceType] = save_inst
474
475 def save_global(self, object, name = None):
476 write = self.write
477 memo = self.memo
478
479 if (name is None):
480 name = object.__name__
481
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000482 try:
483 module = object.__module__
484 except AttributeError:
485 module = whichmodule(object, name)
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000486
487 memo_len = len(memo)
488 write(GLOBAL + module + '\n' + name + '\n' +
489 self.put(memo_len))
490 memo[id(object)] = (memo_len, object)
491 dispatch[ClassType] = save_global
492 dispatch[FunctionType] = save_global
493 dispatch[BuiltinFunctionType] = save_global
Guido van Rossum0c891ce1995-03-14 15:09:05 +0000494
Guido van Rossuma48061a1995-01-10 00:31:14 +0000495
Guido van Rossum5ed5c4c1997-09-03 00:23:54 +0000496def _keep_alive(x, memo):
497 """Keeps a reference to the object x in the memo.
498
499 Because we remember objects by their id, we have
500 to assure that possibly temporary objects are kept
501 alive by referencing them.
502 We store a reference at the id of the memo, which should
503 normally not be used unless someone tries to deepcopy
504 the memo itself...
505 """
506 try:
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000507 memo[id(memo)].append(x)
Guido van Rossum5ed5c4c1997-09-03 00:23:54 +0000508 except KeyError:
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000509 # aha, this is the first one :-)
510 memo[id(memo)]=[x]
Guido van Rossum5ed5c4c1997-09-03 00:23:54 +0000511
512
Guido van Rossuma48061a1995-01-10 00:31:14 +0000513classmap = {}
514
Guido van Rossum4fb5b281997-09-12 20:07:24 +0000515# This is no longer used to find classes, but still for functions
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000516def whichmodule(cls, clsname):
517 """Figure out the module in which a class occurs.
Guido van Rossuma48061a1995-01-10 00:31:14 +0000518
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000519 Search sys.modules for the module.
520 Cache in classmap.
521 Return a module name.
522 If the class cannot be found, return __main__.
523 """
524 if classmap.has_key(cls):
525 return classmap[cls]
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000526
527 for name, module in sys.modules.items():
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000528 if name != '__main__' and \
529 hasattr(module, clsname) and \
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000530 getattr(module, clsname) is cls:
531 break
532 else:
533 name = '__main__'
534 classmap[cls] = name
535 return name
Guido van Rossuma48061a1995-01-10 00:31:14 +0000536
537
538class Unpickler:
539
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000540 def __init__(self, file):
541 self.readline = file.readline
542 self.read = file.read
543 self.memo = {}
Guido van Rossuma48061a1995-01-10 00:31:14 +0000544
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000545 def load(self):
546 self.mark = ['spam'] # Any new unique object
547 self.stack = []
548 self.append = self.stack.append
549 read = self.read
550 dispatch = self.dispatch
551 try:
552 while 1:
553 key = read(1)
554 dispatch[key](self)
Guido van Rossumff871742000-12-13 18:11:56 +0000555 except _Stop, stopinst:
556 return stopinst.value
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000557
558 def marker(self):
559 stack = self.stack
560 mark = self.mark
561 k = len(stack)-1
562 while stack[k] is not mark: k = k-1
563 return k
564
565 dispatch = {}
566
567 def load_eof(self):
568 raise EOFError
569 dispatch[''] = load_eof
570
571 def load_persid(self):
572 pid = self.readline()[:-1]
573 self.append(self.persistent_load(pid))
574 dispatch[PERSID] = load_persid
575
576 def load_binpersid(self):
577 stack = self.stack
Tim Peters2344fae2001-01-15 00:50:52 +0000578
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000579 pid = stack[-1]
580 del stack[-1]
581
582 self.append(self.persistent_load(pid))
583 dispatch[BINPERSID] = load_binpersid
584
585 def load_none(self):
586 self.append(None)
587 dispatch[NONE] = load_none
588
589 def load_int(self):
Guido van Rossumff871742000-12-13 18:11:56 +0000590 self.append(int(self.readline()[:-1]))
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000591 dispatch[INT] = load_int
592
593 def load_binint(self):
594 self.append(mloads('i' + self.read(4)))
595 dispatch[BININT] = load_binint
596
597 def load_binint1(self):
598 self.append(mloads('i' + self.read(1) + '\000\000\000'))
599 dispatch[BININT1] = load_binint1
600
601 def load_binint2(self):
602 self.append(mloads('i' + self.read(2) + '\000\000'))
603 dispatch[BININT2] = load_binint2
Tim Peters2344fae2001-01-15 00:50:52 +0000604
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000605 def load_long(self):
Guido van Rossumff871742000-12-13 18:11:56 +0000606 self.append(long(self.readline()[:-1], 0))
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000607 dispatch[LONG] = load_long
608
609 def load_float(self):
Guido van Rossumff871742000-12-13 18:11:56 +0000610 self.append(float(self.readline()[:-1]))
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000611 dispatch[FLOAT] = load_float
612
Guido van Rossumd3703791998-10-22 20:15:36 +0000613 def load_binfloat(self, unpack=struct.unpack):
614 self.append(unpack('>d', self.read(8))[0])
615 dispatch[BINFLOAT] = load_binfloat
616
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000617 def load_string(self):
Jeremy Hyltonbe467e52000-09-15 15:14:51 +0000618 rep = self.readline()[:-1]
619 if not self._is_string_secure(rep):
620 raise ValueError, "insecure string pickle"
621 self.append(eval(rep,
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000622 {'__builtins__': {}})) # Let's be careful
623 dispatch[STRING] = load_string
624
Jeremy Hyltonbe467e52000-09-15 15:14:51 +0000625 def _is_string_secure(self, s):
626 """Return true if s contains a string that is safe to eval
627
628 The definition of secure string is based on the implementation
629 in cPickle. s is secure as long as it only contains a quoted
630 string and optional trailing whitespace.
631 """
632 q = s[0]
633 if q not in ("'", '"'):
634 return 0
635 # find the closing quote
636 offset = 1
637 i = None
638 while 1:
639 try:
640 i = s.index(q, offset)
641 except ValueError:
642 # if there is an error the first time, there is no
643 # close quote
644 if offset == 1:
645 return 0
646 if s[i-1] != '\\':
647 break
648 # check to see if this one is escaped
649 nslash = 0
650 j = i - 1
651 while j >= offset and s[j] == '\\':
652 j = j - 1
653 nslash = nslash + 1
654 if nslash % 2 == 0:
655 break
656 offset = i + 1
657 for c in s[i+1:]:
658 if ord(c) > 32:
659 return 0
660 return 1
661
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000662 def load_binstring(self):
663 len = mloads('i' + self.read(4))
664 self.append(self.read(len))
665 dispatch[BINSTRING] = load_binstring
666
Guido van Rossumb5f2f1b2000-03-10 23:20:09 +0000667 def load_unicode(self):
668 self.append(unicode(self.readline()[:-1],'raw-unicode-escape'))
669 dispatch[UNICODE] = load_unicode
670
671 def load_binunicode(self):
672 len = mloads('i' + self.read(4))
673 self.append(unicode(self.read(len),'utf-8'))
674 dispatch[BINUNICODE] = load_binunicode
675
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000676 def load_short_binstring(self):
677 len = mloads('i' + self.read(1) + '\000\000\000')
678 self.append(self.read(len))
679 dispatch[SHORT_BINSTRING] = load_short_binstring
680
681 def load_tuple(self):
682 k = self.marker()
683 self.stack[k:] = [tuple(self.stack[k+1:])]
684 dispatch[TUPLE] = load_tuple
685
686 def load_empty_tuple(self):
687 self.stack.append(())
688 dispatch[EMPTY_TUPLE] = load_empty_tuple
689
690 def load_empty_list(self):
691 self.stack.append([])
692 dispatch[EMPTY_LIST] = load_empty_list
693
694 def load_empty_dictionary(self):
695 self.stack.append({})
696 dispatch[EMPTY_DICT] = load_empty_dictionary
697
698 def load_list(self):
699 k = self.marker()
700 self.stack[k:] = [self.stack[k+1:]]
701 dispatch[LIST] = load_list
702
703 def load_dict(self):
704 k = self.marker()
705 d = {}
706 items = self.stack[k+1:]
707 for i in range(0, len(items), 2):
708 key = items[i]
709 value = items[i+1]
710 d[key] = value
711 self.stack[k:] = [d]
712 dispatch[DICT] = load_dict
713
714 def load_inst(self):
715 k = self.marker()
716 args = tuple(self.stack[k+1:])
717 del self.stack[k:]
718 module = self.readline()[:-1]
719 name = self.readline()[:-1]
720 klass = self.find_class(module, name)
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000721 instantiated = 0
722 if (not args and type(klass) is ClassType and
723 not hasattr(klass, "__getinitargs__")):
724 try:
725 value = _EmptyClass()
726 value.__class__ = klass
Guido van Rossumb19e2a31998-04-13 18:08:45 +0000727 instantiated = 1
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000728 except RuntimeError:
729 # In restricted execution, assignment to inst.__class__ is
730 # prohibited
731 pass
732 if not instantiated:
Guido van Rossum743d17e1998-09-15 20:25:57 +0000733 try:
734 value = apply(klass, args)
735 except TypeError, err:
736 raise TypeError, "in constructor for %s: %s" % (
737 klass.__name__, str(err)), sys.exc_info()[2]
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000738 self.append(value)
739 dispatch[INST] = load_inst
740
741 def load_obj(self):
742 stack = self.stack
743 k = self.marker()
744 klass = stack[k + 1]
745 del stack[k + 1]
Tim Peters2344fae2001-01-15 00:50:52 +0000746 args = tuple(stack[k + 1:])
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000747 del stack[k:]
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000748 instantiated = 0
749 if (not args and type(klass) is ClassType and
750 not hasattr(klass, "__getinitargs__")):
751 try:
752 value = _EmptyClass()
753 value.__class__ = klass
754 instantiated = 1
755 except RuntimeError:
756 # In restricted execution, assignment to inst.__class__ is
757 # prohibited
758 pass
759 if not instantiated:
760 value = apply(klass, args)
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000761 self.append(value)
Tim Peters2344fae2001-01-15 00:50:52 +0000762 dispatch[OBJ] = load_obj
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000763
764 def load_global(self):
765 module = self.readline()[:-1]
766 name = self.readline()[:-1]
767 klass = self.find_class(module, name)
768 self.append(klass)
769 dispatch[GLOBAL] = load_global
770
771 def find_class(self, module, name):
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000772 try:
Guido van Rossum397032a1999-03-25 21:58:59 +0000773 __import__(module)
774 mod = sys.modules[module]
775 klass = getattr(mod, name)
776 except (ImportError, KeyError, AttributeError):
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000777 raise SystemError, \
778 "Failed to import class %s from module %s" % \
779 (name, module)
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000780 return klass
781
782 def load_reduce(self):
783 stack = self.stack
784
785 callable = stack[-2]
786 arg_tup = stack[-1]
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000787 del stack[-2:]
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000788
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000789 if type(callable) is not ClassType:
790 if not safe_constructors.has_key(callable):
791 try:
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000792 safe = callable.__safe_for_unpickling__
793 except AttributeError:
794 safe = None
Guido van Rossuma48061a1995-01-10 00:31:14 +0000795
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000796 if (not safe):
Tim Peters2344fae2001-01-15 00:50:52 +0000797 raise UnpicklingError, "%s is not safe for " \
798 "unpickling" % callable
Guido van Rossuma48061a1995-01-10 00:31:14 +0000799
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000800 if arg_tup is None:
801 value = callable.__basicnew__()
802 else:
803 value = apply(callable, arg_tup)
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000804 self.append(value)
805 dispatch[REDUCE] = load_reduce
Guido van Rossuma48061a1995-01-10 00:31:14 +0000806
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000807 def load_pop(self):
808 del self.stack[-1]
809 dispatch[POP] = load_pop
Guido van Rossum7b5430f1995-03-04 22:25:21 +0000810
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000811 def load_pop_mark(self):
812 k = self.marker()
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000813 del self.stack[k:]
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000814 dispatch[POP_MARK] = load_pop_mark
Guido van Rossuma48061a1995-01-10 00:31:14 +0000815
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000816 def load_dup(self):
Guido van Rossumb1062fc1998-03-31 17:00:46 +0000817 self.append(self.stack[-1])
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000818 dispatch[DUP] = load_dup
Guido van Rossuma48061a1995-01-10 00:31:14 +0000819
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000820 def load_get(self):
821 self.append(self.memo[self.readline()[:-1]])
822 dispatch[GET] = load_get
Guido van Rossum78536471996-04-12 13:36:27 +0000823
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000824 def load_binget(self):
825 i = mloads('i' + self.read(1) + '\000\000\000')
826 self.append(self.memo[`i`])
827 dispatch[BINGET] = load_binget
Guido van Rossum78536471996-04-12 13:36:27 +0000828
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000829 def load_long_binget(self):
830 i = mloads('i' + self.read(4))
831 self.append(self.memo[`i`])
832 dispatch[LONG_BINGET] = load_long_binget
Guido van Rossum78536471996-04-12 13:36:27 +0000833
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000834 def load_put(self):
835 self.memo[self.readline()[:-1]] = self.stack[-1]
836 dispatch[PUT] = load_put
Guido van Rossuma48061a1995-01-10 00:31:14 +0000837
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000838 def load_binput(self):
839 i = mloads('i' + self.read(1) + '\000\000\000')
840 self.memo[`i`] = self.stack[-1]
841 dispatch[BINPUT] = load_binput
Guido van Rossuma48061a1995-01-10 00:31:14 +0000842
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000843 def load_long_binput(self):
844 i = mloads('i' + self.read(4))
845 self.memo[`i`] = self.stack[-1]
846 dispatch[LONG_BINPUT] = load_long_binput
Guido van Rossuma48061a1995-01-10 00:31:14 +0000847
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000848 def load_append(self):
849 stack = self.stack
850 value = stack[-1]
851 del stack[-1]
852 list = stack[-1]
853 list.append(value)
854 dispatch[APPEND] = load_append
Guido van Rossuma48061a1995-01-10 00:31:14 +0000855
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000856 def load_appends(self):
857 stack = self.stack
858 mark = self.marker()
859 list = stack[mark - 1]
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000860 for i in range(mark + 1, len(stack)):
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000861 list.append(stack[i])
Guido van Rossum0c891ce1995-03-14 15:09:05 +0000862
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000863 del stack[mark:]
864 dispatch[APPENDS] = load_appends
Tim Peters2344fae2001-01-15 00:50:52 +0000865
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000866 def load_setitem(self):
867 stack = self.stack
868 value = stack[-1]
869 key = stack[-2]
870 del stack[-2:]
871 dict = stack[-1]
872 dict[key] = value
873 dispatch[SETITEM] = load_setitem
Guido van Rossum0c891ce1995-03-14 15:09:05 +0000874
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000875 def load_setitems(self):
876 stack = self.stack
877 mark = self.marker()
878 dict = stack[mark - 1]
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000879 for i in range(mark + 1, len(stack), 2):
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000880 dict[stack[i]] = stack[i + 1]
Guido van Rossuma48061a1995-01-10 00:31:14 +0000881
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000882 del stack[mark:]
883 dispatch[SETITEMS] = load_setitems
Guido van Rossuma48061a1995-01-10 00:31:14 +0000884
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000885 def load_build(self):
886 stack = self.stack
887 value = stack[-1]
888 del stack[-1]
889 inst = stack[-1]
890 try:
891 setstate = inst.__setstate__
892 except AttributeError:
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000893 try:
894 inst.__dict__.update(value)
895 except RuntimeError:
896 # XXX In restricted execution, the instance's __dict__ is not
897 # accessible. Use the old way of unpickling the instance
898 # variables. This is a semantic different when unpickling in
899 # restricted vs. unrestricted modes.
900 for k, v in value.items():
901 setattr(inst, k, v)
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000902 else:
903 setstate(value)
904 dispatch[BUILD] = load_build
Guido van Rossuma48061a1995-01-10 00:31:14 +0000905
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000906 def load_mark(self):
907 self.append(self.mark)
908 dispatch[MARK] = load_mark
Guido van Rossuma48061a1995-01-10 00:31:14 +0000909
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000910 def load_stop(self):
911 value = self.stack[-1]
912 del self.stack[-1]
Guido van Rossumff871742000-12-13 18:11:56 +0000913 raise _Stop(value)
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000914 dispatch[STOP] = load_stop
Guido van Rossuma48061a1995-01-10 00:31:14 +0000915
Guido van Rossume467be61997-12-05 19:42:42 +0000916# Helper class for load_inst/load_obj
917
918class _EmptyClass:
919 pass
Guido van Rossuma48061a1995-01-10 00:31:14 +0000920
Guido van Rossum0c891ce1995-03-14 15:09:05 +0000921# Shorthands
922
Guido van Rossumc7c5e691996-07-22 22:26:07 +0000923from StringIO import StringIO
924
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000925def dump(object, file, bin = 0):
926 Pickler(file, bin).dump(object)
Guido van Rossum0c891ce1995-03-14 15:09:05 +0000927
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000928def dumps(object, bin = 0):
929 file = StringIO()
930 Pickler(file, bin).dump(object)
931 return file.getvalue()
Guido van Rossum0c891ce1995-03-14 15:09:05 +0000932
933def load(file):
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000934 return Unpickler(file).load()
Guido van Rossum0c891ce1995-03-14 15:09:05 +0000935
936def loads(str):
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000937 file = StringIO(str)
938 return Unpickler(file).load()
Guido van Rossum0c891ce1995-03-14 15:09:05 +0000939
940
941# The rest is used for testing only
942
Guido van Rossuma48061a1995-01-10 00:31:14 +0000943class C:
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000944 def __cmp__(self, other):
945 return cmp(self.__dict__, other.__dict__)
Guido van Rossuma48061a1995-01-10 00:31:14 +0000946
947def test():
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000948 fn = 'out'
949 c = C()
950 c.foo = 1
951 c.bar = 2
952 x = [0, 1, 2, 3]
953 y = ('abc', 'abc', c, c)
954 x.append(y)
955 x.append(y)
956 x.append(5)
957 f = open(fn, 'w')
958 F = Pickler(f)
959 F.dump(x)
960 f.close()
961 f = open(fn, 'r')
962 U = Unpickler(f)
963 x2 = U.load()
964 print x
965 print x2
966 print x == x2
967 print map(id, x)
968 print map(id, x2)
969 print F.memo
970 print U.memo
Guido van Rossuma48061a1995-01-10 00:31:14 +0000971
972if __name__ == '__main__':
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000973 test()