summaryrefslogtreecommitdiff
path: root/py/builtin.c
diff options
context:
space:
mode:
authorDamien George <damien.p.george@gmail.com>2014-09-13 18:43:09 +0100
committerDamien George <damien.p.george@gmail.com>2014-09-13 18:43:09 +0100
commit8594ce228011e6264f59ade4ff8a7f2bfa90a649 (patch)
tree528fa7008c5e4c4b283c33abcf3eefd17d6a0b52 /py/builtin.c
parent5c6783496d8211eb4b19cec2cbb2b66e2a37f0eb (diff)
py: Implement divmod, % and proper // for floating point.
Tested and working on unix and pyboard.
Diffstat (limited to 'py/builtin.c')
-rw-r--r--py/builtin.c19
1 files changed, 19 insertions, 0 deletions
diff --git a/py/builtin.c b/py/builtin.c
index 9810270fe..5b70531ae 100644
--- a/py/builtin.c
+++ b/py/builtin.c
@@ -242,13 +242,32 @@ STATIC mp_obj_t mp_builtin_dir(mp_uint_t n_args, const mp_obj_t *args) {
MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN(mp_builtin_dir_obj, 0, 1, mp_builtin_dir);
STATIC mp_obj_t mp_builtin_divmod(mp_obj_t o1_in, mp_obj_t o2_in) {
+ // TODO handle big int
if (MP_OBJ_IS_SMALL_INT(o1_in) && MP_OBJ_IS_SMALL_INT(o2_in)) {
mp_int_t i1 = MP_OBJ_SMALL_INT_VALUE(o1_in);
mp_int_t i2 = MP_OBJ_SMALL_INT_VALUE(o2_in);
+ if (i2 == 0) {
+ zero_division_error:
+ nlr_raise(mp_obj_new_exception_msg(&mp_type_ZeroDivisionError, "division by zero"));
+ }
mp_obj_t args[2];
args[0] = MP_OBJ_NEW_SMALL_INT(i1 / i2);
args[1] = MP_OBJ_NEW_SMALL_INT(i1 % i2);
return mp_obj_new_tuple(2, args);
+#if MICROPY_PY_BUILTINS_FLOAT
+ } else if (MP_OBJ_IS_TYPE(o1_in, &mp_type_float) || MP_OBJ_IS_TYPE(o2_in, &mp_type_float)) {
+ mp_float_t f1 = mp_obj_get_float(o1_in);
+ mp_float_t f2 = mp_obj_get_float(o2_in);
+ if (f2 == 0.0) {
+ goto zero_division_error;
+ }
+ mp_obj_float_divmod(&f1, &f2);
+ mp_obj_t tuple[2] = {
+ mp_obj_new_float(f1),
+ mp_obj_new_float(f2),
+ };
+ return mp_obj_new_tuple(2, tuple);
+#endif
} else {
nlr_raise(mp_obj_new_exception_msg_varg(&mp_type_TypeError, "unsupported operand type(s) for divmod(): '%s' and '%s'", mp_obj_get_type_str(o1_in), mp_obj_get_type_str(o2_in)));
}