#include "intobject.h"
#include "stringobject.h"
#include "objimpl.h"
+#include "errors.h"
/* Standard Booleans */
intobject FalseObject = {
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;
/* 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);
register object *op;
{
if (!is_intobject(op)) {
- errno = EBADF;
+ err_badarg();
return -1;
}
else
{
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);
}
{
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);
}
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);
}
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);
}
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);
}
register long iv, iw, ix;
register int neg;
if (!is_intobject(w)) {
- errno = EINVAL;
+ err_badarg();
return NULL;
}
iv = v->ob_ival;
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? */
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);
}