From a5c8830637cde632ab3bcf5475698dcf0fb0546d Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Tue, 3 Apr 2018 15:05:11 -0700 Subject: [PATCH] bpo-33209: End framing at the end of C implementation of pickle.Pickler.dump(). (GH-6363) (cherry picked from commit c869529ea9fbed574d34cf7ac139ca3f81b62ef0) Co-authored-by: Serhiy Storchaka --- 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 a1c0bd726f..764057a866 100644 --- a/Lib/test/pickletester.py +++ b/Lib/test/pickletester.py @@ -2667,29 +2667,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 0000000000..d98b1e174e --- /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 7e9bb9895c..792c7604b5 100644 --- a/Modules/_pickle.c +++ b/Modules/_pickle.c @@ -4061,9 +4061,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; } -- 2.40.0