summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAmmar Askar <ammar_askar@hotmail.com>2019-01-12 06:23:41 (GMT)
committerSerhiy Storchaka <storchaka@gmail.com>2019-01-12 06:23:41 (GMT)
commitcb08a71c5c534f33d9486677534dafb087c30e8c (patch)
tree19b46ba5dda5c870c2a2f8614e19e3831e5f3ec8
parentfdf282d609fd172d52b59a6f1f062eb701494528 (diff)
downloadcpython-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.py2
-rw-r--r--Modules/clinic/mathmodule.c.h10
-rw-r--r--Modules/mathmodule.c11
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) {