summaryrefslogtreecommitdiffstatshomepage
path: root/py/runtime.c
diff options
context:
space:
mode:
authorDamien George <damien.p.george@gmail.com>2015-06-13 22:00:10 +0100
committerDamien George <damien.p.george@gmail.com>2015-06-13 23:36:30 +0100
commitc5029bcbf37fd1a3fb145d9fa9e4a5094478f17b (patch)
tree3f5f37bbf827d9b1ca302a5492e6522090998076 /py/runtime.c
parent6f4952004207a249a437dc822c5252422f63cc69 (diff)
downloadmicropython-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.c11
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;