Commit 971792da authored by chris's avatar chris

removed BININT8

fixed bug in load_short_binstring()
parent cab6962f
# $Id: pickle.py,v 1.6 1997/02/12 17:06:45 chris Exp $ # $Id: pickle.py,v 1.7 1997/02/21 22:24:23 chris Exp $
# #
# Copyright # Copyright
# #
...@@ -207,7 +207,6 @@ BININT1 = 'K' ...@@ -207,7 +207,6 @@ BININT1 = 'K'
LONG = 'L' LONG = 'L'
BININT2 = 'M' BININT2 = 'M'
NONE = 'N' NONE = 'N'
BININT8 = 'O'
PERSID = 'P' PERSID = 'P'
BINPERSID = 'Q' BINPERSID = 'Q'
REDUCE = 'R' REDUCE = 'R'
...@@ -287,58 +286,63 @@ class Pickler: ...@@ -287,58 +286,63 @@ class Pickler:
d = id(object) d = id(object)
t = type(object) t = type(object)
if ((t is TupleType) and (len(object) == 0)):
if (self.bin):
save_empty_tuple(object)
else:
save_tuple(object)
return
if memo.has_key(d):
self.write(self.get(memo[d]))
return
try: try:
f = self.quick_dispatch[t] f = self.dispatch[t]
except KeyError: except KeyError:
if memo.has_key(d): pid = self.inst_persistent_id(object)
self.write(self.get(memo[d])) if pid is not None:
self.save_pers(pid)
return return
try: try:
f = self.dispatch[t] reduce = dispatch_table[t]
except KeyError: except KeyError:
pid = self.inst_persistent_id(object)
if pid is not None:
self.save_pers(pid)
return
try: try:
reduce = dispatch_table[t] reduce = object.__reduce__
except KeyError: except AttributeError:
try: raise PicklingError, \
reduce = object.__reduce__ "can't pickle %s objects" % `t.__name__`
except AttributeError:
raise PicklingError, \
"can't pickle %s objects" % `t.__name__`
else:
tup = reduce()
else: else:
tup = reduce(object) tup = reduce()
else:
tup = reduce(object)
if (type(tup) is not TupleType): if (type(tup) is not TupleType):
raise PicklingError, "Value returned by %s must be a " \ raise PicklingError, "Value returned by %s must be a " \
"tuple" % reduce "tuple" % reduce
l = len(tup) l = len(tup)
if ((l != 2) and (l != 3)): if ((l != 2) and (l != 3)):
raise PicklingError, "tuple returned by %s must contain " \ raise PicklingError, "tuple returned by %s must contain " \
"only two or three elements" % reduce "only two or three elements" % reduce
callable = tup[0] callable = tup[0]
arg_tup = tup[1] arg_tup = tup[1]
if (l > 2): if (l > 2):
state = tup[2] state = tup[2]
else: else:
state = None state = None
if (type(arg_tup) is not TupleType): if (type(arg_tup) is not TupleType):
raise PicklingError, "Second element of tuple returned " \ raise PicklingError, "Second element of tuple returned " \
"by %s must be a tuple" % reduce "by %s must be a tuple" % reduce
self.save_reduce(callable, arg_tup, state) self.save_reduce(callable, arg_tup, state)
return return
f(self, object) f(self, object)
...@@ -368,11 +372,10 @@ class Pickler: ...@@ -368,11 +372,10 @@ class Pickler:
write(BUILD) write(BUILD)
dispatch = {} dispatch = {}
quick_dispatch = {}
def save_none(self, object): def save_none(self, object):
self.write(NONE) self.write(NONE)
quick_dispatch[NoneType] = save_none dispatch[NoneType] = save_none
def save_int(self, object): def save_int(self, object):
if (self.bin): if (self.bin):
...@@ -388,7 +391,7 @@ class Pickler: ...@@ -388,7 +391,7 @@ class Pickler:
self.write(BININT + i) self.write(BININT + i)
else: else:
self.write(INT + `object` + '\n') self.write(INT + `object` + '\n')
quick_dispatch[IntType] = save_int dispatch[IntType] = save_int
def save_long(self, object): def save_long(self, object):
self.write(LONG + `object` + '\n') self.write(LONG + `object` + '\n')
...@@ -396,7 +399,7 @@ class Pickler: ...@@ -396,7 +399,7 @@ class Pickler:
def save_float(self, object): def save_float(self, object):
self.write(FLOAT + `object` + '\n') self.write(FLOAT + `object` + '\n')
quick_dispatch[FloatType] = save_float dispatch[FloatType] = save_float
def save_string(self, object): def save_string(self, object):
d = id(object) d = id(object)
...@@ -418,20 +421,20 @@ class Pickler: ...@@ -418,20 +421,20 @@ class Pickler:
dispatch[StringType] = save_string dispatch[StringType] = save_string
def save_tuple(self, object): def save_tuple(self, object):
d = id(object)
write = self.write write = self.write
save = self.save save = self.save
memo = self.memo memo = self.memo
d = id(object)
write(MARK) write(MARK)
for element in object: for element in object:
save(element) save(element)
if (memo.has_key(d)): if (memo.has_key(d)):
write(POP * len(object)) write(POP * len(object) + self.get(memo[d]))
write(self.get(memo[d]))
return return
memo_len = len(memo) memo_len = len(memo)
...@@ -449,12 +452,15 @@ class Pickler: ...@@ -449,12 +452,15 @@ class Pickler:
save = self.save save = self.save
memo = self.memo memo = self.memo
if (self.bin):
write(EMPTY_LIST)
else:
write(MARK + LIST)
using_appends = (self.bin and (len(object) > 1)) using_appends = (self.bin and (len(object) > 1))
if (using_appends): if (using_appends):
write(MARK + LIST + MARK) write(MARK)
else:
write(MARK + LIST)
for element in object: for element in object:
save(element) save(element)
...@@ -477,12 +483,15 @@ class Pickler: ...@@ -477,12 +483,15 @@ class Pickler:
save = self.save save = self.save
memo = self.memo memo = self.memo
if (self.bin):
write(EMPTY_DICT)
else:
write(MARK + DICT)
using_setitems = (self.bin and (len(object) > 1)) using_setitems = (self.bin and (len(object) > 1))
if (using_setitems): if (using_setitems):
write(MARK + DICT + MARK) write(MARK)
else:
write(MARK + DICT)
items = object.items() items = object.items()
for key, value in items: for key, value in items:
...@@ -576,9 +585,8 @@ def whichmodule(cls, clsname): ...@@ -576,9 +585,8 @@ def whichmodule(cls, clsname):
import sys import sys
for name, module in sys.modules.items(): for name, module in sys.modules.items():
if name != '__main__' and \ if hasattr(module, clsname) and \
hasattr(module, clsname) and \ getattr(module, clsname) is cls:
getattr(module, clsname) is cls:
break break
else: else:
name = '__main__' name = '__main__'
...@@ -672,7 +680,7 @@ class Unpickler: ...@@ -672,7 +680,7 @@ class Unpickler:
dispatch[BINSTRING] = load_binstring dispatch[BINSTRING] = load_binstring
def load_short_binstring(self): def load_short_binstring(self):
len = mloads('i' + self.read(1)) len = mloads('i' + self.read(1) + '\000\000\000')
self.append(self.read(len)) self.append(self.read(len))
dispatch[SHORT_BINSTRING] = load_short_binstring dispatch[SHORT_BINSTRING] = load_short_binstring
...@@ -744,6 +752,7 @@ class Unpickler: ...@@ -744,6 +752,7 @@ class Unpickler:
def find_class(self, module, name): def find_class(self, module, name):
env = {} env = {}
try: try:
exec 'from %s import %s' % (module, name) in env exec 'from %s import %s' % (module, name) in env
except ImportError: except ImportError:
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment