From 0a4eb4dbf2df34b9a2efcf55855b9db7c7132bf7 Mon Sep 17 00:00:00 2001 From: stijn Date: Fri, 18 Dec 2015 10:20:33 +0100 Subject: [PATCH] py/mpprint: Fix printing of 64bit integers for 64bit windows builds This makes all tests pass again for 64bit windows builds which would previously fail for anything printing ranges (builtin_range/unpack1) because they were printed as range( ld, ld ). This is done by reusing the mp_vprintf implementation for MICROPY_OBJ_REPR_D for 64bit windows builds (both msvc and mingw-w64) since the format specifier used for 64bit integers is also %lld, or %llu for the unsigned version. Note these specifiers used to be fetched from inttypes.h, which is the C99 way of working with printf/scanf in a portable way, but mingw-w64 wants to be backwards compatible with older MS C runtimes and uses the non-portable %I64i instead of %lld in inttypes.h, so remove the use of said header again in mpconfig.h and define the specifiers manually. --- py/mpconfig.h | 5 ++--- py/mpprint.c | 2 +- 2 files changed, 3 insertions(+), 4 deletions(-) diff --git a/py/mpconfig.h b/py/mpconfig.h index 58aa2ce0c0..6de184a9c4 100644 --- a/py/mpconfig.h +++ b/py/mpconfig.h @@ -909,9 +909,8 @@ typedef double mp_float_t; #define UINT_FMT "%lu" #define INT_FMT "%ld" #elif defined(_WIN64) -#include -#define UINT_FMT "%"PRIu64 -#define INT_FMT "%"PRId64 +#define UINT_FMT "%llu" +#define INT_FMT "%lld" #else // Archs where mp_int_t == int #define UINT_FMT "%u" diff --git a/py/mpprint.c b/py/mpprint.c index 30bbe3c6d9..19575f8a8a 100644 --- a/py/mpprint.c +++ b/py/mpprint.c @@ -529,7 +529,7 @@ int mp_vprintf(const mp_print_t *print, const char *fmt, va_list args) { // Because 'l' is eaten above, another 'l' means %ll. We need to support // this length specifier for OBJ_REPR_D (64-bit NaN boxing). // TODO Either enable this unconditionally, or provide a specific config var. - #if MICROPY_OBJ_REPR == MICROPY_OBJ_REPR_D + #if (MICROPY_OBJ_REPR == MICROPY_OBJ_REPR_D) || defined(_WIN64) case 'l': { unsigned long long int arg_value = va_arg(args, unsigned long long int); ++fmt;