py/binary: Fix sign extension setting wide integer on 32-bit archs.

Signed-off-by: Damien George <damien@micropython.org>
pull/6602/head
Damien George 2020-11-05 22:42:28 +11:00
rodzic bdfb584b29
commit d7e1526593
3 zmienionych plików z 27 dodań i 27 usunięć

Wyświetl plik

@ -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);

Wyświetl plik

@ -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)))

Wyświetl plik

@ -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