[Python-checkins] cpython (3.4): Issue #23757: Only call the concrete list API for exact lists.
raymond.hettinger
python-checkins at python.org
Sun May 17 23:47:09 CEST 2015
https://hg.python.org/cpython/rev/c79530e08985
changeset: 96124:c79530e08985
branch: 3.4
parent: 96121:8bd9da5635fe
user: Raymond Hettinger <python at rcn.com>
date: Sun May 17 14:45:58 2015 -0700
summary:
Issue #23757: Only call the concrete list API for exact lists.
files:
Lib/test/seq_tests.py | 12 ++++++++++++
Misc/NEWS | 3 +++
Objects/abstract.c | 2 +-
3 files changed, 16 insertions(+), 1 deletions(-)
diff --git a/Lib/test/seq_tests.py b/Lib/test/seq_tests.py
--- a/Lib/test/seq_tests.py
+++ b/Lib/test/seq_tests.py
@@ -85,6 +85,14 @@
'Test multiple tiers of iterators'
return chain(map(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
@@ -131,6 +139,10 @@
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
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -13,6 +13,9 @@
- Issue #20274: Remove ignored and erroneous "kwargs" parameters from three
METH_VARARGS methods on _sqlite.Connection.
+- Issue #23757: PySequence_Tuple() incorrectly called the concrete list API
+ when the data was a list subclass.
+
- Issue #24096: Make warnings.warn_explicit more robust against mutation of the
warnings.filters list.
diff --git a/Objects/abstract.c b/Objects/abstract.c
--- a/Objects/abstract.c
+++ b/Objects/abstract.c
@@ -1636,7 +1636,7 @@
Py_INCREF(v);
return v;
}
- if (PyList_Check(v))
+ if (PyList_CheckExact(v))
return PyList_AsTuple(v);
/* Get iterator. */
--
Repository URL: https://hg.python.org/cpython
More information about the Python-checkins
mailing list