diff options
author | Guido van Rossum <guido@python.org> | 2001-12-03 19:33:25 (GMT) |
---|---|---|
committer | Guido van Rossum <guido@python.org> | 2001-12-03 19:33:25 (GMT) |
commit | bb8f59a37148eb81ef1a1a26a6fb6e1e03583d12 (patch) | |
tree | 74f6920a0c94cd6522c8517bcf3ad003f52474e2 | |
parent | 2009aa66b4900fc11224318333be4b560f0820ce (diff) | |
download | cpython-bb8f59a37148eb81ef1a1a26a6fb6e1e03583d12.zip cpython-bb8f59a37148eb81ef1a1a26a6fb6e1e03583d12.tar.gz cpython-bb8f59a37148eb81ef1a1a26a6fb6e1e03583d12.tar.bz2 |
unpack_iterable(): Add a missing DECREF in an error case. Reported by
Armin Rigo (SF bug #488477). Added a testcase to test_unpack_iter()
in test_iter.py.
-rw-r--r-- | Lib/test/test_iter.py | 23 | ||||
-rw-r--r-- | Python/ceval.c | 1 |
2 files changed, 24 insertions, 0 deletions
diff --git a/Lib/test/test_iter.py b/Lib/test/test_iter.py index 5bd7ba4..13ed5bd 100644 --- a/Lib/test/test_iter.py +++ b/Lib/test/test_iter.py @@ -747,6 +747,29 @@ class TestCase(unittest.TestCase): (a, b), (c,) = IteratingSequenceClass(2), {42: 24} self.assertEqual((a, b, c), (0, 1, 42)) + # Test reference count behavior + + class C(object): + count = 0 + def __new__(cls): + cls.count += 1 + return object.__new__(cls) + def __del__(self): + cls = self.__class__ + assert cls.count > 0 + cls.count -= 1 + x = C() + self.assertEqual(C.count, 1) + del x + self.assertEqual(C.count, 0) + l = [C(), C(), C()] + self.assertEqual(C.count, 3) + try: + a, b = iter(l) + except ValueError: + pass + del l + self.assertEqual(C.count, 0) def test_main(): run_unittest(TestCase) diff --git a/Python/ceval.c b/Python/ceval.c index fd602b0..b41ef5a 100644 --- a/Python/ceval.c +++ b/Python/ceval.c @@ -2796,6 +2796,7 @@ unpack_iterable(PyObject *v, int argcnt, PyObject **sp) Py_DECREF(it); return 1; } + Py_DECREF(w); PyErr_SetString(PyExc_ValueError, "too many values to unpack"); /* fall through */ Error: |