diff options
author | Alexander Belopolsky <alexander.belopolsky@gmail.com> | 2010-07-17 23:01:39 (GMT) |
---|---|---|
committer | Alexander Belopolsky <alexander.belopolsky@gmail.com> | 2010-07-17 23:01:39 (GMT) |
commit | 82a6bf049e2ccceb99e9288440ffffad77bf9e90 (patch) | |
tree | e017932277b114c8f83fa95c1ae95d8092fda626 /Lib/test/pickletester.py | |
parent | 6fd1df8c44dd986d1ba6458c9583dacda4255180 (diff) | |
download | cpython-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.py | 69 |
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() -- |