From bb8f59a37148eb81ef1a1a26a6fb6e1e03583d12 Mon Sep 17 00:00:00 2001 From: Guido van Rossum Date: Mon, 3 Dec 2001 19:33:25 +0000 Subject: [PATCH] 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. --- Lib/test/test_iter.py | 23 +++++++++++++++++++++++ Python/ceval.c | 1 + 2 files changed, 24 insertions(+) diff --git a/Lib/test/test_iter.py b/Lib/test/test_iter.py index 5bd7ba44a5..13ed5bd4a8 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 fd602b0a32..b41ef5a71e 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: -- 2.50.1