diff --git a/py/objstr.c b/py/objstr.c index 07134687d1..4c09871b96 100644 --- a/py/objstr.c +++ b/py/objstr.c @@ -792,7 +792,7 @@ mp_obj_t str_format(uint n_args, const mp_obj_t *args) { if (arg_looks_integer(arg)) { switch (type) { case 'b': - pfenv_print_int(&pfenv_vstr, arg, 1, 2, 'a', flags, fill, width); + pfenv_print_mp_int(&pfenv_vstr, arg, 1, 2, 'a', flags, fill, width); continue; case 'c': @@ -805,7 +805,7 @@ mp_obj_t str_format(uint n_args, const mp_obj_t *args) { case '\0': // No explicit format type implies 'd' case 'n': // I don't think we support locales in uPy so use 'd' case 'd': - pfenv_print_int(&pfenv_vstr, arg, 1, 10, 'a', flags, fill, width); + pfenv_print_mp_int(&pfenv_vstr, arg, 1, 10, 'a', flags, fill, width); continue; case 'o': @@ -813,15 +813,15 @@ mp_obj_t str_format(uint n_args, const mp_obj_t *args) { flags |= PF_FLAG_SHOW_OCTAL_LETTER; } - pfenv_print_int(&pfenv_vstr, arg, 1, 8, 'a', flags, fill, width); + pfenv_print_mp_int(&pfenv_vstr, arg, 1, 8, 'a', flags, fill, width); continue; case 'x': - pfenv_print_int(&pfenv_vstr, arg, 1, 16, 'a', flags, fill, width); + pfenv_print_mp_int(&pfenv_vstr, arg, 1, 16, 'a', flags, fill, width); continue; case 'X': - pfenv_print_int(&pfenv_vstr, arg, 1, 16, 'A', flags, fill, width); + pfenv_print_mp_int(&pfenv_vstr, arg, 1, 16, 'A', flags, fill, width); continue; case 'e': @@ -1042,7 +1042,7 @@ STATIC mp_obj_t str_modulo_format(mp_obj_t pattern, uint n_args, const mp_obj_t case 'd': case 'i': case 'u': - pfenv_print_int(&pfenv_vstr, arg_as_int(arg), 1, 10, 'a', flags, fill, width); + pfenv_print_mp_int(&pfenv_vstr, arg_as_int(arg), 1, 10, 'a', flags, fill, width); break; #if MICROPY_ENABLE_FLOAT @@ -1060,7 +1060,7 @@ STATIC mp_obj_t str_modulo_format(mp_obj_t pattern, uint n_args, const mp_obj_t if (alt) { flags |= (PF_FLAG_SHOW_PREFIX | PF_FLAG_SHOW_OCTAL_LETTER); } - pfenv_print_int(&pfenv_vstr, arg_as_int(arg), 1, 8, 'a', flags, fill, width); + pfenv_print_mp_int(&pfenv_vstr, arg_as_int(arg), 1, 8, 'a', flags, fill, width); break; case 'r': @@ -1085,14 +1085,14 @@ STATIC mp_obj_t str_modulo_format(mp_obj_t pattern, uint n_args, const mp_obj_t if (alt) { flags |= PF_FLAG_SHOW_PREFIX; } - pfenv_print_int(&pfenv_vstr, arg_as_int(arg), 1, 16, 'a', flags, fill, width); + pfenv_print_mp_int(&pfenv_vstr, arg_as_int(arg), 1, 16, 'a', flags, fill, width); break; case 'X': if (alt) { flags |= PF_FLAG_SHOW_PREFIX; } - pfenv_print_int(&pfenv_vstr, arg_as_int(arg), 1, 16, 'A', flags, fill, width); + pfenv_print_mp_int(&pfenv_vstr, arg_as_int(arg), 1, 16, 'A', flags, fill, width); break; default: diff --git a/py/pfenv.c b/py/pfenv.c index ab45328ad7..b91390d6d9 100644 --- a/py/pfenv.c +++ b/py/pfenv.c @@ -77,11 +77,16 @@ int pfenv_print_strn(const pfenv_t *pfenv, const char *str, unsigned int len, in return len; } +int pfenv_print_int(const pfenv_t *pfenv, int x, int sgn, int base, int base_char, int flags, char fill, int width) { + // XXX this really needs to be a dedicated function, since converting to a mp_int looses the MSB + return pfenv_print_mp_int(pfenv, MP_OBJ_NEW_SMALL_INT((machine_int_t)x), sgn, base, base_char, flags, fill, width); +} + // 32-bits is 10 digits, add 3 for commas, 1 for sign, 1 for terminating null // We can use 16 characters for 32-bit and 32 characters for 64-bit #define INT_BUF_SIZE (sizeof(machine_int_t) * 4) -int pfenv_print_int(const pfenv_t *pfenv, mp_obj_t x, int sgn, int base, int base_char, int flags, char fill, int width) { +int pfenv_print_mp_int(const pfenv_t *pfenv, mp_obj_t x, int sgn, int base, int base_char, int flags, char fill, int width) { if (!MP_OBJ_IS_INT(x)) { // This will convert booleans to int, or raise an error for // non-integer types. diff --git a/py/pfenv.h b/py/pfenv.h index 32ecc159ff..6240b47acb 100644 --- a/py/pfenv.h +++ b/py/pfenv.h @@ -18,7 +18,8 @@ typedef struct _pfenv_t { void pfenv_vstr_add_strn(void *data, const char *str, unsigned int len); int pfenv_print_strn(const pfenv_t *pfenv, const char *str, unsigned int len, int flags, char fill, int width); -int pfenv_print_int(const pfenv_t *pfenv, mp_obj_t x, int sgn, int base, int base_char, int flags, char fill, int width); +int pfenv_print_int(const pfenv_t *pfenv, int x, int sgn, int base, int base_char, int flags, char fill, int width); +int pfenv_print_mp_int(const pfenv_t *pfenv, mp_obj_t x, int sgn, int base, int base_char, int flags, char fill, int width); #if MICROPY_ENABLE_FLOAT int pfenv_print_float(const pfenv_t *pfenv, mp_float_t f, char fmt, int flags, char fill, int width, int prec); #endif