};
static object *
-err_ovf()
+err_ovf(msg)
+ char *msg;
{
- err_setstr(OverflowError, "integer overflow");
+ err_setstr(OverflowError, msg);
return NULL;
}
static object *
-err_zdiv()
+err_zdiv(msg)
+ char *msg;
{
- err_setstr(ZeroDivisionError, "integer division by zero");
+ err_setstr(ZeroDivisionError, msg);
return NULL;
}
b = ((intobject *)w) -> ob_ival;
x = a + b;
if ((x^a) < 0 && (x^b) < 0)
- return err_ovf();
+ return err_ovf("integer addition");
return newintobject(x);
}
b = ((intobject *)w) -> ob_ival;
x = a - b;
if ((x^a) < 0 && (x^~b) < 0)
- return err_ovf();
+ return err_ovf("integer subtraction");
return newintobject(x);
}
b = ((intobject *)w) -> ob_ival;
x = (double)a * (double)b;
if (x > 0x7fffffff || x < (double) (long) 0x80000000)
- return err_ovf();
+ return err_ovf("integer multiplication");
return newintobject(a * b);
}
return NULL;
}
if (((intobject *)w) -> ob_ival == 0)
- return err_zdiv();
+ return err_zdiv("integer division");
a = v->ob_ival;
b = ((intobject *)w) -> ob_ival;
/* Make sure we always truncate towards zero */
return NULL;
}
if (((intobject *)w) -> ob_ival == 0)
- return err_zdiv();
+ return err_zdiv("integer remainder");
/* XXX Need to fix this similar to int_div */
return newintobject(v->ob_ival % ((intobject *)w) -> ob_ival);
}
xi = x->ob_ival;
yi = getintvalue(y);
if (yi == 0)
- return err_zdiv();
+ return err_zdiv("integer divmod()");
if (yi < 0) {
xdivy = -xi / -yi;
}
iv = v->ob_ival;
iw = ((intobject *)w)->ob_ival;
if (iw < 0) {
- err_setstr(RuntimeError, "integer to the negative power");
+ err_setstr(ValueError, "integer to the negative power");
return NULL;
}
ix = 1;
if (iv == 0)
break; /* 0 to some power -- avoid ix / 0 */
if (ix / iv != prev)
- return err_ovf();
+ return err_ovf("integer pow()");
}
return newintobject(ix);
}
a = v->ob_ival;
x = -a;
if (a < 0 && x < 0)
- return err_ovf();
+ return err_ovf("integer negation");
return newintobject(x);
}