summaryrefslogtreecommitdiffstats
path: root/Lib/test/pickletester.py
diff options
context:
space:
mode:
authorAlexander Belopolsky <alexander.belopolsky@gmail.com>2010-07-17 23:01:39 (GMT)
committerAlexander Belopolsky <alexander.belopolsky@gmail.com>2010-07-17 23:01:39 (GMT)
commit82a6bf049e2ccceb99e9288440ffffad77bf9e90 (patch)
treee017932277b114c8f83fa95c1ae95d8092fda626 /Lib/test/pickletester.py
parent6fd1df8c44dd986d1ba6458c9583dacda4255180 (diff)
downloadcpython-82a6bf049e2ccceb99e9288440ffffad77bf9e90.zip
cpython-82a6bf049e2ccceb99e9288440ffffad77bf9e90.tar.gz
cpython-82a6bf049e2ccceb99e9288440ffffad77bf9e90.tar.bz2
Merged revisions 82937 via svnmerge from
svn+ssh://pythondev@svn.python.org/python/branches/py3k ........ r82937 | alexander.belopolsky | 2010-07-17 18:50:45 -0400 (Sat, 17 Jul 2010) | 3 lines Issue #5180: Fixed a bug that prevented loading 2.x pickles in 3.x python when they contain instances of old-style classes. ........
Diffstat (limited to 'Lib/test/pickletester.py')
-rw-r--r--Lib/test/pickletester.py69
1 files changed, 69 insertions, 0 deletions
diff --git a/Lib/test/pickletester.py b/Lib/test/pickletester.py
index 30ff4ef..25af97d 100644
--- a/Lib/test/pickletester.py
+++ b/Lib/test/pickletester.py
@@ -65,9 +65,21 @@ class C:
def __eq__(self, other):
return self.__dict__ == other.__dict__
+class D(C):
+ def __init__(self, arg):
+ pass
+
+class E(C):
+ def __getinitargs__(self):
+ return ()
+
import __main__
__main__.C = C
C.__module__ = "__main__"
+__main__.D = D
+D.__module__ = "__main__"
+__main__.E = E
+E.__module__ = "__main__"
class myint(int):
def __init__(self, x):
@@ -425,6 +437,63 @@ class AbstractPickleTests(unittest.TestCase):
def test_load_from_data2(self):
self.assertEqual(self._testdata, self.loads(DATA2))
+ def test_load_classic_instance(self):
+ # See issue5180. Test loading 2.x pickles that
+ # contain an instance of old style class.
+ for X, args in [(C, ()), (D, ('x',)), (E, ())]:
+ xname = X.__name__.encode('ascii')
+ # Protocol 0 (text mode pickle):
+ """
+ 0: ( MARK
+ 1: i INST '__main__ X' (MARK at 0)
+ 15: p PUT 0
+ 18: ( MARK
+ 19: d DICT (MARK at 18)
+ 20: p PUT 1
+ 23: b BUILD
+ 24: . STOP
+ """
+ pickle0 = (b"(i__main__\n"
+ b"X\n"
+ b"p0\n"
+ b"(dp1\nb.").replace(b'X', xname)
+ self.assertEqual(X(*args), self.loads(pickle0))
+
+ # Protocol 1 (binary mode pickle)
+ """
+ 0: ( MARK
+ 1: c GLOBAL '__main__ X'
+ 15: q BINPUT 0
+ 17: o OBJ (MARK at 0)
+ 18: q BINPUT 1
+ 20: } EMPTY_DICT
+ 21: q BINPUT 2
+ 23: b BUILD
+ 24: . STOP
+ """
+ pickle1 = (b'(c__main__\n'
+ b'X\n'
+ b'q\x00oq\x01}q\x02b.').replace(b'X', xname)
+ self.assertEqual(X(*args), self.loads(pickle1))
+
+ # Protocol 2 (pickle2 = b'\x80\x02' + pickle1)
+ """
+ 0: \x80 PROTO 2
+ 2: ( MARK
+ 3: c GLOBAL '__main__ X'
+ 17: q BINPUT 0
+ 19: o OBJ (MARK at 2)
+ 20: q BINPUT 1
+ 22: } EMPTY_DICT
+ 23: q BINPUT 2
+ 25: b BUILD
+ 26: . STOP
+ """
+ pickle2 = (b'\x80\x02(c__main__\n'
+ b'X\n'
+ b'q\x00oq\x01}q\x02b.').replace(b'X', xname)
+ self.assertEqual(X(*args), self.loads(pickle2))
+
# There are gratuitous differences between pickles produced by
# pickle and cPickle, largely because cPickle starts PUT indices at
# 1 and pickle starts them at 0. See XXX comment in cPickle's put2() --