diff options
author | Ammar Askar <ammar_askar@hotmail.com> | 2019-01-12 06:23:41 (GMT) |
---|---|---|
committer | Serhiy Storchaka <storchaka@gmail.com> | 2019-01-12 06:23:41 (GMT) |
commit | cb08a71c5c534f33d9486677534dafb087c30e8c (patch) | |
tree | 19b46ba5dda5c870c2a2f8614e19e3831e5f3ec8 | |
parent | fdf282d609fd172d52b59a6f1f062eb701494528 (diff) | |
download | cpython-cb08a71c5c534f33d9486677534dafb087c30e8c.zip cpython-cb08a71c5c534f33d9486677534dafb087c30e8c.tar.gz cpython-cb08a71c5c534f33d9486677534dafb087c30e8c.tar.bz2 |
bpo-34838: Use subclass_of for math.dist. (GH-9659)
Argument clinic now generates fast inline code for
positional parsing, so the manually implemented type
check in math.dist can be removed.
-rw-r--r-- | Lib/test/test_math.py | 2 | ||||
-rw-r--r-- | Modules/clinic/mathmodule.c.h | 10 | ||||
-rw-r--r-- | Modules/mathmodule.c | 11 |
3 files changed, 14 insertions, 9 deletions
diff --git a/Lib/test/test_math.py b/Lib/test/test_math.py index 9b2f55e..b476a39 100644 --- a/Lib/test/test_math.py +++ b/Lib/test/test_math.py @@ -867,6 +867,8 @@ class MathTests(unittest.TestCase): dist((1, 2, 3, 4), (5, 6, 7)) with self.assertRaises(ValueError): # Check dimension agree dist((1, 2, 3), (4, 5, 6, 7)) + with self.assertRaises(TypeError): # Rejects invalid types + dist("abc", "xyz") # Verify that the one dimensional case is equivalent to abs() for i in range(20): diff --git a/Modules/clinic/mathmodule.c.h b/Modules/clinic/mathmodule.c.h index 1c8fc2f..82a4c4a 100644 --- a/Modules/clinic/mathmodule.c.h +++ b/Modules/clinic/mathmodule.c.h @@ -310,7 +310,15 @@ math_dist(PyObject *module, PyObject *const *args, Py_ssize_t nargs) if (!_PyArg_CheckPositional("dist", nargs, 2, 2)) { goto exit; } + if (!PyTuple_Check(args[0])) { + _PyArg_BadArgument("dist", 1, "tuple", args[0]); + goto exit; + } p = args[0]; + if (!PyTuple_Check(args[1])) { + _PyArg_BadArgument("dist", 2, "tuple", args[1]); + goto exit; + } q = args[1]; return_value = math_dist_impl(module, p, q); @@ -548,4 +556,4 @@ math_isclose(PyObject *module, PyObject *const *args, Py_ssize_t nargs, PyObject exit: return return_value; } -/*[clinic end generated code: output=f3264ab0ef57ba0a input=a9049054013a1b77]*/ +/*[clinic end generated code: output=0664f30046da09fe input=a9049054013a1b77]*/ diff --git a/Modules/mathmodule.c b/Modules/mathmodule.c index d56c91c..2db2b45 100644 --- a/Modules/mathmodule.c +++ b/Modules/mathmodule.c @@ -2101,8 +2101,8 @@ vector_norm(Py_ssize_t n, double *vec, double max, int found_nan) /*[clinic input] math.dist - p: object - q: object + p: object(subclass_of='&PyTuple_Type') + q: object(subclass_of='&PyTuple_Type') / Return the Euclidean distance between two points p and q. @@ -2116,7 +2116,7 @@ Roughly equivalent to: static PyObject * math_dist_impl(PyObject *module, PyObject *p, PyObject *q) -/*[clinic end generated code: output=56bd9538d06bbcfe input=8c83c07c7a524664]*/ +/*[clinic end generated code: output=56bd9538d06bbcfe input=937122eaa5f19272]*/ { PyObject *item; double max = 0.0; @@ -2126,11 +2126,6 @@ math_dist_impl(PyObject *module, PyObject *p, PyObject *q) double diffs_on_stack[NUM_STACK_ELEMS]; double *diffs = diffs_on_stack; - if (!PyTuple_Check(p) || !PyTuple_Check(q)) { - PyErr_SetString(PyExc_TypeError, "dist argument must be a tuple"); - return NULL; - } - m = PyTuple_GET_SIZE(p); n = PyTuple_GET_SIZE(q); if (m != n) { |