diff options
author | Damien George <damien.p.george@gmail.com> | 2014-04-03 11:00:54 +0000 |
---|---|---|
committer | Damien George <damien.p.george@gmail.com> | 2014-04-03 11:00:54 +0000 |
commit | 8270e3853dc167d2d7946bb0de7a0f0bb2adde48 (patch) | |
tree | e261ee333b53fbe4560c94e37a531eaae2c0d60e /py/objint_mpz.c | |
parent | a58a7aefbd330261cc5c79c9fc9d5c6a12d2aeeb (diff) | |
download | micropython-8270e3853dc167d2d7946bb0de7a0f0bb2adde48.tar.gz micropython-8270e3853dc167d2d7946bb0de7a0f0bb2adde48.zip |
py: More robust int conversion and overflow checking.
Diffstat (limited to 'py/objint_mpz.c')
-rw-r--r-- | py/objint_mpz.c | 14 |
1 files changed, 12 insertions, 2 deletions
diff --git a/py/objint_mpz.c b/py/objint_mpz.c index 27f77d14b7..25a069cf93 100644 --- a/py/objint_mpz.c +++ b/py/objint_mpz.c @@ -243,8 +243,18 @@ machine_int_t mp_obj_int_get(mp_obj_t self_in) { } machine_int_t mp_obj_int_get_checked(mp_obj_t self_in) { - // TODO: Check overflow - return mp_obj_int_get(self_in); + if (MP_OBJ_IS_SMALL_INT(self_in)) { + return MP_OBJ_SMALL_INT_VALUE(self_in); + } else { + mp_obj_int_t *self = self_in; + machine_int_t value; + if (mpz_as_int_checked(&self->mpz, &value)) { + return value; + } else { + // overflow + nlr_jump(mp_obj_new_exception_msg(&mp_type_OverflowError, "overflow converting long int to machine word")); + } + } } #if MICROPY_ENABLE_FLOAT |