Issue #23757: Only call the concrete list API for exact lists.
This commit is contained in:
parent
84924e6e92
commit
51dbc9a4ad
|
@ -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]))
|
||||
|
|
|
@ -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.
|
||||
|
||||
|
|
|
@ -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. */
|
||||
|
|
Loading…
Reference in New Issue