blob: a4e442aba8b075038c3084ad2f7119ebc5f0d671 [file] [log] [blame]
Guido van Rossume467be61997-12-05 19:42:42 +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 Rossum743d17e1998-09-15 20:25:57 +000030import string, marshal, sys
Guido van Rossuma48061a1995-01-10 00:31:14 +000031
Guido van Rossumb72cf2d1997-04-09 17:32:51 +000032format_version = "1.2" # File format version we write
33compatible_formats = ["1.0", "1.1"] # Old format versions we can read
34
35mdumps = marshal.dumps
36mloads = marshal.loads
Guido van Rossum0c891ce1995-03-14 15:09:05 +000037
Guido van Rossum7849da81995-03-09 14:08:35 +000038PicklingError = "pickle.PicklingError"
Guido van Rossumb72cf2d1997-04-09 17:32:51 +000039UnpicklingError = "pickle.UnpicklingError"
Guido van Rossum7849da81995-03-09 14:08:35 +000040
Jeremy Hylton2b9d0291998-05-27 22:38:22 +000041try:
42 from org.python.core import PyStringMap
43except ImportError:
44 PyStringMap = None
45
Guido van Rossumb72cf2d1997-04-09 17:32:51 +000046MARK = '('
47STOP = '.'
48POP = '0'
49POP_MARK = '1'
50DUP = '2'
51FLOAT = 'F'
52INT = 'I'
53BININT = 'J'
54BININT1 = 'K'
55LONG = 'L'
56BININT2 = 'M'
57NONE = 'N'
58PERSID = 'P'
59BINPERSID = 'Q'
60REDUCE = 'R'
61STRING = 'S'
62BINSTRING = 'T'
63SHORT_BINSTRING = 'U'
64APPEND = 'a'
65BUILD = 'b'
66GLOBAL = 'c'
67DICT = 'd'
68EMPTY_DICT = '}'
69APPENDS = 'e'
70GET = 'g'
71BINGET = 'h'
72INST = 'i'
73LONG_BINGET = 'j'
74LIST = 'l'
75EMPTY_LIST = ']'
76OBJ = 'o'
77PUT = 'p'
78BINPUT = 'q'
79LONG_BINPUT = 'r'
80SETITEM = 's'
81TUPLE = 't'
82EMPTY_TUPLE = ')'
83SETITEMS = 'u'
Guido van Rossuma48061a1995-01-10 00:31:14 +000084
85class Pickler:
86
Guido van Rossumb72cf2d1997-04-09 17:32:51 +000087 def __init__(self, file, bin = 0):
88 self.write = file.write
89 self.memo = {}
90 self.bin = bin
Guido van Rossuma48061a1995-01-10 00:31:14 +000091
Guido van Rossumb72cf2d1997-04-09 17:32:51 +000092 def dump(self, object):
93 self.save(object)
94 self.write(STOP)
Guido van Rossuma48061a1995-01-10 00:31:14 +000095
Guido van Rossumb72cf2d1997-04-09 17:32:51 +000096 def dump_special(self, callable, args, state = None):
Guido van Rossum45e2fbc1998-03-26 21:13:24 +000097 if type(args) is not TupleType and args is not None:
Guido van Rossumb72cf2d1997-04-09 17:32:51 +000098 raise PicklingError, "Second argument to dump_special " \
99 "must be a tuple"
Guido van Rossuma48061a1995-01-10 00:31:14 +0000100
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000101 self.save_reduce(callable, args, state)
102 self.write(STOP)
Guido van Rossuma48061a1995-01-10 00:31:14 +0000103
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000104 def put(self, i):
105 if (self.bin):
106 s = mdumps(i)[1:]
107 if (i < 256):
108 return BINPUT + s[0]
Guido van Rossuma48061a1995-01-10 00:31:14 +0000109
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000110 return LONG_BINPUT + s
Guido van Rossuma48061a1995-01-10 00:31:14 +0000111
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000112 return PUT + `i` + '\n'
Guido van Rossuma48061a1995-01-10 00:31:14 +0000113
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000114 def get(self, i):
115 if (self.bin):
116 s = mdumps(i)[1:]
Guido van Rossuma48061a1995-01-10 00:31:14 +0000117
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000118 if (i < 256):
119 return BINGET + s[0]
Guido van Rossuma48061a1995-01-10 00:31:14 +0000120
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000121 return LONG_BINGET + s
Guido van Rossuma48061a1995-01-10 00:31:14 +0000122
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000123 return GET + `i` + '\n'
124
125 def save(self, object, pers_save = 0):
126 memo = self.memo
Guido van Rossuma48061a1995-01-10 00:31:14 +0000127
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000128 if (not pers_save):
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000129 pid = self.persistent_id(object)
130 if (pid is not None):
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000131 self.save_pers(pid)
132 return
Guido van Rossuma48061a1995-01-10 00:31:14 +0000133
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000134 d = id(object)
135
136 t = type(object)
Guido van Rossuma48061a1995-01-10 00:31:14 +0000137
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000138 if ((t is TupleType) and (len(object) == 0)):
139 if (self.bin):
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000140 self.save_empty_tuple(object)
141 else:
142 self.save_tuple(object)
143 return
Guido van Rossuma48061a1995-01-10 00:31:14 +0000144
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000145 if memo.has_key(d):
146 self.write(self.get(memo[d][0]))
147 return
148
149 try:
150 f = self.dispatch[t]
151 except KeyError:
152 pid = self.inst_persistent_id(object)
153 if pid is not None:
154 self.save_pers(pid)
155 return
156
157 try:
158 reduce = dispatch_table[t]
159 except KeyError:
160 try:
161 reduce = object.__reduce__
162 except AttributeError:
163 raise PicklingError, \
164 "can't pickle %s objects" % `t.__name__`
165 else:
166 tup = reduce()
167 else:
168 tup = reduce(object)
169
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000170 if type(tup) is StringType:
171 self.save_global(object, tup)
172 return
Guido van Rossumd1f49841997-12-10 23:40:18 +0000173
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000174 if (type(tup) is not TupleType):
175 raise PicklingError, "Value returned by %s must be a " \
176 "tuple" % reduce
177
178 l = len(tup)
179
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000180 if ((l != 2) and (l != 3)):
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000181 raise PicklingError, "tuple returned by %s must contain " \
182 "only two or three elements" % reduce
183
184 callable = tup[0]
185 arg_tup = tup[1]
186
187 if (l > 2):
188 state = tup[2]
189 else:
190 state = None
191
Guido van Rossumd1f49841997-12-10 23:40:18 +0000192 if type(arg_tup) is not TupleType and arg_tup is not None:
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000193 raise PicklingError, "Second element of tuple returned " \
194 "by %s must be a tuple" % reduce
195
196 self.save_reduce(callable, arg_tup, state)
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000197 memo_len = len(memo)
198 self.write(self.put(memo_len))
199 memo[d] = (memo_len, object)
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000200 return
201
202 f(self, object)
203
204 def persistent_id(self, object):
205 return None
206
207 def inst_persistent_id(self, object):
208 return None
209
210 def save_pers(self, pid):
211 if (not self.bin):
212 self.write(PERSID + str(pid) + '\n')
213 else:
214 self.save(pid, 1)
215 self.write(BINPERSID)
216
217 def save_reduce(self, callable, arg_tup, state = None):
218 write = self.write
219 save = self.save
220
221 save(callable)
222 save(arg_tup)
223 write(REDUCE)
224
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000225 if (state is not None):
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000226 save(state)
227 write(BUILD)
228
229 dispatch = {}
230
231 def save_none(self, object):
232 self.write(NONE)
233 dispatch[NoneType] = save_none
234
235 def save_int(self, object):
236 if (self.bin):
237 i = mdumps(object)[1:]
238 if (i[-2:] == '\000\000'):
239 if (i[-3] == '\000'):
240 self.write(BININT1 + i[:-3])
241 return
242
243 self.write(BININT2 + i[:-2])
244 return
245
246 self.write(BININT + i)
247 else:
248 self.write(INT + `object` + '\n')
249 dispatch[IntType] = save_int
250
251 def save_long(self, object):
252 self.write(LONG + `object` + '\n')
253 dispatch[LongType] = save_long
254
255 def save_float(self, object):
256 self.write(FLOAT + `object` + '\n')
257 dispatch[FloatType] = save_float
258
259 def save_string(self, object):
260 d = id(object)
261 memo = self.memo
262
263 if (self.bin):
264 l = len(object)
265 s = mdumps(l)[1:]
266 if (l < 256):
267 self.write(SHORT_BINSTRING + s[0] + object)
268 else:
269 self.write(BINSTRING + s + object)
270 else:
271 self.write(STRING + `object` + '\n')
272
273 memo_len = len(memo)
274 self.write(self.put(memo_len))
275 memo[d] = (memo_len, object)
276 dispatch[StringType] = save_string
277
278 def save_tuple(self, object):
279
280 write = self.write
281 save = self.save
282 memo = self.memo
283
284 d = id(object)
285
286 write(MARK)
287
288 for element in object:
289 save(element)
290
291 if (len(object) and memo.has_key(d)):
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000292 if (self.bin):
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000293 write(POP_MARK + self.get(memo[d][0]))
294 return
295
Guido van Rossum599174f1998-03-31 16:30:28 +0000296 write(POP * (len(object) + 1) + self.get(memo[d][0]))
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000297 return
298
299 memo_len = len(memo)
300 self.write(TUPLE + self.put(memo_len))
301 memo[d] = (memo_len, object)
302 dispatch[TupleType] = save_tuple
303
304 def save_empty_tuple(self, object):
305 self.write(EMPTY_TUPLE)
306
307 def save_list(self, object):
308 d = id(object)
309
310 write = self.write
311 save = self.save
312 memo = self.memo
313
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000314 if (self.bin):
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000315 write(EMPTY_LIST)
316 else:
317 write(MARK + LIST)
318
319 memo_len = len(memo)
320 write(self.put(memo_len))
321 memo[d] = (memo_len, object)
322
323 using_appends = (self.bin and (len(object) > 1))
324
325 if (using_appends):
326 write(MARK)
327
328 for element in object:
329 save(element)
330
331 if (not using_appends):
332 write(APPEND)
333
334 if (using_appends):
335 write(APPENDS)
336 dispatch[ListType] = save_list
337
338 def save_dict(self, object):
339 d = id(object)
340
341 write = self.write
342 save = self.save
343 memo = self.memo
344
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000345 if (self.bin):
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000346 write(EMPTY_DICT)
347 else:
348 write(MARK + DICT)
349
350 memo_len = len(memo)
351 self.write(self.put(memo_len))
352 memo[d] = (memo_len, object)
353
354 using_setitems = (self.bin and (len(object) > 1))
355
356 if (using_setitems):
357 write(MARK)
358
359 items = object.items()
360 for key, value in items:
361 save(key)
362 save(value)
363
364 if (not using_setitems):
365 write(SETITEM)
366
367 if (using_setitems):
368 write(SETITEMS)
369
370 dispatch[DictionaryType] = save_dict
Jeremy Hylton2b9d0291998-05-27 22:38:22 +0000371 if not PyStringMap is None:
372 dispatch[PyStringMap] = save_dict
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000373
374 def save_inst(self, object):
375 d = id(object)
376 cls = object.__class__
377
378 memo = self.memo
379 write = self.write
380 save = self.save
381
382 if hasattr(object, '__getinitargs__'):
383 args = object.__getinitargs__()
384 len(args) # XXX Assert it's a sequence
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000385 _keep_alive(args, memo)
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000386 else:
387 args = ()
388
389 write(MARK)
390
391 if (self.bin):
392 save(cls)
393
394 for arg in args:
395 save(arg)
396
397 memo_len = len(memo)
398 if (self.bin):
399 write(OBJ + self.put(memo_len))
400 else:
Guido van Rossum4fb5b281997-09-12 20:07:24 +0000401 write(INST + cls.__module__ + '\n' + cls.__name__ + '\n' +
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000402 self.put(memo_len))
403
404 memo[d] = (memo_len, object)
405
406 try:
407 getstate = object.__getstate__
408 except AttributeError:
409 stuff = object.__dict__
410 else:
411 stuff = getstate()
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000412 _keep_alive(stuff, memo)
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000413 save(stuff)
414 write(BUILD)
415 dispatch[InstanceType] = save_inst
416
417 def save_global(self, object, name = None):
418 write = self.write
419 memo = self.memo
420
421 if (name is None):
422 name = object.__name__
423
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000424 try:
425 module = object.__module__
426 except AttributeError:
427 module = whichmodule(object, name)
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000428
429 memo_len = len(memo)
430 write(GLOBAL + module + '\n' + name + '\n' +
431 self.put(memo_len))
432 memo[id(object)] = (memo_len, object)
433 dispatch[ClassType] = save_global
434 dispatch[FunctionType] = save_global
435 dispatch[BuiltinFunctionType] = save_global
Guido van Rossum0c891ce1995-03-14 15:09:05 +0000436
Guido van Rossuma48061a1995-01-10 00:31:14 +0000437
Guido van Rossum5ed5c4c1997-09-03 00:23:54 +0000438def _keep_alive(x, memo):
439 """Keeps a reference to the object x in the memo.
440
441 Because we remember objects by their id, we have
442 to assure that possibly temporary objects are kept
443 alive by referencing them.
444 We store a reference at the id of the memo, which should
445 normally not be used unless someone tries to deepcopy
446 the memo itself...
447 """
448 try:
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000449 memo[id(memo)].append(x)
Guido van Rossum5ed5c4c1997-09-03 00:23:54 +0000450 except KeyError:
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000451 # aha, this is the first one :-)
452 memo[id(memo)]=[x]
Guido van Rossum5ed5c4c1997-09-03 00:23:54 +0000453
454
Guido van Rossuma48061a1995-01-10 00:31:14 +0000455classmap = {}
456
Guido van Rossum4fb5b281997-09-12 20:07:24 +0000457# This is no longer used to find classes, but still for functions
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000458def whichmodule(cls, clsname):
459 """Figure out the module in which a class occurs.
Guido van Rossuma48061a1995-01-10 00:31:14 +0000460
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000461 Search sys.modules for the module.
462 Cache in classmap.
463 Return a module name.
464 If the class cannot be found, return __main__.
465 """
466 if classmap.has_key(cls):
467 return classmap[cls]
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000468
469 for name, module in sys.modules.items():
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000470 if name != '__main__' and \
471 hasattr(module, clsname) and \
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000472 getattr(module, clsname) is cls:
473 break
474 else:
475 name = '__main__'
476 classmap[cls] = name
477 return name
Guido van Rossuma48061a1995-01-10 00:31:14 +0000478
479
480class Unpickler:
481
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000482 def __init__(self, file):
483 self.readline = file.readline
484 self.read = file.read
485 self.memo = {}
Guido van Rossuma48061a1995-01-10 00:31:14 +0000486
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000487 def load(self):
488 self.mark = ['spam'] # Any new unique object
489 self.stack = []
490 self.append = self.stack.append
491 read = self.read
492 dispatch = self.dispatch
493 try:
494 while 1:
495 key = read(1)
496 dispatch[key](self)
497 except STOP, value:
498 return value
499
500 def marker(self):
501 stack = self.stack
502 mark = self.mark
503 k = len(stack)-1
504 while stack[k] is not mark: k = k-1
505 return k
506
507 dispatch = {}
508
509 def load_eof(self):
510 raise EOFError
511 dispatch[''] = load_eof
512
513 def load_persid(self):
514 pid = self.readline()[:-1]
515 self.append(self.persistent_load(pid))
516 dispatch[PERSID] = load_persid
517
518 def load_binpersid(self):
519 stack = self.stack
520
521 pid = stack[-1]
522 del stack[-1]
523
524 self.append(self.persistent_load(pid))
525 dispatch[BINPERSID] = load_binpersid
526
527 def load_none(self):
528 self.append(None)
529 dispatch[NONE] = load_none
530
531 def load_int(self):
Guido van Rossume6805461997-12-10 19:36:41 +0000532 self.append(string.atoi(self.readline()[:-1]))
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000533 dispatch[INT] = load_int
534
535 def load_binint(self):
536 self.append(mloads('i' + self.read(4)))
537 dispatch[BININT] = load_binint
538
539 def load_binint1(self):
540 self.append(mloads('i' + self.read(1) + '\000\000\000'))
541 dispatch[BININT1] = load_binint1
542
543 def load_binint2(self):
544 self.append(mloads('i' + self.read(2) + '\000\000'))
545 dispatch[BININT2] = load_binint2
546
547 def load_long(self):
548 self.append(string.atol(self.readline()[:-1], 0))
549 dispatch[LONG] = load_long
550
551 def load_float(self):
552 self.append(string.atof(self.readline()[:-1]))
553 dispatch[FLOAT] = load_float
554
555 def load_string(self):
556 self.append(eval(self.readline()[:-1],
557 {'__builtins__': {}})) # Let's be careful
558 dispatch[STRING] = load_string
559
560 def load_binstring(self):
561 len = mloads('i' + self.read(4))
562 self.append(self.read(len))
563 dispatch[BINSTRING] = load_binstring
564
565 def load_short_binstring(self):
566 len = mloads('i' + self.read(1) + '\000\000\000')
567 self.append(self.read(len))
568 dispatch[SHORT_BINSTRING] = load_short_binstring
569
570 def load_tuple(self):
571 k = self.marker()
572 self.stack[k:] = [tuple(self.stack[k+1:])]
573 dispatch[TUPLE] = load_tuple
574
575 def load_empty_tuple(self):
576 self.stack.append(())
577 dispatch[EMPTY_TUPLE] = load_empty_tuple
578
579 def load_empty_list(self):
580 self.stack.append([])
581 dispatch[EMPTY_LIST] = load_empty_list
582
583 def load_empty_dictionary(self):
584 self.stack.append({})
585 dispatch[EMPTY_DICT] = load_empty_dictionary
586
587 def load_list(self):
588 k = self.marker()
589 self.stack[k:] = [self.stack[k+1:]]
590 dispatch[LIST] = load_list
591
592 def load_dict(self):
593 k = self.marker()
594 d = {}
595 items = self.stack[k+1:]
596 for i in range(0, len(items), 2):
597 key = items[i]
598 value = items[i+1]
599 d[key] = value
600 self.stack[k:] = [d]
601 dispatch[DICT] = load_dict
602
603 def load_inst(self):
604 k = self.marker()
605 args = tuple(self.stack[k+1:])
606 del self.stack[k:]
607 module = self.readline()[:-1]
608 name = self.readline()[:-1]
609 klass = self.find_class(module, name)
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000610 instantiated = 0
611 if (not args and type(klass) is ClassType and
612 not hasattr(klass, "__getinitargs__")):
613 try:
614 value = _EmptyClass()
615 value.__class__ = klass
Guido van Rossumb19e2a31998-04-13 18:08:45 +0000616 instantiated = 1
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000617 except RuntimeError:
618 # In restricted execution, assignment to inst.__class__ is
619 # prohibited
620 pass
621 if not instantiated:
Guido van Rossum743d17e1998-09-15 20:25:57 +0000622 try:
623 value = apply(klass, args)
624 except TypeError, err:
625 raise TypeError, "in constructor for %s: %s" % (
626 klass.__name__, str(err)), sys.exc_info()[2]
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000627 self.append(value)
628 dispatch[INST] = load_inst
629
630 def load_obj(self):
631 stack = self.stack
632 k = self.marker()
633 klass = stack[k + 1]
634 del stack[k + 1]
635 args = tuple(stack[k + 1:])
636 del stack[k:]
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000637 instantiated = 0
638 if (not args and type(klass) is ClassType and
639 not hasattr(klass, "__getinitargs__")):
640 try:
641 value = _EmptyClass()
642 value.__class__ = klass
643 instantiated = 1
644 except RuntimeError:
645 # In restricted execution, assignment to inst.__class__ is
646 # prohibited
647 pass
648 if not instantiated:
649 value = apply(klass, args)
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000650 self.append(value)
651 dispatch[OBJ] = load_obj
652
653 def load_global(self):
654 module = self.readline()[:-1]
655 name = self.readline()[:-1]
656 klass = self.find_class(module, name)
657 self.append(klass)
658 dispatch[GLOBAL] = load_global
659
660 def find_class(self, module, name):
661 env = {}
662
663 try:
664 exec 'from %s import %s' % (module, name) in env
665 except ImportError:
666 raise SystemError, \
667 "Failed to import class %s from module %s" % \
668 (name, module)
669 klass = env[name]
670 return klass
671
672 def load_reduce(self):
673 stack = self.stack
674
675 callable = stack[-2]
676 arg_tup = stack[-1]
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000677 del stack[-2:]
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000678
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000679 if type(callable) is not ClassType:
680 if not safe_constructors.has_key(callable):
681 try:
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000682 safe = callable.__safe_for_unpickling__
683 except AttributeError:
684 safe = None
Guido van Rossuma48061a1995-01-10 00:31:14 +0000685
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000686 if (not safe):
687 raise UnpicklingError, "%s is not safe for " \
688 "unpickling" % callable
Guido van Rossuma48061a1995-01-10 00:31:14 +0000689
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000690 if arg_tup is None:
691 value = callable.__basicnew__()
692 else:
693 value = apply(callable, arg_tup)
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000694 self.append(value)
695 dispatch[REDUCE] = load_reduce
Guido van Rossuma48061a1995-01-10 00:31:14 +0000696
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000697 def load_pop(self):
698 del self.stack[-1]
699 dispatch[POP] = load_pop
Guido van Rossum7b5430f1995-03-04 22:25:21 +0000700
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000701 def load_pop_mark(self):
702 k = self.marker()
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000703 del self.stack[k:]
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000704 dispatch[POP_MARK] = load_pop_mark
Guido van Rossuma48061a1995-01-10 00:31:14 +0000705
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000706 def load_dup(self):
Guido van Rossumb1062fc1998-03-31 17:00:46 +0000707 self.append(self.stack[-1])
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000708 dispatch[DUP] = load_dup
Guido van Rossuma48061a1995-01-10 00:31:14 +0000709
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000710 def load_get(self):
711 self.append(self.memo[self.readline()[:-1]])
712 dispatch[GET] = load_get
Guido van Rossum78536471996-04-12 13:36:27 +0000713
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000714 def load_binget(self):
715 i = mloads('i' + self.read(1) + '\000\000\000')
716 self.append(self.memo[`i`])
717 dispatch[BINGET] = load_binget
Guido van Rossum78536471996-04-12 13:36:27 +0000718
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000719 def load_long_binget(self):
720 i = mloads('i' + self.read(4))
721 self.append(self.memo[`i`])
722 dispatch[LONG_BINGET] = load_long_binget
Guido van Rossum78536471996-04-12 13:36:27 +0000723
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000724 def load_put(self):
725 self.memo[self.readline()[:-1]] = self.stack[-1]
726 dispatch[PUT] = load_put
Guido van Rossuma48061a1995-01-10 00:31:14 +0000727
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000728 def load_binput(self):
729 i = mloads('i' + self.read(1) + '\000\000\000')
730 self.memo[`i`] = self.stack[-1]
731 dispatch[BINPUT] = load_binput
Guido van Rossuma48061a1995-01-10 00:31:14 +0000732
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000733 def load_long_binput(self):
734 i = mloads('i' + self.read(4))
735 self.memo[`i`] = self.stack[-1]
736 dispatch[LONG_BINPUT] = load_long_binput
Guido van Rossuma48061a1995-01-10 00:31:14 +0000737
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000738 def load_append(self):
739 stack = self.stack
740 value = stack[-1]
741 del stack[-1]
742 list = stack[-1]
743 list.append(value)
744 dispatch[APPEND] = load_append
Guido van Rossuma48061a1995-01-10 00:31:14 +0000745
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000746 def load_appends(self):
747 stack = self.stack
748 mark = self.marker()
749 list = stack[mark - 1]
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000750 for i in range(mark + 1, len(stack)):
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000751 list.append(stack[i])
Guido van Rossum0c891ce1995-03-14 15:09:05 +0000752
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000753 del stack[mark:]
754 dispatch[APPENDS] = load_appends
755
756 def load_setitem(self):
757 stack = self.stack
758 value = stack[-1]
759 key = stack[-2]
760 del stack[-2:]
761 dict = stack[-1]
762 dict[key] = value
763 dispatch[SETITEM] = load_setitem
Guido van Rossum0c891ce1995-03-14 15:09:05 +0000764
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000765 def load_setitems(self):
766 stack = self.stack
767 mark = self.marker()
768 dict = stack[mark - 1]
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000769 for i in range(mark + 1, len(stack), 2):
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000770 dict[stack[i]] = stack[i + 1]
Guido van Rossuma48061a1995-01-10 00:31:14 +0000771
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000772 del stack[mark:]
773 dispatch[SETITEMS] = load_setitems
Guido van Rossuma48061a1995-01-10 00:31:14 +0000774
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000775 def load_build(self):
776 stack = self.stack
777 value = stack[-1]
778 del stack[-1]
779 inst = stack[-1]
780 try:
781 setstate = inst.__setstate__
782 except AttributeError:
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000783 try:
784 inst.__dict__.update(value)
785 except RuntimeError:
786 # XXX In restricted execution, the instance's __dict__ is not
787 # accessible. Use the old way of unpickling the instance
788 # variables. This is a semantic different when unpickling in
789 # restricted vs. unrestricted modes.
790 for k, v in value.items():
791 setattr(inst, k, v)
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000792 else:
793 setstate(value)
794 dispatch[BUILD] = load_build
Guido van Rossuma48061a1995-01-10 00:31:14 +0000795
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000796 def load_mark(self):
797 self.append(self.mark)
798 dispatch[MARK] = load_mark
Guido van Rossuma48061a1995-01-10 00:31:14 +0000799
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000800 def load_stop(self):
801 value = self.stack[-1]
802 del self.stack[-1]
803 raise STOP, value
804 dispatch[STOP] = load_stop
Guido van Rossuma48061a1995-01-10 00:31:14 +0000805
Guido van Rossume467be61997-12-05 19:42:42 +0000806# Helper class for load_inst/load_obj
807
808class _EmptyClass:
809 pass
Guido van Rossuma48061a1995-01-10 00:31:14 +0000810
Guido van Rossum0c891ce1995-03-14 15:09:05 +0000811# Shorthands
812
Guido van Rossumc7c5e691996-07-22 22:26:07 +0000813from StringIO import StringIO
814
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000815def dump(object, file, bin = 0):
816 Pickler(file, bin).dump(object)
Guido van Rossum0c891ce1995-03-14 15:09:05 +0000817
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000818def dumps(object, bin = 0):
819 file = StringIO()
820 Pickler(file, bin).dump(object)
821 return file.getvalue()
Guido van Rossum0c891ce1995-03-14 15:09:05 +0000822
823def load(file):
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000824 return Unpickler(file).load()
Guido van Rossum0c891ce1995-03-14 15:09:05 +0000825
826def loads(str):
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000827 file = StringIO(str)
828 return Unpickler(file).load()
Guido van Rossum0c891ce1995-03-14 15:09:05 +0000829
830
831# The rest is used for testing only
832
Guido van Rossuma48061a1995-01-10 00:31:14 +0000833class C:
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000834 def __cmp__(self, other):
835 return cmp(self.__dict__, other.__dict__)
Guido van Rossuma48061a1995-01-10 00:31:14 +0000836
837def test():
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000838 fn = 'out'
839 c = C()
840 c.foo = 1
841 c.bar = 2
842 x = [0, 1, 2, 3]
843 y = ('abc', 'abc', c, c)
844 x.append(y)
845 x.append(y)
846 x.append(5)
847 f = open(fn, 'w')
848 F = Pickler(f)
849 F.dump(x)
850 f.close()
851 f = open(fn, 'r')
852 U = Unpickler(f)
853 x2 = U.load()
854 print x
855 print x2
856 print x == x2
857 print map(id, x)
858 print map(id, x2)
859 print F.memo
860 print U.memo
Guido van Rossuma48061a1995-01-10 00:31:14 +0000861
862if __name__ == '__main__':
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000863 test()