# HG changeset patch # User Richard M. Stallman # Date 738819547 0 # Node ID 30b946dd8c669b368d413c43511e909bfb6b4da2 # Parent f5f76ebe6286e4753fdd117a242b2cec4c09c468 (float_arith_driver): Detect division by zero in advance. (arith_driver, Frem): Likewise. diff -r f5f76ebe6286 -r 30b946dd8c66 src/data.c --- a/src/data.c Mon May 31 02:59:19 1993 +0000 +++ b/src/data.c Mon May 31 03:39:07 1993 +0000 @@ -1550,8 +1550,7 @@ extern Lisp_Object float_arith_driver (); Lisp_Object -arith_driver - (code, nargs, args) +arith_driver (code, nargs, args) enum arithop code; int nargs; register Lisp_Object *args; @@ -1607,7 +1606,12 @@ case Amult: accum *= next; break; case Adiv: if (!argnum) accum = next; - else accum /= next; + else + { + if (next == 0) + Fsignal (Qarith_error, Qnil); + accum /= next; + } break; case Alogand: accum &= next; break; case Alogior: accum |= next; break; @@ -1668,7 +1672,11 @@ if (!argnum) accum = next; else - accum /= next; + { + if (next == 0) + Fsignal (Qarith_error, Qnil); + accum /= next; + } break; case Alogand: case Alogior: @@ -1746,6 +1754,9 @@ f1 = XTYPE (num1) == Lisp_Float ? XFLOAT (num1)->data : XINT (num1); f2 = XTYPE (num2) == Lisp_Float ? XFLOAT (num2)->data : XINT (num2); + if (f2 == 0) + Fsignal (Qarith_error, Qnil); + #if defined (USG) || defined (sun) || defined (ultrix) || defined (hpux) f1 = fmod (f1, f2); #else @@ -1760,6 +1771,9 @@ CHECK_NUMBER_COERCE_MARKER (num2, 1); #endif /* not LISP_FLOAT_TYPE */ + if (XFASTINT (num2) == 0) + Fsignal (Qarith_error, Qnil); + XSET (val, Lisp_Int, XINT (num1) % XINT (num2)); return val; }