diff options
author | Guido van Rossum <guido@python.org> | 2007-05-08 21:26:54 (GMT) |
---|---|---|
committer | Guido van Rossum <guido@python.org> | 2007-05-08 21:26:54 (GMT) |
commit | cfe5f20fe82806b85c971e43e18564e60108dd08 (patch) | |
tree | 0ddd21800971710d6decd02c0c6b867a153c8378 /Lib/pickle.py | |
parent | f9e91c9c58de72afdf51f2a6ebfe50e98beeaa78 (diff) | |
download | cpython-cfe5f20fe82806b85c971e43e18564e60108dd08.zip cpython-cfe5f20fe82806b85c971e43e18564e60108dd08.tar.gz cpython-cfe5f20fe82806b85c971e43e18564e60108dd08.tar.bz2 |
Got test_pickletools and test_pickle working.
(Alas, test_cpickle is still broken.)
Diffstat (limited to 'Lib/pickle.py')
-rw-r--r-- | Lib/pickle.py | 55 |
1 files changed, 30 insertions, 25 deletions
diff --git a/Lib/pickle.py b/Lib/pickle.py index f976ffb..62658cb 100644 --- a/Lib/pickle.py +++ b/Lib/pickle.py @@ -465,7 +465,7 @@ class Pickler: self.write(BININT1 + bytes([obj])) return if obj <= 0xffff: - self.write(BININT2, bytes([obj&0xff, obj>>8])) + self.write(BININT2 + bytes([obj&0xff, obj>>8])) return # Next check for 4-byte signed ints: high_bits = obj >> 31 # note that Python shift sign-extends @@ -820,6 +820,7 @@ class Unpickler: key = read(1) if not key: raise EOFError + assert isinstance(key, bytes) dispatch[key[0]](self) except _Stop as stopinst: return stopinst.value @@ -892,7 +893,7 @@ class Unpickler: dispatch[BININT1[0]] = load_binint1 def load_binint2(self): - self.append(mloads(b'i' + self.read(2) + '\000\000')) + self.append(mloads(b'i' + self.read(2) + b'\000\000')) dispatch[BININT2[0]] = load_binint2 def load_long(self): @@ -1111,7 +1112,7 @@ class Unpickler: dispatch[DUP[0]] = load_dup def load_get(self): - self.append(self.memo[self.readline()[:-1]]) + self.append(self.memo[str8(self.readline())[:-1]]) dispatch[GET[0]] = load_get def load_binget(self): @@ -1226,24 +1227,24 @@ def encode_long(x): byte in the LONG1 pickling context. >>> encode_long(0) - '' + b'' >>> encode_long(255) - '\xff\x00' + b'\xff\x00' >>> encode_long(32767) - '\xff\x7f' + b'\xff\x7f' >>> encode_long(-256) - '\x00\xff' + b'\x00\xff' >>> encode_long(-32768) - '\x00\x80' + b'\x00\x80' >>> encode_long(-128) - '\x80' + b'\x80' >>> encode_long(127) - '\x7f' + b'\x7f' >>> """ if x == 0: - return '' + return b'' if x > 0: ashex = hex(x) assert ashex.startswith("0x") @@ -1284,24 +1285,24 @@ def encode_long(x): ashex = ashex[2:] assert len(ashex) & 1 == 0, (x, ashex) binary = _binascii.unhexlify(ashex) - return binary[::-1] + return bytes(binary[::-1]) def decode_long(data): r"""Decode a long from a two's complement little-endian binary string. - >>> decode_long('') + >>> decode_long(b'') 0 - >>> decode_long("\xff\x00") + >>> decode_long(b"\xff\x00") 255 - >>> decode_long("\xff\x7f") + >>> decode_long(b"\xff\x7f") 32767 - >>> decode_long("\x00\xff") + >>> decode_long(b"\x00\xff") -256 - >>> decode_long("\x00\x80") + >>> decode_long(b"\x00\x80") -32768 - >>> decode_long("\x80") + >>> decode_long(b"\x80") -128 - >>> decode_long("\x7f") + >>> decode_long(b"\x7f") 127 """ @@ -1310,7 +1311,7 @@ def decode_long(data): return 0 ashex = _binascii.hexlify(data[::-1]) n = int(ashex, 16) # quadratic time before Python 2.3; linear now - if data[-1] >= '\x80': + if data[-1] >= 0x80: n -= 1 << (nbytes * 8) return n @@ -1320,15 +1321,19 @@ def dump(obj, file, protocol=None): Pickler(file, protocol).dump(obj) def dumps(obj, protocol=None): - file = io.BytesIO() - Pickler(file, protocol).dump(obj) - return file.getvalue() + f = io.BytesIO() + Pickler(f, protocol).dump(obj) + res = f.getvalue() + assert isinstance(res, bytes) + return res def load(file): return Unpickler(file).load() -def loads(str): - file = io.BytesIO(str) +def loads(s): + if isinstance(s, str): + raise TypeError("Can't load pickle from unicode string") + file = io.BytesIO(s) return Unpickler(file).load() # Doctest |