mirror of
https://github.com/python/cpython.git
synced 2025-08-04 00:48:58 +00:00
marshal.c r_long64: When reading a TYPE_INT64 value on a box with 32-bit
ints, convert to PyLong (rather than throwing away the high-order 32 bits).
This commit is contained in:
parent
da21ce3e31
commit
8211237db8
3 changed files with 70 additions and 12 deletions
41
Lib/test/test_marshal.py
Normal file
41
Lib/test/test_marshal.py
Normal file
|
@ -0,0 +1,41 @@
|
|||
from test_support import TestFailed
|
||||
import marshal
|
||||
import sys
|
||||
|
||||
# XXX Much more needed here.
|
||||
|
||||
# Test the full range of Python ints.
|
||||
n = sys.maxint
|
||||
while n:
|
||||
for expected in (-n, n):
|
||||
s = marshal.dumps(expected)
|
||||
got = marshal.loads(s)
|
||||
if expected != got:
|
||||
raise TestFailed("for int %d, marshal string is %r, loaded "
|
||||
"back as %d" % (expected, s, got))
|
||||
n = n >> 1
|
||||
|
||||
# Simulate int marshaling on a 64-bit box. This is most interesting if
|
||||
# we're running the test on a 32-bit box, of course.
|
||||
|
||||
def to_little_endian_string(value, nbytes):
|
||||
bytes = []
|
||||
for i in range(nbytes):
|
||||
bytes.append(chr(value & 0xff))
|
||||
value >>= 8
|
||||
return ''.join(bytes)
|
||||
|
||||
maxint64 = (1L << 63) - 1
|
||||
minint64 = -maxint64-1
|
||||
|
||||
for base in maxint64, minint64, -maxint64, -(minint64 >> 1):
|
||||
while base:
|
||||
s = 'I' + to_little_endian_string(base, 8)
|
||||
got = marshal.loads(s)
|
||||
if base != got:
|
||||
raise TestFailed("for int %d, simulated marshal string is %r, "
|
||||
"loaded back as %d" % (base, s, got))
|
||||
if base == -1: # a fixed-point for shifting right 1
|
||||
base = 0
|
||||
else:
|
||||
base >>= 1
|
Loading…
Add table
Add a link
Reference in a new issue