Issue #27222: various cleanups in long_rshift. Thanks Oren Milman.

This commit is contained in:
Mark Dickinson 2016-09-17 17:50:50 +01:00
parent 042ce8a594
commit 92ca535626
2 changed files with 10 additions and 11 deletions

View File

@ -10,6 +10,9 @@ What's New in Python 3.7.0 alpha 1
Core and Builtins Core and Builtins
----------------- -----------------
- Issue #27222: Clean up redundant code in long_rshift function. Thanks
Oren Milman.
- Upgrade internal unicode databases to Unicode version 9.0.0. - Upgrade internal unicode databases to Unicode version 9.0.0.
- Issue #28131: Fix a regression in zipimport's compile_source(). zipimport - Issue #28131: Fix a regression in zipimport's compile_source(). zipimport

View File

@ -4296,22 +4296,22 @@ long_rshift(PyLongObject *a, PyLongObject *b)
PyLongObject *a1, *a2; PyLongObject *a1, *a2;
a1 = (PyLongObject *) long_invert(a); a1 = (PyLongObject *) long_invert(a);
if (a1 == NULL) if (a1 == NULL)
goto rshift_error; return NULL;
a2 = (PyLongObject *) long_rshift(a1, b); a2 = (PyLongObject *) long_rshift(a1, b);
Py_DECREF(a1); Py_DECREF(a1);
if (a2 == NULL) if (a2 == NULL)
goto rshift_error; return NULL;
z = (PyLongObject *) long_invert(a2); z = (PyLongObject *) long_invert(a2);
Py_DECREF(a2); Py_DECREF(a2);
} }
else { else {
shiftby = PyLong_AsSsize_t((PyObject *)b); shiftby = PyLong_AsSsize_t((PyObject *)b);
if (shiftby == -1L && PyErr_Occurred()) if (shiftby == -1L && PyErr_Occurred())
goto rshift_error; return NULL;
if (shiftby < 0) { if (shiftby < 0) {
PyErr_SetString(PyExc_ValueError, PyErr_SetString(PyExc_ValueError,
"negative shift count"); "negative shift count");
goto rshift_error; return NULL;
} }
wordshift = shiftby / PyLong_SHIFT; wordshift = shiftby / PyLong_SHIFT;
newsize = Py_ABS(Py_SIZE(a)) - wordshift; newsize = Py_ABS(Py_SIZE(a)) - wordshift;
@ -4323,19 +4323,15 @@ long_rshift(PyLongObject *a, PyLongObject *b)
himask = PyLong_MASK ^ lomask; himask = PyLong_MASK ^ lomask;
z = _PyLong_New(newsize); z = _PyLong_New(newsize);
if (z == NULL) if (z == NULL)
goto rshift_error; return NULL;
if (Py_SIZE(a) < 0)
Py_SIZE(z) = -(Py_SIZE(z));
for (i = 0, j = wordshift; i < newsize; i++, j++) { for (i = 0, j = wordshift; i < newsize; i++, j++) {
z->ob_digit[i] = (a->ob_digit[j] >> loshift) & lomask; z->ob_digit[i] = (a->ob_digit[j] >> loshift) & lomask;
if (i+1 < newsize) if (i+1 < newsize)
z->ob_digit[i] |= (a->ob_digit[j+1] << hishift) & himask; z->ob_digit[i] |= (a->ob_digit[j+1] << hishift) & himask;
} }
z = long_normalize(z); z = maybe_small_long(long_normalize(z));
} }
rshift_error: return (PyObject *)z;
return (PyObject *) maybe_small_long(z);
} }
static PyObject * static PyObject *