summaryrefslogtreecommitdiffstats
path: root/Modules
diff options
context:
space:
mode:
authorGuido van Rossum <guido@python.org>1991-12-16 15:44:24 (GMT)
committerGuido van Rossum <guido@python.org>1991-12-16 15:44:24 (GMT)
commit8832b621015c91fcca6799f633aa3f239d6189c1 (patch)
tree2d4161aef02113813f02a22d3e0b454e7dd80d49 /Modules
parent6e93c07a06d8a2b7e0aa651a11310182216abf94 (diff)
downloadcpython-8832b621015c91fcca6799f633aa3f239d6189c1.zip
cpython-8832b621015c91fcca6799f633aa3f239d6189c1.tar.gz
cpython-8832b621015c91fcca6799f633aa3f239d6189c1.tar.bz2
Improve error handling.
Diffstat (limited to 'Modules')
-rw-r--r--Modules/mathmodule.c35
1 files changed, 30 insertions, 5 deletions
diff --git a/Modules/mathmodule.c b/Modules/mathmodule.c
index 751f02b..fdc576d 100644
--- a/Modules/mathmodule.c
+++ b/Modules/mathmodule.c
@@ -35,6 +35,26 @@ extern int errno;
#include <math.h>
+#ifdef HUGE_VAL
+#define CHECK(x) if (errno != 0) ; \
+ else if (-HUGE_VAL <= (x) && (x) <= HUGE_VAL) ; \
+ else errno = ERANGE
+#else
+#define CHECK(x) /* Don't know how to check */
+#endif
+
+static object *
+math_error()
+{
+ if (errno == EDOM)
+ err_setstr(ValueError, "math domain error");
+ else if (errno == ERANGE)
+ err_setstr(OverflowError, "math range error");
+ else
+ err_errno(RuntimeError);
+ return NULL;
+}
+
static object *
math_1(args, func)
object *args;
@@ -45,8 +65,9 @@ math_1(args, func)
return NULL;
errno = 0;
x = (*func)(x);
+ CHECK(x);
if (errno != 0)
- return err_errno(RuntimeError);
+ return math_error();
else
return newfloatobject(x);
}
@@ -61,8 +82,9 @@ math_2(args, func)
return NULL;
errno = 0;
x = (*func)(x, y);
+ CHECK(x);
if (errno != 0)
- return err_errno(RuntimeError);
+ return math_error();
else
return newfloatobject(x);
}
@@ -120,8 +142,9 @@ math_frexp(self, args)
return NULL;
errno = 0;
x = frexp(x, &i);
+ CHECK(x);
if (errno != 0)
- return err_errno(RuntimeError);
+ return math_error();
v = newtupleobject(2);
if (v != NULL) {
settupleitem(v, 0, newfloatobject(x));
@@ -145,8 +168,9 @@ math_ldexp(self, args)
return NULL;
errno = 0;
x = ldexp(x, (int)y);
+ CHECK(x);
if (errno != 0)
- return err_errno(RuntimeError);
+ return math_error();
else
return newfloatobject(x);
}
@@ -162,8 +186,9 @@ math_modf(self, args)
return NULL;
errno = 0;
x = modf(x, &y);
+ CHECK(x);
if (errno != 0)
- return err_errno(RuntimeError);
+ return math_error();
v = newtupleobject(2);
if (v != NULL) {
settupleitem(v, 0, newfloatobject(x));