From 51dbc9a4ad272d832dfd5265cc3161cbb658aecb Mon Sep 17 00:00:00 2001 From: Raymond Hettinger Date: Sun, 17 May 2015 14:37:39 -0700 Subject: [PATCH] Issue #23757: Only call the concrete list API for exact lists. --- Lib/test/seq_tests.py | 12 ++++++++++++ Misc/NEWS | 3 +++ Objects/abstract.c | 2 +- 3 files changed, 16 insertions(+), 1 deletion(-) diff --git a/Lib/test/seq_tests.py b/Lib/test/seq_tests.py index f5e4e0ef55..f4673d48af 100644 --- a/Lib/test/seq_tests.py +++ b/Lib/test/seq_tests.py @@ -84,6 +84,14 @@ def itermulti(seqn): 'Test multiple tiers of iterators' return chain(imap(lambda x:x, iterfunc(IterGen(Sequence(seqn))))) +class LyingTuple(tuple): + def __iter__(self): + yield 1 + +class LyingList(list): + def __iter__(self): + yield 1 + class CommonTest(unittest.TestCase): # The type to be tested type2test = None @@ -130,6 +138,10 @@ class CommonTest(unittest.TestCase): self.assertRaises(TypeError, self.type2test, IterNoNext(s)) self.assertRaises(ZeroDivisionError, self.type2test, IterGenExc(s)) + # Issue #23757 + self.assertEqual(self.type2test(LyingTuple((2,))), self.type2test((1,))) + self.assertEqual(self.type2test(LyingList([2])), self.type2test([1])) + def test_truth(self): self.assertFalse(self.type2test()) self.assertTrue(self.type2test([42])) diff --git a/Misc/NEWS b/Misc/NEWS index ab36ec45a9..c9b0dbefcd 100644 --- a/Misc/NEWS +++ b/Misc/NEWS @@ -51,6 +51,9 @@ Core and Builtins - Issue #23971: Fix underestimated presizing in dict.fromkeys(). +- Issue #23757: PySequence_Tuple() incorrectly called the concrete list API + when the data was a list subclass. + - Issue #20274: Remove ignored and erroneous "kwargs" parameters from three METH_VARARGS methods on _sqlite.Connection. diff --git a/Objects/abstract.c b/Objects/abstract.c index 64a1a381e1..6e289eff6e 100644 --- a/Objects/abstract.c +++ b/Objects/abstract.c @@ -2169,7 +2169,7 @@ PySequence_Tuple(PyObject *v) Py_INCREF(v); return v; } - if (PyList_Check(v)) + if (PyList_CheckExact(v)) return PyList_AsTuple(v); /* Get iterator. */ -- 2.50.1