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