From 300c8bd4c2c0c6d626a6aaeb873c22a8f8b9fc3f Mon Sep 17 00:00:00 2001
From: Rachel Dowdall <rjdowdall@gmail.com>
Date: Thu, 20 Mar 2014 22:40:38 +0000
Subject: [PATCH] Added ZeroDivisionError to float division.

---
 py/obj.h       | 1 +
 py/objexcept.c | 1 +
 py/objfloat.c  | 9 +++++++--
 py/qstrdefs.h  | 1 +
 py/runtime.c   | 1 +
 5 files changed, 11 insertions(+), 2 deletions(-)

diff --git a/py/obj.h b/py/obj.h
index 1daa94344..8d40c3f2d 100644
--- a/py/obj.h
+++ b/py/obj.h
@@ -201,6 +201,7 @@ extern const mp_obj_type_t mp_type_OverflowError;
 extern const mp_obj_type_t mp_type_OSError;
 extern const mp_obj_type_t mp_type_NotImplementedError;
 extern const mp_obj_type_t mp_type_StopIteration;
+extern const mp_obj_type_t mp_type_ZeroDivisionError;
 
 // Constant objects, globally accessible
 
diff --git a/py/objexcept.c b/py/objexcept.c
index 11177724d..3f636ffc6 100644
--- a/py/objexcept.c
+++ b/py/objexcept.c
@@ -93,6 +93,7 @@ MP_DEFINE_EXCEPTION(OverflowError, BaseException)
 MP_DEFINE_EXCEPTION(OSError, BaseException)
 MP_DEFINE_EXCEPTION(NotImplementedError, BaseException)
 MP_DEFINE_EXCEPTION(StopIteration, BaseException)
+MP_DEFINE_EXCEPTION(ZeroDivisionError, BaseException)
 
 mp_obj_t mp_obj_new_exception(const mp_obj_type_t *exc_type) {
     return mp_obj_new_exception_msg_varg(exc_type, NULL);
diff --git a/py/objfloat.c b/py/objfloat.c
index 401c1145e..704b3d599 100644
--- a/py/objfloat.c
+++ b/py/objfloat.c
@@ -1,5 +1,6 @@
 #include <stdlib.h>
 #include <assert.h>
+#include <math.h>
 
 #include "nlr.h"
 #include "misc.h"
@@ -105,8 +106,12 @@ mp_obj_t mp_obj_float_binary_op(int op, mp_float_t lhs_val, mp_obj_t rhs_in) {
         case RT_BINARY_OP_INPLACE_FLOOR_DIVIDE: val = lhs_val / rhs_val; break;
         */
         case RT_BINARY_OP_TRUE_DIVIDE:
-        case RT_BINARY_OP_INPLACE_TRUE_DIVIDE: lhs_val /= rhs_val; break;
-
+        case RT_BINARY_OP_INPLACE_TRUE_DIVIDE: 
+            lhs_val /= rhs_val; 
+            if (isinf(lhs_val)){ // check for division by zero
+                nlr_jump(mp_obj_new_exception_msg(&mp_type_ZeroDivisionError, "float division by zero"));
+            }
+            break;
         case RT_BINARY_OP_LESS: return MP_BOOL(lhs_val < rhs_val);
         case RT_BINARY_OP_MORE: return MP_BOOL(lhs_val > rhs_val);
         case RT_BINARY_OP_LESS_EQUAL: return MP_BOOL(lhs_val <= rhs_val);
diff --git a/py/qstrdefs.h b/py/qstrdefs.h
index 649f89eb1..929fcaf06 100644
--- a/py/qstrdefs.h
+++ b/py/qstrdefs.h
@@ -47,6 +47,7 @@ Q(SyntaxError)
 Q(TypeError)
 Q(ValueError)
 Q(OverflowError)
+Q(ZeroDivisionError)
 
 Q(NoneType)
 
diff --git a/py/runtime.c b/py/runtime.c
index 9c8ba636c..b57a74fa3 100644
--- a/py/runtime.c
+++ b/py/runtime.c
@@ -158,6 +158,7 @@ STATIC const mp_builtin_elem_t builtin_table[] = {
     { MP_QSTR_OSError, (mp_obj_t)&mp_type_OSError },
     { MP_QSTR_NotImplementedError, (mp_obj_t)&mp_type_NotImplementedError },
     { MP_QSTR_StopIteration, (mp_obj_t)&mp_type_StopIteration },
+    { MP_QSTR_ZeroDivisionError, (mp_obj_t)&mp_type_ZeroDivisionError },
 
     // Extra builtins as defined by a port
     MICROPY_EXTRA_BUILTINS
-- 
GitLab