Kaydet (Commit) 0d2d87d2 authored tarafından Tim Peters's avatar Tim Peters

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.
üst 76afbd9a
......@@ -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;
}
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment