@@ -193,6 +193,9 @@ mp_obj_t mp_obj_int_binary_op(mp_uint_t op, mp_obj_t lhs_in, mp_obj_t rhs_in) {
193193 if (0 ) {
194194#if MICROPY_PY_BUILTINS_FLOAT
195195 } else if (op == MP_BINARY_OP_TRUE_DIVIDE || op == MP_BINARY_OP_INPLACE_TRUE_DIVIDE ) {
196+ if (mpz_is_zero (zrhs )) {
197+ goto zero_division_error ;
198+ }
196199 mp_float_t flhs = mpz_as_float (zlhs );
197200 mp_float_t frhs = mpz_as_float (zrhs );
198201 return mp_obj_new_float (flhs / frhs );
@@ -216,6 +219,11 @@ mp_obj_t mp_obj_int_binary_op(mp_uint_t op, mp_obj_t lhs_in, mp_obj_t rhs_in) {
216219 break ;
217220 case MP_BINARY_OP_FLOOR_DIVIDE :
218221 case MP_BINARY_OP_INPLACE_FLOOR_DIVIDE : {
222+ if (mpz_is_zero (zrhs )) {
223+ zero_division_error :
224+ nlr_raise (mp_obj_new_exception_msg (& mp_type_ZeroDivisionError ,
225+ "division by zero" ));
226+ }
219227 mpz_t rem ; mpz_init_zero (& rem );
220228 mpz_divmod_inpl (& res -> mpz , & rem , zlhs , zrhs );
221229 if (zlhs -> neg != zrhs -> neg ) {
@@ -229,6 +237,9 @@ mp_obj_t mp_obj_int_binary_op(mp_uint_t op, mp_obj_t lhs_in, mp_obj_t rhs_in) {
229237 }
230238 case MP_BINARY_OP_MODULO :
231239 case MP_BINARY_OP_INPLACE_MODULO : {
240+ if (mpz_is_zero (zrhs )) {
241+ goto zero_division_error ;
242+ }
232243 mpz_t quo ; mpz_init_zero (& quo );
233244 mpz_divmod_inpl (& quo , & res -> mpz , zlhs , zrhs );
234245 mpz_deinit (& quo );
@@ -274,6 +285,9 @@ mp_obj_t mp_obj_int_binary_op(mp_uint_t op, mp_obj_t lhs_in, mp_obj_t rhs_in) {
274285 break ;
275286
276287 case MP_BINARY_OP_DIVMOD : {
288+ if (mpz_is_zero (zrhs )) {
289+ goto zero_division_error ;
290+ }
277291 mp_obj_int_t * quo = mp_obj_int_new_mpz ();
278292 mpz_divmod_inpl (& quo -> mpz , & res -> mpz , zlhs , zrhs );
279293 // Check signs and do Python style modulo
0 commit comments