long_format(), long_lshift(): Someone on c.l.py is trying to boost
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.
This commit is contained in:
parent
76afbd9aa4
commit
0d2d87d202
|
@ -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;
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue