]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
Repair portability of sign extension when reading signed ints on boxes
authorTim Peters <tim.peters@gmail.com>
Sun, 8 Apr 2001 23:39:38 +0000 (23:39 +0000)
committerTim Peters <tim.peters@gmail.com>
Sun, 8 Apr 2001 23:39:38 +0000 (23:39 +0000)
where sizeof(long)==8.  This *was* broken on boxes where signed right
shifts didn't sign-extend, but not elsewhere.  Unfortunately, apart
from the Cray T3E I don't know of such a box, and Guido has so far
refused to buy me any Cray machines for home Python testing <wink>.

More immediately interesting would be if someone could please test
this on *any* sizeof(long)==8 box, to make sure I didn't break it.

Modules/structmodule.c

index a28ca548dd962689e1708fdca90b9006708e6a83..9d1c436494c62e0a5b92d5c78e67f6d4c4ca16e0 100644 (file)
@@ -653,11 +653,9 @@ bu_int(const char *p, const formatdef *f)
        do {
                x = (x<<8) | (*p++ & 0xFF);
        } while (--i > 0);
-       i = 8*(sizeof(long) - f->size);
-       if (i) {
-               x <<= i;
-               x >>= i;
-       }
+       /* Extend the sign bit. */
+       if (SIZEOF_LONG > f->size)
+               x |= -(x & (1L << (8*f->size - 1)));
        return PyInt_FromLong(x);
 }
 
@@ -767,11 +765,9 @@ lu_int(const char *p, const formatdef *f)
        do {
                x = (x<<8) | (p[--i] & 0xFF);
        } while (i > 0);
-       i = 8*(sizeof(long) - f->size);
-       if (i) {
-               x <<= i;
-               x >>= i;
-       }
+       /* Extend the sign bit. */
+       if (SIZEOF_LONG > f->size)
+               x |= -(x & (1L << (8*f->size - 1)));
        return PyInt_FromLong(x);
 }