diff options
-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: |