Obscure marshal fixes:
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).
This commit is contained in:
parent
a3c6a8a30e
commit
e84b74039b
|
@ -307,7 +307,8 @@ r_short(RFILE *p)
|
||||||
register short x;
|
register short x;
|
||||||
x = r_byte(p);
|
x = r_byte(p);
|
||||||
x |= r_byte(p) << 8;
|
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;
|
return x;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -330,8 +331,7 @@ r_long(RFILE *p)
|
||||||
}
|
}
|
||||||
#if SIZEOF_LONG > 4
|
#if SIZEOF_LONG > 4
|
||||||
/* Sign extension for 64-bit machines */
|
/* Sign extension for 64-bit machines */
|
||||||
x <<= (8*sizeof(long) - 32);
|
x |= -(x & 0x80000000L);
|
||||||
x >>= (8*sizeof(long) - 32);
|
|
||||||
#endif
|
#endif
|
||||||
return x;
|
return x;
|
||||||
}
|
}
|
||||||
|
@ -342,7 +342,7 @@ r_long64(RFILE *p)
|
||||||
register long x;
|
register long x;
|
||||||
x = r_long(p);
|
x = r_long(p);
|
||||||
#if SIZEOF_LONG > 4
|
#if SIZEOF_LONG > 4
|
||||||
x = (x & 0xFFFFFFFF) | (r_long(p) << 32);
|
x = (x & 0xFFFFFFFFL) | (r_long(p) << 32);
|
||||||
#else
|
#else
|
||||||
if (r_long(p) != 0) {
|
if (r_long(p) != 0) {
|
||||||
PyObject *f = PySys_GetObject("stderr");
|
PyObject *f = PySys_GetObject("stderr");
|
||||||
|
|
Loading…
Reference in New Issue