]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
Improve error handling.
authorGuido van Rossum <guido@python.org>
Mon, 16 Dec 1991 15:44:24 +0000 (15:44 +0000)
committerGuido van Rossum <guido@python.org>
Mon, 16 Dec 1991 15:44:24 +0000 (15:44 +0000)
Modules/mathmodule.c

index 751f02b2b72974d368dcec788103f5bf2c179bd8..fdc576d60987c4c2e62e75aa6b6d33377b95e787 100644 (file)
@@ -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));