diff options
author | Damien George <damien.p.george@gmail.com> | 2015-03-14 22:07:30 +0000 |
---|---|---|
committer | Damien George <damien.p.george@gmail.com> | 2015-03-14 22:07:30 +0000 |
commit | 6837d46c1da0e7dd9cf73969bb58649222f455a4 (patch) | |
tree | dd23d5419797b3f849bae0285199fc65b712d56f /py/objint_mpz.c | |
parent | 26a9975fba2bbd8875f2671495003b9bdcb8d8b2 (diff) | |
download | micropython-6837d46c1da0e7dd9cf73969bb58649222f455a4.tar.gz micropython-6837d46c1da0e7dd9cf73969bb58649222f455a4.zip |
py: Fix builtin abs so it works for bools and bignum.
Diffstat (limited to 'py/objint_mpz.c')
-rw-r--r-- | py/objint_mpz.c | 21 |
1 files changed, 21 insertions, 0 deletions
diff --git a/py/objint_mpz.c b/py/objint_mpz.c index c46692ec76..be917f4a74 100644 --- a/py/objint_mpz.c +++ b/py/objint_mpz.c @@ -112,6 +112,27 @@ bool mp_obj_int_is_positive(mp_obj_t self_in) { return !self->mpz.neg; } +// This must handle int and bool types, and must raise a +// TypeError if the argument is not integral +mp_obj_t mp_obj_int_abs(mp_obj_t self_in) { + if (MP_OBJ_IS_TYPE(self_in, &mp_type_int)) { + mp_obj_int_t *self = self_in; + mp_obj_int_t *self2 = mp_obj_int_new_mpz(); + mpz_abs_inpl(&self2->mpz, &self->mpz); + return self2; + } else { + mp_int_t val = mp_obj_get_int(self_in); + if (val == MP_SMALL_INT_MIN) { + return mp_obj_new_int_from_ll(-val); + } else { + if (val < 0) { + val = -val; + } + return MP_OBJ_NEW_SMALL_INT(val); + } + } +} + mp_obj_t mp_obj_int_unary_op(mp_uint_t op, mp_obj_t o_in) { mp_obj_int_t *o = o_in; switch (op) { |