From 6ded55a61f6bbf007d518fc4531287de08fe51c4 Mon Sep 17 00:00:00 2001 From: Paul Sokolovsky Date: Mon, 31 Mar 2014 02:20:00 +0300 Subject: py: Properly implement divide-by-zero handling. "1/0" is sacred idiom, the shortest way to break program execution (sys.exit() is too long). --- py/runtime.c | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) (limited to 'py') diff --git a/py/runtime.c b/py/runtime.c index 489886496..1eca45480 100644 --- a/py/runtime.c +++ b/py/runtime.c @@ -348,13 +348,20 @@ mp_obj_t mp_binary_op(int op, mp_obj_t lhs, mp_obj_t rhs) { } case MP_BINARY_OP_FLOOR_DIVIDE: case MP_BINARY_OP_INPLACE_FLOOR_DIVIDE: - { + if (rhs_val == 0) { + goto zero_division; + } lhs_val = python_floor_divide(lhs_val, rhs_val); break; - } + #if MICROPY_ENABLE_FLOAT case MP_BINARY_OP_TRUE_DIVIDE: - case MP_BINARY_OP_INPLACE_TRUE_DIVIDE: return mp_obj_new_float((mp_float_t)lhs_val / (mp_float_t)rhs_val); + case MP_BINARY_OP_INPLACE_TRUE_DIVIDE: + if (rhs_val == 0) { +zero_division: + nlr_jump(mp_obj_new_exception_msg(&mp_type_ZeroDivisionError, "division by zero")); + } + return mp_obj_new_float((mp_float_t)lhs_val / (mp_float_t)rhs_val); #endif case MP_BINARY_OP_MODULO: -- cgit v1.2.3