summaryrefslogtreecommitdiffstatshomepage
path: root/py/objint_mpz.c
diff options
context:
space:
mode:
authorDamien George <damien.p.george@gmail.com>2014-04-03 11:00:54 +0000
committerDamien George <damien.p.george@gmail.com>2014-04-03 11:00:54 +0000
commit8270e3853dc167d2d7946bb0de7a0f0bb2adde48 (patch)
treee261ee333b53fbe4560c94e37a531eaae2c0d60e /py/objint_mpz.c
parenta58a7aefbd330261cc5c79c9fc9d5c6a12d2aeeb (diff)
downloadmicropython-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.c14
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