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. ........
This commit is contained in:
parent
7d5285ec79
commit
8ca69de237
|
@ -432,6 +432,16 @@ class AbstractPickleTests(unittest.TestCase):
|
|||
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
|
||||
|
|
|
@ -3639,25 +3639,24 @@ load_binpersid(UnpicklerObject *self)
|
|||
static int
|
||||
load_pop(UnpicklerObject *self)
|
||||
{
|
||||
int len;
|
||||
|
||||
if ((len = self->stack->length) <= 0)
|
||||
return stack_underflow();
|
||||
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;
|
||||
} else {
|
||||
return stack_underflow();
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in New Issue