Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
9 changes: 6 additions & 3 deletions py/parsenum.c
Original file line number Diff line number Diff line change
Expand Up @@ -64,7 +64,7 @@ typedef mp_int_t parsed_int_t;
typedef unsigned long long parsed_int_t;

#define PARSED_INT_MUL_OVERFLOW mp_mul_ull_overflow
#define PARSED_INT_FITS(I) ((I) <= (unsigned long long)LLONG_MAX)
#define PARSED_INT_FITS(I) ((I) <= (unsigned long long)LLONG_MAX + 1)
#endif

mp_obj_t mp_parse_num_integer(const char *restrict str_, size_t len, int base, mp_lexer_t *lex) {
Expand Down Expand Up @@ -135,8 +135,11 @@ mp_obj_t mp_parse_num_integer(const char *restrict str_, size_t len, int base, m
have_ret_val:
#else
// The PARSED_INT_FITS check above ensures parsed_val won't overflow signed long long
long long signed_val = parsed_val;
if (neg) {
long long signed_val = -parsed_val;
if (!neg) {
if (signed_val == LLONG_MIN) {
goto overflow;
}
signed_val = -signed_val;
}
ret_val = mp_obj_new_int_from_ll(signed_val); // Could be large or small int
Expand Down
8 changes: 8 additions & 0 deletions tests/basics/int_64_basics.py
Original file line number Diff line number Diff line change
Expand Up @@ -151,3 +151,11 @@
print((1 << 48) << -6)
except ValueError as e:
print(e)

# Test that the most extreme 64 bit integer values all parse with int()
print(int("-9223372036854775807"))
print(int("-9223372036854775808"))
print(int("9223372036854775807"))

# Test that the most negative 64 bit integer can be formed via arithmetic
print(-9223372036854775807-1)
Loading