py: Properly implement divide-by-zero handling.
"1/0" is sacred idiom, the shortest way to break program execution (sys.exit() is too long).
This commit is contained in:
parent
96ed213320
commit
6ded55a61f
13
py/runtime.c
13
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_FLOOR_DIVIDE:
|
||||||
case MP_BINARY_OP_INPLACE_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);
|
lhs_val = python_floor_divide(lhs_val, rhs_val);
|
||||||
break;
|
break;
|
||||||
}
|
|
||||||
#if MICROPY_ENABLE_FLOAT
|
#if MICROPY_ENABLE_FLOAT
|
||||||
case MP_BINARY_OP_TRUE_DIVIDE:
|
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
|
#endif
|
||||||
|
|
||||||
case MP_BINARY_OP_MODULO:
|
case MP_BINARY_OP_MODULO:
|
||||||
|
@ -1,3 +1,16 @@
|
|||||||
# basic float
|
# basic float
|
||||||
x = 1 / 2
|
x = 1 / 2
|
||||||
print(x)
|
print(x)
|
||||||
|
|
||||||
|
print(1.0 // 2)
|
||||||
|
print(2.0 // 2)
|
||||||
|
|
||||||
|
try:
|
||||||
|
1.0 / 0
|
||||||
|
except ZeroDivisionError:
|
||||||
|
print("ZeroDivisionError")
|
||||||
|
|
||||||
|
try:
|
||||||
|
1.0 // 0
|
||||||
|
except ZeroDivisionError:
|
||||||
|
print("ZeroDivisionError")
|
||||||
|
9
tests/basics/int-divzero.py
Normal file
9
tests/basics/int-divzero.py
Normal file
@ -0,0 +1,9 @@
|
|||||||
|
try:
|
||||||
|
1 / 0
|
||||||
|
except ZeroDivisionError:
|
||||||
|
print("ZeroDivisionError")
|
||||||
|
|
||||||
|
try:
|
||||||
|
1 // 0
|
||||||
|
except ZeroDivisionError:
|
||||||
|
print("ZeroDivisionError")
|
Loading…
x
Reference in New Issue
Block a user