py/binary: Fix sign extension setting wide integer on 32-bit archs.
Signed-off-by: Damien George <damien@micropython.org>
This commit is contained in:
parent
bdfb584b29
commit
d7e1526593
@ -343,7 +343,7 @@ void mp_binary_set_val(char struct_type, char val_type, mp_obj_t val_in, byte *p
|
||||
val = mp_obj_get_int(val_in);
|
||||
// zero/sign extend if needed
|
||||
if (BYTES_PER_WORD < 8 && size > sizeof(val)) {
|
||||
int c = (is_signed(val_type) && (mp_int_t)val < 0) ? 0xff : 0x00;
|
||||
int c = (mp_int_t)val < 0 ? 0xff : 0x00;
|
||||
memset(p, c, size);
|
||||
if (struct_type == '>') {
|
||||
p += size - sizeof(val);
|
||||
|
@ -6,7 +6,7 @@ except ImportError:
|
||||
print("SKIP")
|
||||
raise SystemExit
|
||||
|
||||
N = 3
|
||||
N = 5
|
||||
|
||||
for endian in ("NATIVE", "LITTLE_ENDIAN", "BIG_ENDIAN"):
|
||||
for type_ in ("INT8", "UINT8", "INT16", "UINT16", "INT32", "UINT32", "INT64", "UINT64"):
|
||||
@ -15,5 +15,5 @@ for endian in ("NATIVE", "LITTLE_ENDIAN", "BIG_ENDIAN"):
|
||||
data = bytearray(sz)
|
||||
s = uctypes.struct(uctypes.addressof(data), desc, getattr(uctypes, endian))
|
||||
for i in range(N):
|
||||
s.arr[i] = i
|
||||
s.arr[i] = i - 2
|
||||
print(endian, type_, sz, *(s.arr[i] for i in range(N)))
|
||||
|
@ -1,24 +1,24 @@
|
||||
NATIVE INT8 3 0 1 2
|
||||
NATIVE UINT8 3 0 1 2
|
||||
NATIVE INT16 6 0 1 2
|
||||
NATIVE UINT16 6 0 1 2
|
||||
NATIVE INT32 12 0 1 2
|
||||
NATIVE UINT32 12 0 1 2
|
||||
NATIVE INT64 24 0 1 2
|
||||
NATIVE UINT64 24 0 1 2
|
||||
LITTLE_ENDIAN INT8 3 0 1 2
|
||||
LITTLE_ENDIAN UINT8 3 0 1 2
|
||||
LITTLE_ENDIAN INT16 6 0 1 2
|
||||
LITTLE_ENDIAN UINT16 6 0 1 2
|
||||
LITTLE_ENDIAN INT32 12 0 1 2
|
||||
LITTLE_ENDIAN UINT32 12 0 1 2
|
||||
LITTLE_ENDIAN INT64 24 0 1 2
|
||||
LITTLE_ENDIAN UINT64 24 0 1 2
|
||||
BIG_ENDIAN INT8 3 0 1 2
|
||||
BIG_ENDIAN UINT8 3 0 1 2
|
||||
BIG_ENDIAN INT16 6 0 1 2
|
||||
BIG_ENDIAN UINT16 6 0 1 2
|
||||
BIG_ENDIAN INT32 12 0 1 2
|
||||
BIG_ENDIAN UINT32 12 0 1 2
|
||||
BIG_ENDIAN INT64 24 0 1 2
|
||||
BIG_ENDIAN UINT64 24 0 1 2
|
||||
NATIVE INT8 5 -2 -1 0 1 2
|
||||
NATIVE UINT8 5 254 255 0 1 2
|
||||
NATIVE INT16 10 -2 -1 0 1 2
|
||||
NATIVE UINT16 10 65534 65535 0 1 2
|
||||
NATIVE INT32 20 -2 -1 0 1 2
|
||||
NATIVE UINT32 20 4294967294 4294967295 0 1 2
|
||||
NATIVE INT64 40 -2 -1 0 1 2
|
||||
NATIVE UINT64 40 18446744073709551614 18446744073709551615 0 1 2
|
||||
LITTLE_ENDIAN INT8 5 -2 -1 0 1 2
|
||||
LITTLE_ENDIAN UINT8 5 254 255 0 1 2
|
||||
LITTLE_ENDIAN INT16 10 -2 -1 0 1 2
|
||||
LITTLE_ENDIAN UINT16 10 65534 65535 0 1 2
|
||||
LITTLE_ENDIAN INT32 20 -2 -1 0 1 2
|
||||
LITTLE_ENDIAN UINT32 20 4294967294 4294967295 0 1 2
|
||||
LITTLE_ENDIAN INT64 40 -2 -1 0 1 2
|
||||
LITTLE_ENDIAN UINT64 40 18446744073709551614 18446744073709551615 0 1 2
|
||||
BIG_ENDIAN INT8 5 -2 -1 0 1 2
|
||||
BIG_ENDIAN UINT8 5 254 255 0 1 2
|
||||
BIG_ENDIAN INT16 10 -2 -1 0 1 2
|
||||
BIG_ENDIAN UINT16 10 65534 65535 0 1 2
|
||||
BIG_ENDIAN INT32 20 -2 -1 0 1 2
|
||||
BIG_ENDIAN UINT32 20 4294967294 4294967295 0 1 2
|
||||
BIG_ENDIAN INT64 40 -2 -1 0 1 2
|
||||
BIG_ENDIAN UINT64 40 18446744073709551614 18446744073709551615 0 1 2
|
||||
|
Loading…
x
Reference in New Issue
Block a user