From f658b0d862cb4eafe8df5bd22cb1302d83da4938 Mon Sep 17 00:00:00 2001 From: Jeff Epler Date: Tue, 15 Jul 2025 18:49:51 +0100 Subject: [PATCH] py/objint: Fix converting float to int with OBJ_REPR_B. The check for 'fits in a small int' is specific to the 31-bit int of other object representations. Signed-off-by: Jeff Epler --- py/objint.c | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/py/objint.c b/py/objint.c index fd9ab106f9..901264aca6 100644 --- a/py/objint.c +++ b/py/objint.c @@ -117,9 +117,15 @@ static mp_fp_as_int_class_t mp_classify_fp_as_int(mp_float_t val) { } // 8 * sizeof(uintptr_t) counts the number of bits for a small int // TODO provide a way to configure this properly + #if MICROPY_OBJ_REPR == MICROPY_OBJ_REPR_B + if (e <= ((8 * sizeof(uintptr_t) + MP_FLOAT_EXP_BIAS - 4) << MP_FLOAT_EXP_SHIFT_I32)) { + return MP_FP_CLASS_FIT_SMALLINT; + } + #else if (e <= ((8 * sizeof(uintptr_t) + MP_FLOAT_EXP_BIAS - 3) << MP_FLOAT_EXP_SHIFT_I32)) { return MP_FP_CLASS_FIT_SMALLINT; } + #endif #if MICROPY_LONGINT_IMPL == MICROPY_LONGINT_IMPL_LONGLONG if (e <= (((sizeof(long long) * MP_BITS_PER_BYTE) + MP_FLOAT_EXP_BIAS - 2) << MP_FLOAT_EXP_SHIFT_I32)) { return MP_FP_CLASS_FIT_LONGINT;