blob: c26c2e533ffbd08ae3972f82971df680f9518b09 [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'
126
127 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)
137
138 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)
182
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]
189
190 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
199 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)
227
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:
294 self.write(UNICODE + object.encode('raw-unicode-escape') + '\n')
295
296 memo_len = len(memo)
297 self.write(self.put(memo_len))
298 memo[d] = (memo_len, object)
299 dispatch[UnicodeType] = save_unicode
300
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000301 def save_tuple(self, object):
302
303 write = self.write
304 save = self.save
305 memo = self.memo
306
307 d = id(object)
308
309 write(MARK)
310
311 for element in object:
312 save(element)
313
314 if (len(object) and memo.has_key(d)):
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000315 if (self.bin):
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000316 write(POP_MARK + self.get(memo[d][0]))
317 return
318
Guido van Rossum599174f1998-03-31 16:30:28 +0000319 write(POP * (len(object) + 1) + self.get(memo[d][0]))
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000320 return
321
322 memo_len = len(memo)
323 self.write(TUPLE + self.put(memo_len))
324 memo[d] = (memo_len, object)
325 dispatch[TupleType] = save_tuple
326
327 def save_empty_tuple(self, object):
328 self.write(EMPTY_TUPLE)
329
330 def save_list(self, object):
331 d = id(object)
332
333 write = self.write
334 save = self.save
335 memo = self.memo
336
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000337 if (self.bin):
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000338 write(EMPTY_LIST)
339 else:
340 write(MARK + LIST)
341
342 memo_len = len(memo)
343 write(self.put(memo_len))
344 memo[d] = (memo_len, object)
345
346 using_appends = (self.bin and (len(object) > 1))
347
348 if (using_appends):
349 write(MARK)
350
351 for element in object:
352 save(element)
353
354 if (not using_appends):
355 write(APPEND)
356
357 if (using_appends):
358 write(APPENDS)
359 dispatch[ListType] = save_list
360
361 def save_dict(self, object):
362 d = id(object)
363
364 write = self.write
365 save = self.save
366 memo = self.memo
367
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000368 if (self.bin):
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000369 write(EMPTY_DICT)
370 else:
371 write(MARK + DICT)
372
373 memo_len = len(memo)
374 self.write(self.put(memo_len))
375 memo[d] = (memo_len, object)
376
377 using_setitems = (self.bin and (len(object) > 1))
378
379 if (using_setitems):
380 write(MARK)
381
382 items = object.items()
383 for key, value in items:
384 save(key)
385 save(value)
386
387 if (not using_setitems):
388 write(SETITEM)
389
390 if (using_setitems):
391 write(SETITEMS)
392
393 dispatch[DictionaryType] = save_dict
Jeremy Hylton2b9d0291998-05-27 22:38:22 +0000394 if not PyStringMap is None:
395 dispatch[PyStringMap] = save_dict
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000396
397 def save_inst(self, object):
398 d = id(object)
399 cls = object.__class__
400
401 memo = self.memo
402 write = self.write
403 save = self.save
404
405 if hasattr(object, '__getinitargs__'):
406 args = object.__getinitargs__()
407 len(args) # XXX Assert it's a sequence
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000408 _keep_alive(args, memo)
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000409 else:
410 args = ()
411
412 write(MARK)
413
414 if (self.bin):
415 save(cls)
416
417 for arg in args:
418 save(arg)
419
420 memo_len = len(memo)
421 if (self.bin):
422 write(OBJ + self.put(memo_len))
423 else:
Guido van Rossum4fb5b281997-09-12 20:07:24 +0000424 write(INST + cls.__module__ + '\n' + cls.__name__ + '\n' +
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000425 self.put(memo_len))
426
427 memo[d] = (memo_len, object)
428
429 try:
430 getstate = object.__getstate__
431 except AttributeError:
432 stuff = object.__dict__
433 else:
434 stuff = getstate()
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000435 _keep_alive(stuff, memo)
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000436 save(stuff)
437 write(BUILD)
438 dispatch[InstanceType] = save_inst
439
440 def save_global(self, object, name = None):
441 write = self.write
442 memo = self.memo
443
444 if (name is None):
445 name = object.__name__
446
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000447 try:
448 module = object.__module__
449 except AttributeError:
450 module = whichmodule(object, name)
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000451
452 memo_len = len(memo)
453 write(GLOBAL + module + '\n' + name + '\n' +
454 self.put(memo_len))
455 memo[id(object)] = (memo_len, object)
456 dispatch[ClassType] = save_global
457 dispatch[FunctionType] = save_global
458 dispatch[BuiltinFunctionType] = save_global
Guido van Rossum0c891ce1995-03-14 15:09:05 +0000459
Guido van Rossuma48061a1995-01-10 00:31:14 +0000460
Guido van Rossum5ed5c4c1997-09-03 00:23:54 +0000461def _keep_alive(x, memo):
462 """Keeps a reference to the object x in the memo.
463
464 Because we remember objects by their id, we have
465 to assure that possibly temporary objects are kept
466 alive by referencing them.
467 We store a reference at the id of the memo, which should
468 normally not be used unless someone tries to deepcopy
469 the memo itself...
470 """
471 try:
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000472 memo[id(memo)].append(x)
Guido van Rossum5ed5c4c1997-09-03 00:23:54 +0000473 except KeyError:
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000474 # aha, this is the first one :-)
475 memo[id(memo)]=[x]
Guido van Rossum5ed5c4c1997-09-03 00:23:54 +0000476
477
Guido van Rossuma48061a1995-01-10 00:31:14 +0000478classmap = {}
479
Guido van Rossum4fb5b281997-09-12 20:07:24 +0000480# This is no longer used to find classes, but still for functions
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000481def whichmodule(cls, clsname):
482 """Figure out the module in which a class occurs.
Guido van Rossuma48061a1995-01-10 00:31:14 +0000483
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000484 Search sys.modules for the module.
485 Cache in classmap.
486 Return a module name.
487 If the class cannot be found, return __main__.
488 """
489 if classmap.has_key(cls):
490 return classmap[cls]
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000491
492 for name, module in sys.modules.items():
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000493 if name != '__main__' and \
494 hasattr(module, clsname) and \
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000495 getattr(module, clsname) is cls:
496 break
497 else:
498 name = '__main__'
499 classmap[cls] = name
500 return name
Guido van Rossuma48061a1995-01-10 00:31:14 +0000501
502
503class Unpickler:
504
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000505 def __init__(self, file):
506 self.readline = file.readline
507 self.read = file.read
508 self.memo = {}
Guido van Rossuma48061a1995-01-10 00:31:14 +0000509
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000510 def load(self):
511 self.mark = ['spam'] # Any new unique object
512 self.stack = []
513 self.append = self.stack.append
514 read = self.read
515 dispatch = self.dispatch
516 try:
517 while 1:
518 key = read(1)
519 dispatch[key](self)
Guido van Rossumff871742000-12-13 18:11:56 +0000520 except _Stop, stopinst:
521 return stopinst.value
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000522
523 def marker(self):
524 stack = self.stack
525 mark = self.mark
526 k = len(stack)-1
527 while stack[k] is not mark: k = k-1
528 return k
529
530 dispatch = {}
531
532 def load_eof(self):
533 raise EOFError
534 dispatch[''] = load_eof
535
536 def load_persid(self):
537 pid = self.readline()[:-1]
538 self.append(self.persistent_load(pid))
539 dispatch[PERSID] = load_persid
540
541 def load_binpersid(self):
542 stack = self.stack
543
544 pid = stack[-1]
545 del stack[-1]
546
547 self.append(self.persistent_load(pid))
548 dispatch[BINPERSID] = load_binpersid
549
550 def load_none(self):
551 self.append(None)
552 dispatch[NONE] = load_none
553
554 def load_int(self):
Guido van Rossumff871742000-12-13 18:11:56 +0000555 self.append(int(self.readline()[:-1]))
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000556 dispatch[INT] = load_int
557
558 def load_binint(self):
559 self.append(mloads('i' + self.read(4)))
560 dispatch[BININT] = load_binint
561
562 def load_binint1(self):
563 self.append(mloads('i' + self.read(1) + '\000\000\000'))
564 dispatch[BININT1] = load_binint1
565
566 def load_binint2(self):
567 self.append(mloads('i' + self.read(2) + '\000\000'))
568 dispatch[BININT2] = load_binint2
569
570 def load_long(self):
Guido van Rossumff871742000-12-13 18:11:56 +0000571 self.append(long(self.readline()[:-1], 0))
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000572 dispatch[LONG] = load_long
573
574 def load_float(self):
Guido van Rossumff871742000-12-13 18:11:56 +0000575 self.append(float(self.readline()[:-1]))
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000576 dispatch[FLOAT] = load_float
577
Guido van Rossumd3703791998-10-22 20:15:36 +0000578 def load_binfloat(self, unpack=struct.unpack):
579 self.append(unpack('>d', self.read(8))[0])
580 dispatch[BINFLOAT] = load_binfloat
581
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000582 def load_string(self):
Jeremy Hyltonbe467e52000-09-15 15:14:51 +0000583 rep = self.readline()[:-1]
584 if not self._is_string_secure(rep):
585 raise ValueError, "insecure string pickle"
586 self.append(eval(rep,
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000587 {'__builtins__': {}})) # Let's be careful
588 dispatch[STRING] = load_string
589
Jeremy Hyltonbe467e52000-09-15 15:14:51 +0000590 def _is_string_secure(self, s):
591 """Return true if s contains a string that is safe to eval
592
593 The definition of secure string is based on the implementation
594 in cPickle. s is secure as long as it only contains a quoted
595 string and optional trailing whitespace.
596 """
597 q = s[0]
598 if q not in ("'", '"'):
599 return 0
600 # find the closing quote
601 offset = 1
602 i = None
603 while 1:
604 try:
605 i = s.index(q, offset)
606 except ValueError:
607 # if there is an error the first time, there is no
608 # close quote
609 if offset == 1:
610 return 0
611 if s[i-1] != '\\':
612 break
613 # check to see if this one is escaped
614 nslash = 0
615 j = i - 1
616 while j >= offset and s[j] == '\\':
617 j = j - 1
618 nslash = nslash + 1
619 if nslash % 2 == 0:
620 break
621 offset = i + 1
622 for c in s[i+1:]:
623 if ord(c) > 32:
624 return 0
625 return 1
626
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000627 def load_binstring(self):
628 len = mloads('i' + self.read(4))
629 self.append(self.read(len))
630 dispatch[BINSTRING] = load_binstring
631
Guido van Rossumb5f2f1b2000-03-10 23:20:09 +0000632 def load_unicode(self):
633 self.append(unicode(self.readline()[:-1],'raw-unicode-escape'))
634 dispatch[UNICODE] = load_unicode
635
636 def load_binunicode(self):
637 len = mloads('i' + self.read(4))
638 self.append(unicode(self.read(len),'utf-8'))
639 dispatch[BINUNICODE] = load_binunicode
640
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000641 def load_short_binstring(self):
642 len = mloads('i' + self.read(1) + '\000\000\000')
643 self.append(self.read(len))
644 dispatch[SHORT_BINSTRING] = load_short_binstring
645
646 def load_tuple(self):
647 k = self.marker()
648 self.stack[k:] = [tuple(self.stack[k+1:])]
649 dispatch[TUPLE] = load_tuple
650
651 def load_empty_tuple(self):
652 self.stack.append(())
653 dispatch[EMPTY_TUPLE] = load_empty_tuple
654
655 def load_empty_list(self):
656 self.stack.append([])
657 dispatch[EMPTY_LIST] = load_empty_list
658
659 def load_empty_dictionary(self):
660 self.stack.append({})
661 dispatch[EMPTY_DICT] = load_empty_dictionary
662
663 def load_list(self):
664 k = self.marker()
665 self.stack[k:] = [self.stack[k+1:]]
666 dispatch[LIST] = load_list
667
668 def load_dict(self):
669 k = self.marker()
670 d = {}
671 items = self.stack[k+1:]
672 for i in range(0, len(items), 2):
673 key = items[i]
674 value = items[i+1]
675 d[key] = value
676 self.stack[k:] = [d]
677 dispatch[DICT] = load_dict
678
679 def load_inst(self):
680 k = self.marker()
681 args = tuple(self.stack[k+1:])
682 del self.stack[k:]
683 module = self.readline()[:-1]
684 name = self.readline()[:-1]
685 klass = self.find_class(module, name)
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000686 instantiated = 0
687 if (not args and type(klass) is ClassType and
688 not hasattr(klass, "__getinitargs__")):
689 try:
690 value = _EmptyClass()
691 value.__class__ = klass
Guido van Rossumb19e2a31998-04-13 18:08:45 +0000692 instantiated = 1
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000693 except RuntimeError:
694 # In restricted execution, assignment to inst.__class__ is
695 # prohibited
696 pass
697 if not instantiated:
Guido van Rossum743d17e1998-09-15 20:25:57 +0000698 try:
699 value = apply(klass, args)
700 except TypeError, err:
701 raise TypeError, "in constructor for %s: %s" % (
702 klass.__name__, str(err)), sys.exc_info()[2]
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000703 self.append(value)
704 dispatch[INST] = load_inst
705
706 def load_obj(self):
707 stack = self.stack
708 k = self.marker()
709 klass = stack[k + 1]
710 del stack[k + 1]
711 args = tuple(stack[k + 1:])
712 del stack[k:]
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000713 instantiated = 0
714 if (not args and type(klass) is ClassType and
715 not hasattr(klass, "__getinitargs__")):
716 try:
717 value = _EmptyClass()
718 value.__class__ = klass
719 instantiated = 1
720 except RuntimeError:
721 # In restricted execution, assignment to inst.__class__ is
722 # prohibited
723 pass
724 if not instantiated:
725 value = apply(klass, args)
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000726 self.append(value)
727 dispatch[OBJ] = load_obj
728
729 def load_global(self):
730 module = self.readline()[:-1]
731 name = self.readline()[:-1]
732 klass = self.find_class(module, name)
733 self.append(klass)
734 dispatch[GLOBAL] = load_global
735
736 def find_class(self, module, name):
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000737 try:
Guido van Rossum397032a1999-03-25 21:58:59 +0000738 __import__(module)
739 mod = sys.modules[module]
740 klass = getattr(mod, name)
741 except (ImportError, KeyError, AttributeError):
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000742 raise SystemError, \
743 "Failed to import class %s from module %s" % \
744 (name, module)
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000745 return klass
746
747 def load_reduce(self):
748 stack = self.stack
749
750 callable = stack[-2]
751 arg_tup = stack[-1]
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000752 del stack[-2:]
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000753
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000754 if type(callable) is not ClassType:
755 if not safe_constructors.has_key(callable):
756 try:
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000757 safe = callable.__safe_for_unpickling__
758 except AttributeError:
759 safe = None
Guido van Rossuma48061a1995-01-10 00:31:14 +0000760
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000761 if (not safe):
762 raise UnpicklingError, "%s is not safe for " \
763 "unpickling" % callable
Guido van Rossuma48061a1995-01-10 00:31:14 +0000764
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000765 if arg_tup is None:
766 value = callable.__basicnew__()
767 else:
768 value = apply(callable, arg_tup)
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000769 self.append(value)
770 dispatch[REDUCE] = load_reduce
Guido van Rossuma48061a1995-01-10 00:31:14 +0000771
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000772 def load_pop(self):
773 del self.stack[-1]
774 dispatch[POP] = load_pop
Guido van Rossum7b5430f1995-03-04 22:25:21 +0000775
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000776 def load_pop_mark(self):
777 k = self.marker()
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000778 del self.stack[k:]
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000779 dispatch[POP_MARK] = load_pop_mark
Guido van Rossuma48061a1995-01-10 00:31:14 +0000780
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000781 def load_dup(self):
Guido van Rossumb1062fc1998-03-31 17:00:46 +0000782 self.append(self.stack[-1])
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000783 dispatch[DUP] = load_dup
Guido van Rossuma48061a1995-01-10 00:31:14 +0000784
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000785 def load_get(self):
786 self.append(self.memo[self.readline()[:-1]])
787 dispatch[GET] = load_get
Guido van Rossum78536471996-04-12 13:36:27 +0000788
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000789 def load_binget(self):
790 i = mloads('i' + self.read(1) + '\000\000\000')
791 self.append(self.memo[`i`])
792 dispatch[BINGET] = load_binget
Guido van Rossum78536471996-04-12 13:36:27 +0000793
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000794 def load_long_binget(self):
795 i = mloads('i' + self.read(4))
796 self.append(self.memo[`i`])
797 dispatch[LONG_BINGET] = load_long_binget
Guido van Rossum78536471996-04-12 13:36:27 +0000798
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000799 def load_put(self):
800 self.memo[self.readline()[:-1]] = self.stack[-1]
801 dispatch[PUT] = load_put
Guido van Rossuma48061a1995-01-10 00:31:14 +0000802
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000803 def load_binput(self):
804 i = mloads('i' + self.read(1) + '\000\000\000')
805 self.memo[`i`] = self.stack[-1]
806 dispatch[BINPUT] = load_binput
Guido van Rossuma48061a1995-01-10 00:31:14 +0000807
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000808 def load_long_binput(self):
809 i = mloads('i' + self.read(4))
810 self.memo[`i`] = self.stack[-1]
811 dispatch[LONG_BINPUT] = load_long_binput
Guido van Rossuma48061a1995-01-10 00:31:14 +0000812
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000813 def load_append(self):
814 stack = self.stack
815 value = stack[-1]
816 del stack[-1]
817 list = stack[-1]
818 list.append(value)
819 dispatch[APPEND] = load_append
Guido van Rossuma48061a1995-01-10 00:31:14 +0000820
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000821 def load_appends(self):
822 stack = self.stack
823 mark = self.marker()
824 list = stack[mark - 1]
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000825 for i in range(mark + 1, len(stack)):
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000826 list.append(stack[i])
Guido van Rossum0c891ce1995-03-14 15:09:05 +0000827
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000828 del stack[mark:]
829 dispatch[APPENDS] = load_appends
830
831 def load_setitem(self):
832 stack = self.stack
833 value = stack[-1]
834 key = stack[-2]
835 del stack[-2:]
836 dict = stack[-1]
837 dict[key] = value
838 dispatch[SETITEM] = load_setitem
Guido van Rossum0c891ce1995-03-14 15:09:05 +0000839
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000840 def load_setitems(self):
841 stack = self.stack
842 mark = self.marker()
843 dict = stack[mark - 1]
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000844 for i in range(mark + 1, len(stack), 2):
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000845 dict[stack[i]] = stack[i + 1]
Guido van Rossuma48061a1995-01-10 00:31:14 +0000846
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000847 del stack[mark:]
848 dispatch[SETITEMS] = load_setitems
Guido van Rossuma48061a1995-01-10 00:31:14 +0000849
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000850 def load_build(self):
851 stack = self.stack
852 value = stack[-1]
853 del stack[-1]
854 inst = stack[-1]
855 try:
856 setstate = inst.__setstate__
857 except AttributeError:
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000858 try:
859 inst.__dict__.update(value)
860 except RuntimeError:
861 # XXX In restricted execution, the instance's __dict__ is not
862 # accessible. Use the old way of unpickling the instance
863 # variables. This is a semantic different when unpickling in
864 # restricted vs. unrestricted modes.
865 for k, v in value.items():
866 setattr(inst, k, v)
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000867 else:
868 setstate(value)
869 dispatch[BUILD] = load_build
Guido van Rossuma48061a1995-01-10 00:31:14 +0000870
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000871 def load_mark(self):
872 self.append(self.mark)
873 dispatch[MARK] = load_mark
Guido van Rossuma48061a1995-01-10 00:31:14 +0000874
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000875 def load_stop(self):
876 value = self.stack[-1]
877 del self.stack[-1]
Guido van Rossumff871742000-12-13 18:11:56 +0000878 raise _Stop(value)
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000879 dispatch[STOP] = load_stop
Guido van Rossuma48061a1995-01-10 00:31:14 +0000880
Guido van Rossume467be61997-12-05 19:42:42 +0000881# Helper class for load_inst/load_obj
882
883class _EmptyClass:
884 pass
Guido van Rossuma48061a1995-01-10 00:31:14 +0000885
Guido van Rossum0c891ce1995-03-14 15:09:05 +0000886# Shorthands
887
Guido van Rossumc7c5e691996-07-22 22:26:07 +0000888from StringIO import StringIO
889
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000890def dump(object, file, bin = 0):
891 Pickler(file, bin).dump(object)
Guido van Rossum0c891ce1995-03-14 15:09:05 +0000892
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000893def dumps(object, bin = 0):
894 file = StringIO()
895 Pickler(file, bin).dump(object)
896 return file.getvalue()
Guido van Rossum0c891ce1995-03-14 15:09:05 +0000897
898def load(file):
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000899 return Unpickler(file).load()
Guido van Rossum0c891ce1995-03-14 15:09:05 +0000900
901def loads(str):
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000902 file = StringIO(str)
903 return Unpickler(file).load()
Guido van Rossum0c891ce1995-03-14 15:09:05 +0000904
905
906# The rest is used for testing only
907
Guido van Rossuma48061a1995-01-10 00:31:14 +0000908class C:
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000909 def __cmp__(self, other):
910 return cmp(self.__dict__, other.__dict__)
Guido van Rossuma48061a1995-01-10 00:31:14 +0000911
912def test():
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000913 fn = 'out'
914 c = C()
915 c.foo = 1
916 c.bar = 2
917 x = [0, 1, 2, 3]
918 y = ('abc', 'abc', c, c)
919 x.append(y)
920 x.append(y)
921 x.append(5)
922 f = open(fn, 'w')
923 F = Pickler(f)
924 F.dump(x)
925 f.close()
926 f = open(fn, 'r')
927 U = Unpickler(f)
928 x2 = U.load()
929 print x
930 print x2
931 print x == x2
932 print map(id, x)
933 print map(id, x2)
934 print F.memo
935 print U.memo
Guido van Rossuma48061a1995-01-10 00:31:14 +0000936
937if __name__ == '__main__':
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000938 test()