]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
Merged revisions 79843-79844 via svnmerge from
authorMark Dickinson <dickinsm@gmail.com>
Tue, 6 Apr 2010 16:53:17 +0000 (16:53 +0000)
committerMark Dickinson <dickinsm@gmail.com>
Tue, 6 Apr 2010 16:53:17 +0000 (16:53 +0000)
svn+ssh://pythondev@svn.python.org/python/trunk

........
  r79843 | mark.dickinson | 2010-04-06 17:46:09 +0100 (Tue, 06 Apr 2010) | 4 lines

  Issue #8259: Get rid of 'outrageous left shift count' error when
  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.
........
  r79844 | mark.dickinson | 2010-04-06 17:47:55 +0100 (Tue, 06 Apr 2010) | 1 line

  Misc/NEWS entry for r79843.
........

Misc/NEWS
Objects/longobject.c

index de8d9f7878d8854a1148f1a4a08e6ec12623b7e5..dac91909bdcfc1d2a96f52a1a09808b7c250d88f 100644 (file)
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -12,6 +12,10 @@ What's New in Python 3.2 Alpha 1?
 Core and Builtins
 -----------------
 
+- Issue #8259: 1L << (2**31) no longer produces an 'outrageous shift error'
+  on 64-bit machines.  The shift count for either left or right shift is
+  permitted to be up to sys.maxsize.
+
 - Ensure that tokenization of identifiers is not affected by locale.
 
 - Issue #1222585: Added LDCXXSHARED for C++ support. Patch by Arfrever.
index 781e34f99dda3a2b41748ebfeb6a668b4ac28d15..93f5611df9040893dc411ca42982f48584a1083e 100644 (file)
@@ -3779,8 +3779,7 @@ static PyObject *
 long_rshift(PyLongObject *a, PyLongObject *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;
 
        CHECK_BINOP(a, b);
@@ -3799,8 +3798,7 @@ long_rshift(PyLongObject *a, PyLongObject *b)
                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) {
@@ -3841,27 +3839,21 @@ long_lshift(PyObject *v, PyObject *w)
        PyLongObject *a = (PyLongObject*)v;
        PyLongObject *b = (PyLongObject*)w;
        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;
 
        CHECK_BINOP(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(Py_SIZE(a));
        newsize = oldsize + wordshift;