]> granicus.if.org Git - python/commitdiff
Issue #8259: Get rid of 'outrageous left shift count' error when
authorMark Dickinson <dickinsm@gmail.com>
Tue, 6 Apr 2010 16:46:09 +0000 (16:46 +0000)
committerMark Dickinson <dickinsm@gmail.com>
Tue, 6 Apr 2010 16:46:09 +0000 (16:46 +0000)
left-shifting an integer by more than 2**31 on a 64-bit machine.  Also
convert shift counts to a Py_ssize_t instead of a C long.

Objects/longobject.c

index 4290f4eb8fd1fe9bee44344c05fccda65033e3f1..0e6e4e36b657d08492ff089cb36c887be572000f 100644 (file)
@@ -3614,8 +3614,7 @@ long_rshift(PyLongObject *v, PyLongObject *w)
 {
        PyLongObject *a, *b;
        PyLongObject *z = NULL;
-       long shiftby;
-       Py_ssize_t newsize, wordshift, loshift, hishift, i, j;
+       Py_ssize_t shiftby, newsize, wordshift, loshift, hishift, i, j;
        digit lomask, himask;
 
        CONVERT_BINOP((PyObject *)v, (PyObject *)w, &a, &b);
@@ -3634,8 +3633,7 @@ long_rshift(PyLongObject *v, PyLongObject *w)
                Py_DECREF(a2);
        }
        else {
-
-               shiftby = PyLong_AsLong((PyObject *)b);
+               shiftby = PyLong_AsSsize_t((PyObject *)b);
                if (shiftby == -1L && PyErr_Occurred())
                        goto rshift_error;
                if (shiftby < 0) {
@@ -3681,27 +3679,21 @@ long_lshift(PyObject *v, PyObject *w)
        /* This version due to Tim Peters */
        PyLongObject *a, *b;
        PyLongObject *z = NULL;
-       long shiftby;
-       Py_ssize_t oldsize, newsize, wordshift, remshift, i, j;
+       Py_ssize_t shiftby, oldsize, newsize, wordshift, remshift, i, j;
        twodigits accum;
 
        CONVERT_BINOP(v, w, &a, &b);
 
-       shiftby = PyLong_AsLong((PyObject *)b);
+       shiftby = PyLong_AsSsize_t((PyObject *)b);
        if (shiftby == -1L && PyErr_Occurred())
                goto lshift_error;
        if (shiftby < 0) {
                PyErr_SetString(PyExc_ValueError, "negative shift count");
                goto lshift_error;
        }
-       if ((long)(int)shiftby != shiftby) {
-               PyErr_SetString(PyExc_ValueError,
-                               "outrageous left shift count");
-               goto lshift_error;
-       }
        /* wordshift, remshift = divmod(shiftby, PyLong_SHIFT) */
-       wordshift = (int)shiftby / PyLong_SHIFT;
-       remshift  = (int)shiftby - wordshift * PyLong_SHIFT;
+       wordshift = shiftby / PyLong_SHIFT;
+       remshift  = shiftby - wordshift * PyLong_SHIFT;
 
        oldsize = ABS(a->ob_size);
        newsize = oldsize + wordshift;