Issue #28203: Fix incorrect type in error message from complex(1.0, {2:3}). Patch by Soumya Sharma.

This commit is contained in:
Mark Dickinson 2016-09-24 15:26:36 +01:00
parent 8609cda961
commit 613f8e513c
4 changed files with 29 additions and 6 deletions

View File

@ -326,6 +326,14 @@ class ComplexTest(unittest.TestCase):
self.assertRaises(ValueError, complex, "1e1ej") self.assertRaises(ValueError, complex, "1e1ej")
self.assertRaises(ValueError, complex, "1e++1ej") self.assertRaises(ValueError, complex, "1e++1ej")
self.assertRaises(ValueError, complex, ")1+2j(") self.assertRaises(ValueError, complex, ")1+2j(")
self.assertRaisesRegex(
TypeError,
"first argument must be a string or a number, not 'dict'",
complex, {1:2}, 1)
self.assertRaisesRegex(
TypeError,
"second argument must be a number, not 'dict'",
complex, 1, {1:2})
# the following three are accepted by Python 2.6 # the following three are accepted by Python 2.6
self.assertRaises(ValueError, complex, "1..1j") self.assertRaises(ValueError, complex, "1..1j")
self.assertRaises(ValueError, complex, "1.11.1j") self.assertRaises(ValueError, complex, "1.11.1j")

View File

@ -1349,6 +1349,7 @@ Daniel Shahaf
Mark Shannon Mark Shannon
Ha Shao Ha Shao
Richard Shapiro Richard Shapiro
Soumya Sharma
Varun Sharma Varun Sharma
Daniel Shaulov Daniel Shaulov
Vlad Shcherbina Vlad Shcherbina

View File

@ -10,6 +10,9 @@ Release date: TBA
Core and Builtins Core and Builtins
----------------- -----------------
- Issue #28203: Fix incorrect type in error message from
``complex(1.0, {2:3})``. Patch by Soumya Sharma.
- Issue #27955: Fallback on reading /dev/urandom device when the getrandom() - Issue #27955: Fallback on reading /dev/urandom device when the getrandom()
syscall fails with EPERM, for example when blocked by SECCOMP. syscall fails with EPERM, for example when blocked by SECCOMP.

View File

@ -954,18 +954,29 @@ complex_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
} }
nbr = r->ob_type->tp_as_number; nbr = r->ob_type->tp_as_number;
if (i != NULL) if (nbr == NULL || nbr->nb_float == NULL) {
nbi = i->ob_type->tp_as_number;
if (nbr == NULL || nbr->nb_float == NULL ||
((i != NULL) && (nbi == NULL || nbi->nb_float == NULL))) {
PyErr_Format(PyExc_TypeError, PyErr_Format(PyExc_TypeError,
"complex() argument must be a string or a number, not '%.200s'", "complex() first argument must be a string or a number, "
Py_TYPE(r)->tp_name); "not '%.200s'",
Py_TYPE(r)->tp_name);
if (own_r) { if (own_r) {
Py_DECREF(r); Py_DECREF(r);
} }
return NULL; return NULL;
} }
if (i != NULL) {
nbi = i->ob_type->tp_as_number;
if (nbi == NULL || nbi->nb_float == NULL) {
PyErr_Format(PyExc_TypeError,
"complex() second argument must be a number, "
"not '%.200s'",
Py_TYPE(i)->tp_name);
if (own_r) {
Py_DECREF(r);
}
return NULL;
}
}
/* If we get this far, then the "real" and "imag" parts should /* If we get this far, then the "real" and "imag" parts should
both be treated as numbers, and the constructor should return a both be treated as numbers, and the constructor should return a