Author: leo
Date: Tue Jan 10 09:18:55 2006
New Revision: 11044

Modified:
   trunk/src/ops/math.ops
   trunk/t/op/integer.t
   trunk/t/op/number.t
Log:
Math - Divide by zero #1

* throw exception for div, fdiv - Ix, Nx 
* TODO JIT, mod, cmod, PMCs


Modified: trunk/src/ops/math.ops
==============================================================================
--- trunk/src/ops/math.ops      (original)
+++ trunk/src/ops/math.ops      Tue Jan 10 09:18:55 2006
@@ -360,26 +360,43 @@ Divide $1 by $2.
 
 Set $1 to the quotient of $2 divided by $3. In the case of INTVAL division, the
 result is truncated (NOT rounded or floored).
+If the denominator is zero, a 'Divide by zero' exception is thrown.
 
 =cut
 
 inline op div(inout INT, in INT) :base_core {
-  $1 /= $2;
+  INTVAL den = $2;
+  if ($2 == 0)
+    real_exception(interpreter, NULL, E_ZeroDivisionError,
+                   "Divide by zero");
+  $1 /= den;
   goto NEXT();
 }
 
 inline op div(inout NUM, in NUM) :base_core {
-  $1 /= $2;
+  FLOATVAL den = $2;
+  if ($2 == 0.0)
+    real_exception(interpreter, NULL, E_ZeroDivisionError,
+                   "Divide by zero");
+  $1 /= den;
   goto NEXT();
 }
 
 inline op div(out INT, in INT, in INT) :base_core {
-  $1 = $2 / $3;
+  INTVAL den = $3;
+  if ($3 == 0)
+    real_exception(interpreter, NULL, E_ZeroDivisionError,
+                   "Divide by zero");
+  $1 = $2 / den;
   goto NEXT();
 }
 
 inline op div(out NUM, in NUM, in NUM) :base_core {
-  $1 = $2 / $3;
+  FLOATVAL den = $3;
+  if ($3 == 0.0)
+    real_exception(interpreter, NULL, E_ZeroDivisionError,
+                   "Divide by zero");
+  $1 = $2 / den;
   goto NEXT();
 }
 
@@ -395,26 +412,43 @@ Floor divide $1 by $2.
 
 Set $1 to the quotient of $2 divided by $3. The result is the floor()
 of the division i.e. the next whole integer towards -inf.
+If the denominator is zero, a 'Divide by zero' exception is thrown.
 
 =cut
 
 inline op fdiv(inout INT, in INT) :base_core {
-  $1 = (INTVAL)floor($1 / $2);
+  INTVAL den = $2;
+  if ($2 == 0)
+    real_exception(interpreter, NULL, E_ZeroDivisionError,
+                   "Divide by zero");
+  $1 = (INTVAL)floor($1 / den);
   goto NEXT();
 }
 
 inline op fdiv(inout NUM, in NUM) :base_core {
-  $1 = floor($1 / $2);
+  FLOATVAL den = $2;
+  if ($2 == 0.0)
+    real_exception(interpreter, NULL, E_ZeroDivisionError,
+                   "Divide by zero");
+  $1 = floor($1 / den);
   goto NEXT();
 }
 
 inline op fdiv(out INT, in INT, in INT) :base_core {
-  $1 = (INTVAL)floor($2 / $3);
+  INTVAL den = $3;
+  if ($3 == 0)
+    real_exception(interpreter, NULL, E_ZeroDivisionError,
+                   "Divide by zero");
+  $1 = (INTVAL)floor($2 / den);
   goto NEXT();
 }
 
 inline op fdiv(out NUM, in NUM, in NUM) :base_core {
-  $1 = floor($2 / $3);
+  FLOATVAL den = $3;
+  if ($3 == 0.0)
+    real_exception(interpreter, NULL, E_ZeroDivisionError,
+                   "Divide by zero");
+  $1 = floor($2 / den);
   goto NEXT();
 }
 

Modified: trunk/t/op/integer.t
==============================================================================
--- trunk/t/op/integer.t        (original)
+++ trunk/t/op/integer.t        Tue Jan 10 09:18:55 2006
@@ -1234,7 +1234,7 @@ CODE
 0
 OUTPUT
 
