summaryrefslogtreecommitdiff
path: root/Objects/intobject.c
diff options
context:
space:
mode:
authorGuido van Rossum <guido@python.org>1990-10-14 20:02:26 +0000
committerGuido van Rossum <guido@python.org>1990-10-14 20:02:26 +0000
commit165e67edaec7008797719d5f21c099eaac0c98d9 (patch)
treefd691015193fa197edb64c5176afeb94b50c301c /Objects/intobject.c
parent5c600e161450fb87b1d266df2d52a22401f04708 (diff)
downloadcpython-git-165e67edaec7008797719d5f21c099eaac0c98d9.tar.gz
New error handling.
Diffstat (limited to 'Objects/intobject.c')
-rw-r--r--Objects/intobject.c73
1 files changed, 37 insertions, 36 deletions
diff --git a/Objects/intobject.c b/Objects/intobject.c
index 7a69238afc..391cd80817 100644
--- a/Objects/intobject.c
+++ b/Objects/intobject.c
@@ -7,6 +7,7 @@
#include "intobject.h"
#include "stringobject.h"
#include "objimpl.h"
+#include "errors.h"
/* Standard Booleans */
intobject FalseObject = {
@@ -18,6 +19,20 @@ intobject TrueObject = {
1
};
+static object *
+err_ovf()
+{
+ err_setstr(RuntimeError, "integer overflow");
+ return NULL;
+}
+
+static object *
+err_zdiv()
+{
+ err_setstr(RuntimeError, "division by zero");
+ return NULL;
+}
+
object *
newintobject(ival)
long ival;
@@ -25,7 +40,7 @@ newintobject(ival)
/* For efficiency, this code is copied from newobject() */
register intobject *op = (intobject *) malloc(sizeof(intobject));
if (op == NULL) {
- errno = ENOMEM;
+ err_nomem();
}
else {
NEWREF(op);
@@ -40,7 +55,7 @@ getintvalue(op)
register object *op;
{
if (!is_intobject(op)) {
- errno = EBADF;
+ err_badarg();
return -1;
}
else
@@ -83,16 +98,14 @@ intadd(v, w)
{
register long a, b, x;
if (!is_intobject(w)) {
- errno = EINVAL;
+ err_badarg();
return NULL;
}
a = v->ob_ival;
b = ((intobject *)w) -> ob_ival;
x = a + b;
- if ((x^a) < 0 && (x^b) < 0) {
- errno = ERANGE;
- return NULL;
- }
+ if ((x^a) < 0 && (x^b) < 0)
+ return err_ovf();
return newintobject(x);
}
@@ -103,16 +116,14 @@ intsub(v, w)
{
register long a, b, x;
if (!is_intobject(w)) {
- errno = EINVAL;
+ err_badarg();
return NULL;
}
a = v->ob_ival;
b = ((intobject *)w) -> ob_ival;
x = a - b;
- if ((x^a) < 0 && (x^~b) < 0) {
- errno = ERANGE;
- return NULL;
- }
+ if ((x^a) < 0 && (x^~b) < 0)
+ return err_ovf();
return newintobject(x);
}
@@ -124,16 +135,14 @@ intmul(v, w)
register long a, b;
double x;
if (!is_intobject(w)) {
- errno = EINVAL;
+ err_badarg();
return NULL;
}
a = v->ob_ival;
b = ((intobject *)w) -> ob_ival;
x = (double)a * (double)b;
- if (x > 0x7fffffff || x < (double) (long) 0x80000000) {
- errno = ERANGE;
- return NULL;
- }
+ if (x > 0x7fffffff || x < (double) (long) 0x80000000)
+ return err_ovf();
return newintobject(a * b);
}
@@ -143,13 +152,11 @@ intdiv(v, w)
register object *w;
{
if (!is_intobject(w)) {
- errno = EINVAL;
- return NULL;
- }
- if (((intobject *)w) -> ob_ival == 0) {
- errno = EDOM;
+ err_badarg();
return NULL;
}
+ if (((intobject *)w) -> ob_ival == 0)
+ err_zdiv();
return newintobject(v->ob_ival / ((intobject *)w) -> ob_ival);
}
@@ -159,13 +166,11 @@ intrem(v, w)
register object *w;
{
if (!is_intobject(w)) {
- errno = EINVAL;
- return NULL;
- }
- if (((intobject *)w) -> ob_ival == 0) {
- errno = EDOM;
+ err_badarg();
return NULL;
}
+ if (((intobject *)w) -> ob_ival == 0)
+ err_zdiv();
return newintobject(v->ob_ival % ((intobject *)w) -> ob_ival);
}
@@ -177,7 +182,7 @@ intpow(v, w)
register long iv, iw, ix;
register int neg;
if (!is_intobject(w)) {
- errno = EINVAL;
+ err_badarg();
return NULL;
}
iv = v->ob_ival;
@@ -189,10 +194,8 @@ intpow(v, w)
for (; iw > 0; iw--)
ix = ix * iv;
if (neg) {
- if (ix == 0) {
- errno = EDOM;
- return NULL;
- }
+ if (ix == 0)
+ err_zdiv();
ix = 1/ix;
}
/* XXX How to check for overflow? */
@@ -206,10 +209,8 @@ intneg(v)
register long a, x;
a = v->ob_ival;
x = -a;
- if (a < 0 && x < 0) {
- errno = ERANGE;
- return NULL;
- }
+ if (a < 0 && x < 0)
+ return err_ovf();
return newintobject(x);
}