[Python-checkins] r72931 - in python/branches/release26-maint: Lib/test/pickletester.py Lib/test/test_cpickle.py Modules/cPickle.c
collin.winter
python-checkins at python.org
Tue May 26 07:37:22 CEST 2009
Author: collin.winter
Date: Tue May 26 07:37:22 2009
New Revision: 72931
Log:
Merged revisions 72930 via svnmerge from
svn+ssh://pythondev@svn.python.org/python/trunk
........
r72930 | collin.winter | 2009-05-25 21:12:39 -0700 (Mon, 25 May 2009) | 1 line
Issue 5794: fix cPickle's unpickling of recursive tuples.
........
Modified:
python/branches/release26-maint/ (props changed)
python/branches/release26-maint/Lib/test/pickletester.py
python/branches/release26-maint/Lib/test/test_cpickle.py
python/branches/release26-maint/Modules/cPickle.c
Modified: python/branches/release26-maint/Lib/test/pickletester.py
==============================================================================
--- python/branches/release26-maint/Lib/test/pickletester.py (original)
+++ python/branches/release26-maint/Lib/test/pickletester.py Tue May 26 07:37:22 2009
@@ -428,6 +428,16 @@
self.assertEqual(len(x), 1)
self.assert_(x is x[0])
+ def test_recursive_tuple(self):
+ t = ([],)
+ t[0].append(t)
+ for proto in protocols:
+ s = self.dumps(t, proto)
+ x = self.loads(s)
+ self.assertEqual(len(x), 1)
+ self.assertEqual(len(x[0]), 1)
+ self.assert_(x is x[0][0])
+
def test_recursive_dict(self):
d = {}
d[1] = d
Modified: python/branches/release26-maint/Lib/test/test_cpickle.py
==============================================================================
--- python/branches/release26-maint/Lib/test/test_cpickle.py (original)
+++ python/branches/release26-maint/Lib/test/test_cpickle.py Tue May 26 07:37:22 2009
@@ -64,6 +64,11 @@
AbstractPickleTests.test_recursive_list,
self)
+ def test_recursive_tuple(self):
+ self.assertRaises(ValueError,
+ AbstractPickleTests.test_recursive_tuple,
+ self)
+
def test_recursive_inst(self):
self.assertRaises(ValueError,
AbstractPickleTests.test_recursive_inst,
Modified: python/branches/release26-maint/Modules/cPickle.c
==============================================================================
--- python/branches/release26-maint/Modules/cPickle.c (original)
+++ python/branches/release26-maint/Modules/cPickle.c Tue May 26 07:37:22 2009
@@ -4016,25 +4016,24 @@
static int
load_pop(Unpicklerobject *self)
{
- int len;
-
- if (!( (len=self->stack->length) > 0 )) return stackUnderflow();
+ int len = self->stack->length;
/* Note that we split the (pickle.py) stack into two stacks,
an object stack and a mark stack. We have to be clever and
pop the right one. We do this by looking at the top of the
- mark stack.
+ mark stack first, and only signalling a stack underflow if
+ the object stack is empty and the mark stack doesn't match
+ our expectations.
*/
-
- if ((self->num_marks > 0) &&
- (self->marks[self->num_marks - 1] == len))
+ if (self->num_marks > 0 && self->marks[self->num_marks - 1] == len) {
self->num_marks--;
- else {
+ } else if (len >= 0) {
len--;
Py_DECREF(self->stack->data[len]);
- self->stack->length=len;
+ self->stack->length = len;
+ } else {
+ return stackUnderflow();
}
-
return 0;
}
More information about the Python-checkins
mailing list