-output_like(<<'CODE', <<OUTPUT, "div_i_i by zero", todo => 'not yet 
implemented');
+output_like(<<'CODE', <<OUTPUT, "div_i_i by zero");
        set I0, 0
        set I1, 10
        div I1, I0
@@ -1242,14 +1242,14 @@ CODE
 /.*Divide by zero.*/
 OUTPUT
 
-output_like(<<'CODE', <<OUTPUT, "div_i_ic by zero", todo => 'not yet 
implemented');
+output_like(<<'CODE', <<OUTPUT, "div_i_ic by zero");
        set I1, 10
        div I1, 0
 CODE
 /.*Divide by zero.*/
 OUTPUT
 
-output_like(<<'CODE', <<OUTPUT, "div_i_i_i by zero", todo => 'not yet 
implemented');
+output_like(<<'CODE', <<OUTPUT, "div_i_i_i by zero");
        set I0, 0
        set I1, 10
        div I2, I1, I0
@@ -1257,21 +1257,21 @@ CODE
 /.*Divide by zero.*/
 OUTPUT
 
-output_like(<<'CODE', <<OUTPUT, "div_i_ic_i by zero", todo => 'not yet 
implemented');
+output_like(<<'CODE', <<OUTPUT, "div_i_ic_i by zero");
        set I0, 0
        div I2, 10, I0
 CODE
 /.*Divide by zero.*/
 OUTPUT
 
-output_like(<<'CODE', <<OUTPUT, "div_i_i_ic by zero", todo => 'not yet 
implemented');
+output_like(<<'CODE', <<OUTPUT, "div_i_i_ic by zero");
        set I1, 10
        div I2, I1, 0
 CODE
 /.*Divide by zero.*/
 OUTPUT
 
-output_like(<<'CODE', <<OUTPUT, "fdiv_i_i by zero", todo => 'not yet 
implemented');
+output_like(<<'CODE', <<OUTPUT, "fdiv_i_i by zero");
        set I0, 0
        set I1, 10
        fdiv I1, I0
@@ -1279,14 +1279,14 @@ CODE
 /.*Divide by zero.*/
 OUTPUT
 
-output_like(<<'CODE', <<OUTPUT, "fdiv_i_ic by zero", todo => 'not yet 
implemented');
+output_like(<<'CODE', <<OUTPUT, "fdiv_i_ic by zero");
        set I1, 10
        fdiv I1, 0
 CODE
 /.*Divide by zero.*/
 OUTPUT
 
-output_like(<<'CODE', <<OUTPUT, "fdiv_i_i_i by zero", todo => 'not yet 
implemented');
+output_like(<<'CODE', <<OUTPUT, "fdiv_i_i_i by zero");
        set I0, 0
        set I1, 10
        fdiv I2, I1, I0
@@ -1294,14 +1294,14 @@ CODE
 /.*Divide by zero.*/
 OUTPUT
 
-output_like(<<'CODE', <<OUTPUT, "fdiv_i_ic_i by zero", todo => 'not yet 
implemented');
+output_like(<<'CODE', <<OUTPUT, "fdiv_i_ic_i by zero");
        set I0, 0
        fdiv I2, 10, I0
 CODE
 /.*Divide by zero.*/
 OUTPUT
 
-output_like(<<'CODE', <<OUTPUT, "fdiv_i_i_ic by zero", todo => 'not yet 
implemented');
+output_like(<<'CODE', <<OUTPUT, "fdiv_i_i_ic by zero");
        set I1, 10
        fdiv I2, I1, 0
 CODE

Modified: trunk/t/op/number.t
==============================================================================
--- trunk/t/op/number.t (original)
+++ trunk/t/op/number.t Tue Jan 10 09:18:55 2006
@@ -1091,7 +1091,7 @@ CODE
 1.414214
 OUTPUT
 
-output_like(<<'CODE', <<OUTPUT, "div_n_n by zero", todo => 'not yet 
implemented');
+output_like(<<'CODE', <<OUTPUT, "div_n_n by zero");
        set N0, 0
        set N1, 10
        div N1, N0
@@ -1099,14 +1099,14 @@ CODE
 /.*Divide by zero.*/
 OUTPUT
 
-output_like(<<'CODE', <<OUTPUT, "div_n_nc by zero", todo => 'not yet 
implemented');
+output_like(<<'CODE', <<OUTPUT, "div_n_nc by zero");
        set N1, 10
        div N1, 0
 CODE
 /.*Divide by zero.*/
 OUTPUT
 
-output_like(<<'CODE', <<OUTPUT, "div_n_n_n by zero", todo => 'not yet 
implemented');
+output_like(<<'CODE', <<OUTPUT, "div_n_n_n by zero");
        set N0, 0
        set N1, 10
        div N2, N1, N0
@@ -1114,21 +1114,21 @@ CODE
 /.*Divide by zero.*/
 OUTPUT
 
-output_like(<<'CODE', <<OUTPUT, "div_n_nc_n by zero", todo => 'not yet 
implemented');
+output_like(<<'CODE', <<OUTPUT, "div_n_nc_n by zero");
        set N0, 0
        div N2, 10, N0
 CODE
 /.*Divide by zero.*/
 OUTPUT
 
-output_like(<<'CODE', <<OUTPUT, "div_n_n_nc by zero", todo => 'not yet 
implemented');
+output_like(<<'CODE', <<OUTPUT, "div_n_n_nc by zero");
        set N1, 10
        div N2, N1, 0
 CODE
 /.*Divide by zero.*/
 OUTPUT
 
-output_like(<<'CODE', <<OUTPUT, "fdiv_n_n by zero", todo => 'not yet 
implemented');
+output_like(<<'CODE', <<OUTPUT, "fdiv_n_n by zero");
        set N0, 0
        set N1, 10
        fdiv N1, N0
@@ -1136,14 +1136,14 @@ CODE
 /.*Divide by zero.*/
 OUTPUT
 
-output_like(<<'CODE', <<OUTPUT, "fdiv_n_nc by zero", todo => 'not yet 
implemented');
+output_like(<<'CODE', <<OUTPUT, "fdiv_n_nc by zero");
        set N1, 10
        fdiv N1, 0
 CODE
 /.*Divide by zero.*/
 OUTPUT
 
-output_like(<<'CODE', <<OUTPUT, "fdiv_n_n_n by zero", todo => 'not yet 
implemented');
+output_like(<<'CODE', <<OUTPUT, "fdiv_n_n_n by zero");
        set N0, 0
        set N1, 10
        fdiv N2, N1, N0
@@ -1151,14 +1151,14 @@ CODE
 /.*Divide by zero.*/
 OUTPUT
 
-output_like(<<'CODE', <<OUTPUT, "fdiv_n_nc_n by zero", todo => 'not yet 
implemented');
+output_like(<<'CODE', <<OUTPUT, "fdiv_n_nc_n by zero");
        set N0, 0
        fdiv N2, 10, N0
 CODE
 /.*Divide by zero.*/
 OUTPUT
 
-output_like(<<'CODE', <<OUTPUT, "fdiv_n_n_nc by zero", todo => 'not yet 
implemented');
+output_like(<<'CODE', <<OUTPUT, "fdiv_n_n_nc by zero");
        set N1, 10
        fdiv N2, N1, 0
 CODE

Reply via email to