From 63dc548109c4f5e17280382831b93fb8e9da9207 Mon Sep 17 00:00:00 2001 From: Serhiy Storchaka Date: Thu, 22 Sep 2016 19:41:20 +0300 Subject: [PATCH] Issue #28086: Single var-positional argument of tuple subtype was passed unscathed to the C-defined function. Now it is converted to exact tuple. --- Lib/test/test_getargs2.py | 2 +- Misc/NEWS | 3 +++ Python/ceval.c | 4 ++-- 3 files changed, 6 insertions(+), 3 deletions(-) diff --git a/Lib/test/test_getargs2.py b/Lib/test/test_getargs2.py index 5750bfa5f88..8a194aa03d4 100644 --- a/Lib/test/test_getargs2.py +++ b/Lib/test/test_getargs2.py @@ -471,7 +471,7 @@ class Tuple_TestCase(unittest.TestCase): ret = get_args(*TupleSubclass([1, 2])) self.assertEqual(ret, (1, 2)) - self.assertIsInstance(ret, tuple) + self.assertIs(type(ret), tuple) ret = get_args() self.assertIn(ret, ((), None)) diff --git a/Misc/NEWS b/Misc/NEWS index aca0ba0fb11..2f531a82ab5 100644 --- a/Misc/NEWS +++ b/Misc/NEWS @@ -10,6 +10,9 @@ What's New in Python 3.6.0 beta 2 Core and Builtins ----------------- +- Issue #28086: Single var-positional argument of tuple subtype was passed + unscathed to the C-defined function. Now it is converted to exact tuple. + - Issue #28214: Now __set_name__ is looked up on the class instead of the instance. diff --git a/Python/ceval.c b/Python/ceval.c index ff36d365b34..39cf33019d8 100644 --- a/Python/ceval.c +++ b/Python/ceval.c @@ -3310,7 +3310,7 @@ _PyEval_EvalFrameDefault(PyFrameObject *f, int throwflag) } callargs = POP(); func = TOP(); - if (!PyTuple_Check(callargs)) { + if (!PyTuple_CheckExact(callargs)) { if (Py_TYPE(callargs)->tp_iter == NULL && !PySequence_Check(callargs)) { PyErr_Format(PyExc_TypeError, @@ -3327,7 +3327,7 @@ _PyEval_EvalFrameDefault(PyFrameObject *f, int throwflag) goto error; } } - assert(PyTuple_Check(callargs)); + assert(PyTuple_CheckExact(callargs)); result = do_call_core(func, callargs, kwargs); Py_DECREF(func);