]> granicus.if.org Git - python/commitdiff
Obscure marshal fixes:
authorTim Peters <tim.peters@gmail.com>
Tue, 19 Sep 2000 08:54:13 +0000 (08:54 +0000)
committerTim Peters <tim.peters@gmail.com>
Tue, 19 Sep 2000 08:54:13 +0000 (08:54 +0000)
    When reading a short, sign-extend on platforms where shorts are
    bigger than 16 bits.
    When reading a long, repair the unportable sign extension that was
    being done for 64-bit machines (it assumed that signed right shift
    sign-extends).

Python/marshal.c

index 91d322bb2636dc74246b34e56d26ab7b4ba59c43..f8953ceae4c96df5594e6dcb04c62822991f6774 100644 (file)
@@ -307,7 +307,8 @@ r_short(RFILE *p)
        register short x;
        x = r_byte(p);
        x |= r_byte(p) << 8;
-       /* XXX If your short is > 16 bits, add sign-extension here!!! */
+       /* Sign-extension, in case short greater than 16 bits */
+       x |= -(x & 0x8000);
        return x;
 }
 
@@ -330,8 +331,7 @@ r_long(RFILE *p)
        }
 #if SIZEOF_LONG > 4
        /* Sign extension for 64-bit machines */
-       x <<= (8*sizeof(long) - 32);
-       x >>= (8*sizeof(long) - 32);
+       x |= -(x & 0x80000000L);
 #endif
        return x;
 }
@@ -342,7 +342,7 @@ r_long64(RFILE *p)
        register long x;
        x = r_long(p);
 #if SIZEOF_LONG > 4
-       x = (x & 0xFFFFFFFF) | (r_long(p) << 32);
+       x = (x & 0xFFFFFFFFL) | (r_long(p) << 32);
 #else
        if (r_long(p) != 0) {
                PyObject *f = PySys_GetObject("stderr");