diff options
author | Damien George <damien.p.george@gmail.com> | 2015-06-13 22:00:10 +0100 |
---|---|---|
committer | Damien George <damien.p.george@gmail.com> | 2015-06-13 23:36:30 +0100 |
commit | c5029bcbf37fd1a3fb145d9fa9e4a5094478f17b (patch) | |
tree | 3f5f37bbf827d9b1ca302a5492e6522090998076 /py/runtime.c | |
parent | 6f4952004207a249a437dc822c5252422f63cc69 (diff) | |
download | micropython-c5029bcbf37fd1a3fb145d9fa9e4a5094478f17b.tar.gz micropython-c5029bcbf37fd1a3fb145d9fa9e4a5094478f17b.zip |
py: Add MP_BINARY_OP_DIVMOD to simplify and consolidate divmod builtin.
Diffstat (limited to 'py/runtime.c')
-rw-r--r-- | py/runtime.c | 11 |
1 files changed, 11 insertions, 0 deletions
diff --git a/py/runtime.c b/py/runtime.c index 886146fa87..501ca435a0 100644 --- a/py/runtime.c +++ b/py/runtime.c @@ -441,6 +441,17 @@ mp_obj_t mp_binary_op(mp_uint_t op, mp_obj_t lhs, mp_obj_t rhs) { lhs = mp_obj_new_int_from_ll(MP_OBJ_SMALL_INT_VALUE(lhs)); goto generic_binary_op; + case MP_BINARY_OP_DIVMOD: { + if (rhs_val == 0) { + goto zero_division; + } + // to reduce stack usage we don't pass a temp array of the 2 items + mp_obj_tuple_t *tuple = mp_obj_new_tuple(2, NULL); + tuple->items[0] = MP_OBJ_NEW_SMALL_INT(mp_small_int_floor_divide(lhs_val, rhs_val)); + tuple->items[1] = MP_OBJ_NEW_SMALL_INT(mp_small_int_modulo(lhs_val, rhs_val)); + return tuple; + } + case MP_BINARY_OP_LESS: return MP_BOOL(lhs_val < rhs_val); break; case MP_BINARY_OP_MORE: return MP_BOOL(lhs_val > rhs_val); break; case MP_BINARY_OP_LESS_EQUAL: return MP_BOOL(lhs_val <= rhs_val); break; |