diff options
author | Victor Stinner <vstinner@python.org> | 2021-05-26 22:51:07 (GMT) |
---|---|---|
committer | GitHub <noreply@github.com> | 2021-05-26 22:51:07 (GMT) |
commit | 3e7ee02327db13e4337374597cdc4458ecb9e3ad (patch) | |
tree | cf61463ec1ded73c693c981875d68e483c2af552 /Modules | |
parent | d8fd8c8568cbc2f53c1abeda3596a89a46f0e3d7 (diff) | |
download | cpython-3e7ee02327db13e4337374597cdc4458ecb9e3ad.zip cpython-3e7ee02327db13e4337374597cdc4458ecb9e3ad.tar.gz cpython-3e7ee02327db13e4337374597cdc4458ecb9e3ad.tar.bz2 |
bpo-42161: mathmodule.c: move _PyLong_GetOne() loop invariant (GH-26391)
Move _PyLong_GetZero() and _PyLong_GetOne() loop invariants outside
loops in functions:
* math.comb()
* math.gcd()
* math.lcm()
* math.perm()
Diffstat (limited to 'Modules')
-rw-r--r-- | Modules/mathmodule.c | 20 |
1 files changed, 12 insertions, 8 deletions
diff --git a/Modules/mathmodule.c b/Modules/mathmodule.c index d0dd12d..a2a2db2 100644 --- a/Modules/mathmodule.c +++ b/Modules/mathmodule.c @@ -845,13 +845,15 @@ math_gcd(PyObject *module, PyObject * const *args, Py_ssize_t nargs) Py_SETREF(res, PyNumber_Absolute(res)); return res; } + + PyObject *one = _PyLong_GetOne(); // borrowed ref for (i = 1; i < nargs; i++) { x = _PyNumber_Index(args[i]); if (x == NULL) { Py_DECREF(res); return NULL; } - if (res == _PyLong_GetOne()) { + if (res == one) { /* Fast path: just check arguments. It is okay to use identity comparison here. */ Py_DECREF(x); @@ -918,13 +920,15 @@ math_lcm(PyObject *module, PyObject * const *args, Py_ssize_t nargs) Py_SETREF(res, PyNumber_Absolute(res)); return res; } + + PyObject *zero = _PyLong_GetZero(); // borrowed ref for (i = 1; i < nargs; i++) { x = PyNumber_Index(args[i]); if (x == NULL) { Py_DECREF(res); return NULL; } - if (res == _PyLong_GetZero()) { + if (res == zero) { /* Fast path: just check arguments. It is okay to use identity comparison here. */ Py_DECREF(x); @@ -3293,10 +3297,10 @@ math_perm_impl(PyObject *module, PyObject *n, PyObject *k) goto done; } - factor = n; - Py_INCREF(factor); + factor = Py_NewRef(n); + PyObject *one = _PyLong_GetOne(); // borrowed ref for (i = 1; i < factors; ++i) { - Py_SETREF(factor, PyNumber_Subtract(factor, _PyLong_GetOne())); + Py_SETREF(factor, PyNumber_Subtract(factor, one)); if (factor == NULL) { goto error; } @@ -3415,10 +3419,10 @@ math_comb_impl(PyObject *module, PyObject *n, PyObject *k) goto done; } - factor = n; - Py_INCREF(factor); + factor = Py_NewRef(n); + PyObject *one = _PyLong_GetOne(); // borrowed ref for (i = 1; i < factors; ++i) { - Py_SETREF(factor, PyNumber_Subtract(factor, _PyLong_GetOne())); + Py_SETREF(factor, PyNumber_Subtract(factor, one)); if (factor == NULL) { goto error; } |