]> granicus.if.org Git - python/commitdiff
long_format(), long_lshift(): Someone on c.l.py is trying to boost
authorTim Peters <tim.peters@gmail.com>
Tue, 20 Aug 2002 19:00:22 +0000 (19:00 +0000)
committerTim Peters <tim.peters@gmail.com>
Tue, 20 Aug 2002 19:00:22 +0000 (19:00 +0000)
SHIFT and MASK, and widen digit.  One problem is that code of the form

    digit << small_integer

implicitly assumes that the result fits in an int or unsigned int
(platform-dependent, but "int sized" in any case), since digit is
promoted "just" to int or unsigned via the usual integer promotions.
But if digit is typedef'ed as unsigned int, this loses information.
The cure for this is just to cast digit to twodigits first.

Objects/longobject.c

index 856230e3d7cf11408044b33527b03847078a1be0..9e641af98d3fdefd65102a659ce5f57af76e2a2e 100644 (file)
@@ -949,7 +949,7 @@ long_format(PyObject *aa, int base, int addL)
                        ++basebits;
 
                for (i = 0; i < size_a; ++i) {
-                       accum |= a->ob_digit[i] << accumbits;
+                       accum |= (twodigits)a->ob_digit[i] << accumbits;
                        accumbits += SHIFT;
                        assert(accumbits >= basebits);
                        do {
@@ -2345,7 +2345,7 @@ long_lshift(PyObject *v, PyObject *w)
                z->ob_digit[i] = 0;
        accum = 0;
        for (i = wordshift, j = 0; j < oldsize; i++, j++) {
-               accum |= a->ob_digit[j] << remshift;
+               accum |= (twodigits)a->ob_digit[j] << remshift;
                z->ob_digit[i] = (digit)(accum & MASK);
                accum >>= SHIFT;
        }