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 <jepler@unpythonic.net>
This commit is contained in:
Jeff Epler
2025-07-15 18:49:51 +01:00
committed by Damien George
parent e35ac67421
commit f658b0d862

View File

@@ -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 // 8 * sizeof(uintptr_t) counts the number of bits for a small int
// TODO provide a way to configure this properly // 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)) { if (e <= ((8 * sizeof(uintptr_t) + MP_FLOAT_EXP_BIAS - 3) << MP_FLOAT_EXP_SHIFT_I32)) {
return MP_FP_CLASS_FIT_SMALLINT; return MP_FP_CLASS_FIT_SMALLINT;
} }
#endif
#if MICROPY_LONGINT_IMPL == MICROPY_LONGINT_IMPL_LONGLONG #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)) { 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; return MP_FP_CLASS_FIT_LONGINT;