[Python-checkins] cpython (3.3): Fixed _pickle.Unpickler to handle empty persistent IDs correctly.
alexandre.vassalotti
python-checkins at python.org
Sat Nov 30 22:56:31 CET 2013
http://hg.python.org/cpython/rev/b92f9eaedb76
changeset: 87656:b92f9eaedb76
branch: 3.3
parent: 87652:96d1207d33d0
user: Alexandre Vassalotti <alexandre at peadrop.com>
date: Sat Nov 30 13:52:35 2013 -0800
summary:
Fixed _pickle.Unpickler to handle empty persistent IDs correctly.
files:
Lib/test/pickletester.py | 40 +++++++++++++++------------
Misc/NEWS | 3 ++
Modules/_pickle.c | 2 +-
3 files changed, 26 insertions(+), 19 deletions(-)
diff --git a/Lib/test/pickletester.py b/Lib/test/pickletester.py
--- a/Lib/test/pickletester.py
+++ b/Lib/test/pickletester.py
@@ -1499,30 +1499,34 @@
if isinstance(object, int) and object % 2 == 0:
self.id_count += 1
return str(object)
+ elif object == "test_false_value":
+ self.false_count += 1
+ return ""
else:
return None
def persistent_load(self, oid):
- self.load_count += 1
- object = int(oid)
- assert object % 2 == 0
- return object
+ if not oid:
+ self.load_false_count += 1
+ return "test_false_value"
+ else:
+ self.load_count += 1
+ object = int(oid)
+ assert object % 2 == 0
+ return object
def test_persistence(self):
- self.id_count = 0
- self.load_count = 0
- L = list(range(10))
- self.assertEqual(self.loads(self.dumps(L)), L)
- self.assertEqual(self.id_count, 5)
- self.assertEqual(self.load_count, 5)
-
- def test_bin_persistence(self):
- self.id_count = 0
- self.load_count = 0
- L = list(range(10))
- self.assertEqual(self.loads(self.dumps(L, 1)), L)
- self.assertEqual(self.id_count, 5)
- self.assertEqual(self.load_count, 5)
+ L = list(range(10)) + ["test_false_value"]
+ for proto in protocols:
+ self.id_count = 0
+ self.false_count = 0
+ self.load_false_count = 0
+ self.load_count = 0
+ self.assertEqual(self.loads(self.dumps(L, proto)), L)
+ self.assertEqual(self.id_count, 5)
+ self.assertEqual(self.false_count, 1)
+ self.assertEqual(self.load_count, 5)
+ self.assertEqual(self.load_false_count, 1)
class AbstractPicklerUnpicklerObjectTests(unittest.TestCase):
diff --git a/Misc/NEWS b/Misc/NEWS
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -21,6 +21,9 @@
- Issue #19088: Fixed incorrect caching of the copyreg module in
object.__reduce__() and object.__reduce_ex__().
+- Fixed _pickle.Unpickler to not fail when loading empty strings as
+ persistent IDs.
+
- Issue #11508: Fixed uuid.getnode() and uuid.uuid1() on environment with
virtual interface. Original patch by Kent Frazier.
diff --git a/Modules/_pickle.c b/Modules/_pickle.c
--- a/Modules/_pickle.c
+++ b/Modules/_pickle.c
@@ -4665,7 +4665,7 @@
if (self->pers_func) {
if ((len = _Unpickler_Readline(self, &s)) < 0)
return -1;
- if (len < 2)
+ if (len < 1)
return bad_readline();
pid = PyBytes_FromStringAndSize(s, len - 1);
--
Repository URL: http://hg.python.org/cpython
More information about the Python-checkins
mailing list