Skip to content

Commit d7e1526

Browse files
committed
py/binary: Fix sign extension setting wide integer on 32-bit archs.
Signed-off-by: Damien George <damien@micropython.org>
1 parent bdfb584 commit d7e1526

File tree

3 files changed

+27
-27
lines changed

3 files changed

+27
-27
lines changed

py/binary.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -343,7 +343,7 @@ void mp_binary_set_val(char struct_type, char val_type, mp_obj_t val_in, byte *p
343343
val = mp_obj_get_int(val_in);
344344
// zero/sign extend if needed
345345
if (BYTES_PER_WORD < 8 && size > sizeof(val)) {
346-
int c = (is_signed(val_type) && (mp_int_t)val < 0) ? 0xff : 0x00;
346+
int c = (mp_int_t)val < 0 ? 0xff : 0x00;
347347
memset(p, c, size);
348348
if (struct_type == '>') {
349349
p += size - sizeof(val);

tests/extmod/uctypes_array_load_store.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
print("SKIP")
77
raise SystemExit
88

9-
N = 3
9+
N = 5
1010

1111
for endian in ("NATIVE", "LITTLE_ENDIAN", "BIG_ENDIAN"):
1212
for type_ in ("INT8", "UINT8", "INT16", "UINT16", "INT32", "UINT32", "INT64", "UINT64"):
@@ -15,5 +15,5 @@
1515
data = bytearray(sz)
1616
s = uctypes.struct(uctypes.addressof(data), desc, getattr(uctypes, endian))
1717
for i in range(N):
18-
s.arr[i] = i
18+
s.arr[i] = i - 2
1919
print(endian, type_, sz, *(s.arr[i] for i in range(N)))
Lines changed: 24 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -1,24 +1,24 @@
1-
NATIVE INT8 3 0 1 2
2-
NATIVE UINT8 3 0 1 2
3-
NATIVE INT16 6 0 1 2
4-
NATIVE UINT16 6 0 1 2
5-
NATIVE INT32 12 0 1 2
6-
NATIVE UINT32 12 0 1 2
7-
NATIVE INT64 24 0 1 2
8-
NATIVE UINT64 24 0 1 2
9-
LITTLE_ENDIAN INT8 3 0 1 2
10-
LITTLE_ENDIAN UINT8 3 0 1 2
11-
LITTLE_ENDIAN INT16 6 0 1 2
12-
LITTLE_ENDIAN UINT16 6 0 1 2
13-
LITTLE_ENDIAN INT32 12 0 1 2
14-
LITTLE_ENDIAN UINT32 12 0 1 2
15-
LITTLE_ENDIAN INT64 24 0 1 2
16-
LITTLE_ENDIAN UINT64 24 0 1 2
17-
BIG_ENDIAN INT8 3 0 1 2
18-
BIG_ENDIAN UINT8 3 0 1 2
19-
BIG_ENDIAN INT16 6 0 1 2
20-
BIG_ENDIAN UINT16 6 0 1 2
21-
BIG_ENDIAN INT32 12 0 1 2
22-
BIG_ENDIAN UINT32 12 0 1 2
23-
BIG_ENDIAN INT64 24 0 1 2
24-
BIG_ENDIAN UINT64 24 0 1 2
1+
NATIVE INT8 5 -2 -1 0 1 2
2+
NATIVE UINT8 5 254 255 0 1 2
3+
NATIVE INT16 10 -2 -1 0 1 2
4+
NATIVE UINT16 10 65534 65535 0 1 2
5+
NATIVE INT32 20 -2 -1 0 1 2
6+
NATIVE UINT32 20 4294967294 4294967295 0 1 2
7+
NATIVE INT64 40 -2 -1 0 1 2
8+
NATIVE UINT64 40 18446744073709551614 18446744073709551615 0 1 2
9+
LITTLE_ENDIAN INT8 5 -2 -1 0 1 2
10+
LITTLE_ENDIAN UINT8 5 254 255 0 1 2
11+
LITTLE_ENDIAN INT16 10 -2 -1 0 1 2
12+
LITTLE_ENDIAN UINT16 10 65534 65535 0 1 2
13+
LITTLE_ENDIAN INT32 20 -2 -1 0 1 2
14+
LITTLE_ENDIAN UINT32 20 4294967294 4294967295 0 1 2
15+
LITTLE_ENDIAN INT64 40 -2 -1 0 1 2
16+
LITTLE_ENDIAN UINT64 40 18446744073709551614 18446744073709551615 0 1 2
17+
BIG_ENDIAN INT8 5 -2 -1 0 1 2
18+
BIG_ENDIAN UINT8 5 254 255 0 1 2
19+
BIG_ENDIAN INT16 10 -2 -1 0 1 2
20+
BIG_ENDIAN UINT16 10 65534 65535 0 1 2
21+
BIG_ENDIAN INT32 20 -2 -1 0 1 2
22+
BIG_ENDIAN UINT32 20 4294967294 4294967295 0 1 2
23+
BIG_ENDIAN INT64 40 -2 -1 0 1 2
24+
BIG_ENDIAN UINT64 40 18446744073709551614 18446744073709551615 0 1 2

0 commit comments

Comments
 (0)