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_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:
|
||||
|
@ -1,3 +1,16 @@
|
||||
# basic float
|
||||
x = 1 / 2
|
||||
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