From d7e1526593151b33ab52af445647c6d1315a96dc Mon Sep 17 00:00:00 2001 From: Damien George Date: Thu, 5 Nov 2020 22:42:28 +1100 Subject: [PATCH] py/binary: Fix sign extension setting wide integer on 32-bit archs. Signed-off-by: Damien George --- py/binary.c | 2 +- tests/extmod/uctypes_array_load_store.py | 4 +- tests/extmod/uctypes_array_load_store.py.exp | 48 ++++++++++---------- 3 files changed, 27 insertions(+), 27 deletions(-) diff --git a/py/binary.c b/py/binary.c index d0f72ec23..1847894b7 100644 --- a/py/binary.c +++ b/py/binary.c @@ -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); diff --git a/tests/extmod/uctypes_array_load_store.py b/tests/extmod/uctypes_array_load_store.py index 709b9f5c2..3b9bb6d73 100644 --- a/tests/extmod/uctypes_array_load_store.py +++ b/tests/extmod/uctypes_array_load_store.py @@ -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))) diff --git a/tests/extmod/uctypes_array_load_store.py.exp b/tests/extmod/uctypes_array_load_store.py.exp index f6f7bc96e..10de80464 100644 --- a/tests/extmod/uctypes_array_load_store.py.exp +++ b/tests/extmod/uctypes_array_load_store.py.exp @@ -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