From: Mark Dickinson <dickinsm@gmail.com>
Date: Sun, 16 Jun 2019 10:06:06 +0000 (+0100)
Subject: Simplify negativity checks in math.comb and math.perm. (GH-13870)
X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=45e0411eee023b21acf1615e995d26058d66c0f1;p=python

Simplify negativity checks in math.comb and math.perm. (GH-13870)
---

diff --git a/Modules/mathmodule.c b/Modules/mathmodule.c
index ed11476753..76d821c65b 100644
--- a/Modules/mathmodule.c
+++ b/Modules/mathmodule.c
@@ -3056,6 +3056,12 @@ math_perm_impl(PyObject *module, PyObject *n, PyObject *k)
                         "n must be a non-negative integer");
         goto error;
     }
+    if (Py_SIZE(k) < 0) {
+        PyErr_SetString(PyExc_ValueError,
+                        "k must be a non-negative integer");
+        goto error;
+    }
+
     cmp = PyObject_RichCompareBool(n, k, Py_LT);
     if (cmp != 0) {
         if (cmp > 0) {
@@ -3072,11 +3078,8 @@ math_perm_impl(PyObject *module, PyObject *n, PyObject *k)
                      LLONG_MAX);
         goto error;
     }
-    else if (overflow < 0 || factors < 0) {
-        if (!PyErr_Occurred()) {
-            PyErr_SetString(PyExc_ValueError,
-                            "k must be a non-negative integer");
-        }
+    else if (factors == -1) {
+        /* k is nonnegative, so a return value of -1 can only indicate error */
         goto error;
     }
 
@@ -3176,6 +3179,12 @@ math_comb_impl(PyObject *module, PyObject *n, PyObject *k)
                         "n must be a non-negative integer");
         goto error;
     }
+    if (Py_SIZE(k) < 0) {
+        PyErr_SetString(PyExc_ValueError,
+                        "k must be a non-negative integer");
+        goto error;
+    }
+
     /* k = min(k, n - k) */
     temp = PyNumber_Subtract(n, k);
     if (temp == NULL) {
@@ -3204,11 +3213,8 @@ math_comb_impl(PyObject *module, PyObject *n, PyObject *k)
                      LLONG_MAX);
         goto error;
     }
-    else if (overflow < 0 || factors < 0) {
-        if (!PyErr_Occurred()) {
-            PyErr_SetString(PyExc_ValueError,
-                            "k must be a non-negative integer");
-        }
+    if (factors == -1) {
+        /* k is nonnegative, so a return value of -1 can only indicate error */
         goto error;
     }