From c869529ea9fbed574d34cf7ac139ca3f81b62ef0 Mon Sep 17 00:00:00 2001 From: Serhiy Storchaka Date: Wed, 4 Apr 2018 00:11:27 +0300 Subject: bpo-33209: End framing at the end of C implementation of pickle.Pickler.dump(). (GH-6363) --- Lib/test/pickletester.py | 35 +++++++++++----------- .../2018-04-03-10-37-13.bpo-33209.9sGWE_.rst | 1 + Modules/_pickle.c | 5 ++-- 3 files changed, 22 insertions(+), 19 deletions(-) create mode 100644 Misc/NEWS.d/next/Library/2018-04-03-10-37-13.bpo-33209.9sGWE_.rst diff --git a/Lib/test/pickletester.py b/Lib/test/pickletester.py index b84b878..71c2fea 100644 --- a/Lib/test/pickletester.py +++ b/Lib/test/pickletester.py @@ -2781,29 +2781,30 @@ class AbstractPicklerUnpicklerObjectTests(unittest.TestCase): # object again, the third serialized form should be identical to the # first one we obtained. data = ["abcdefg", "abcdefg", 44] - f = io.BytesIO() - pickler = self.pickler_class(f) + for proto in protocols: + f = io.BytesIO() + pickler = self.pickler_class(f, proto) - pickler.dump(data) - first_pickled = f.getvalue() + pickler.dump(data) + first_pickled = f.getvalue() - # Reset BytesIO object. - f.seek(0) - f.truncate() + # Reset BytesIO object. + f.seek(0) + f.truncate() - pickler.dump(data) - second_pickled = f.getvalue() + pickler.dump(data) + second_pickled = f.getvalue() - # Reset the Pickler and BytesIO objects. - pickler.clear_memo() - f.seek(0) - f.truncate() + # Reset the Pickler and BytesIO objects. + pickler.clear_memo() + f.seek(0) + f.truncate() - pickler.dump(data) - third_pickled = f.getvalue() + pickler.dump(data) + third_pickled = f.getvalue() - self.assertNotEqual(first_pickled, second_pickled) - self.assertEqual(first_pickled, third_pickled) + self.assertNotEqual(first_pickled, second_pickled) + self.assertEqual(first_pickled, third_pickled) def test_priming_pickler_memo(self): # Verify that we can set the Pickler's memo attribute. diff --git a/Misc/NEWS.d/next/Library/2018-04-03-10-37-13.bpo-33209.9sGWE_.rst b/Misc/NEWS.d/next/Library/2018-04-03-10-37-13.bpo-33209.9sGWE_.rst new file mode 100644 index 0000000..d98b1e1 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2018-04-03-10-37-13.bpo-33209.9sGWE_.rst @@ -0,0 +1 @@ +End framing at the end of C implementation of :func:`pickle.Pickler.dump`. diff --git a/Modules/_pickle.c b/Modules/_pickle.c index 9525ad6..6a684f2 100644 --- a/Modules/_pickle.c +++ b/Modules/_pickle.c @@ -4152,9 +4152,10 @@ dump(PicklerObject *self, PyObject *obj) } if (save(self, obj, 0) < 0 || - _Pickler_Write(self, &stop_op, 1) < 0) + _Pickler_Write(self, &stop_op, 1) < 0 || + _Pickler_CommitFrame(self) < 0) return -1; - + self->framing = 0; return 0; } -- cgit v0.12