#endif /* HAVE_LONG_LONG */
-
-static int
-convert_binop(PyObject *v, PyObject *w, PyLongObject **a, PyLongObject **b) {
- if (PyLong_Check(v)) {
- *a = (PyLongObject *) v;
- Py_INCREF(v);
- }
- else {
- return 0;
- }
- if (PyLong_Check(w)) {
- *b = (PyLongObject *) w;
- Py_INCREF(w);
- }
- else {
- Py_DECREF(*a);
- return 0;
- }
- return 1;
-}
-
-#define CONVERT_BINOP(v, w, a, b) \
- if (!convert_binop(v, w, a, b)) { \
+#define CHECK_BINOP(v,w) \
+ if (!PyLong_Check(v) || !PyLong_Check(w)) { \
Py_INCREF(Py_NotImplemented); \
return Py_NotImplemented; \
}
static PyObject *
long_richcompare(PyObject *self, PyObject *other, int op)
{
- PyLongObject *a, *b;
PyObject *result;
- CONVERT_BINOP((PyObject *)self, (PyObject *)other, &a, &b);
- result = Py_CmpToRich(op, long_compare(a, b));
- Py_DECREF(a);
- Py_DECREF(b);
+ CHECK_BINOP(self, other);
+ result = Py_CmpToRich(op, long_compare((PyLongObject*)self,
+ (PyLongObject*)other));
return result;
}
}
static PyObject *
-long_add(PyLongObject *v, PyLongObject *w)
+long_add(PyLongObject *a, PyLongObject *b)
{
- PyLongObject *a, *b, *z;
+ PyLongObject *z;
- CONVERT_BINOP((PyObject *)v, (PyObject *)w, &a, &b);
+ CHECK_BINOP(a, b);
if (ABS(Py_Size(a)) <= 1 && ABS(Py_Size(b)) <= 1) {
PyObject *result = PyInt_FromLong(MEDIUM_VALUE(a) +
MEDIUM_VALUE(b));
- Py_DECREF(a);
- Py_DECREF(b);
return result;
}
if (Py_Size(a) < 0) {
else
z = x_add(a, b);
}
- Py_DECREF(a);
- Py_DECREF(b);
return (PyObject *)z;
}
static PyObject *
-long_sub(PyLongObject *v, PyLongObject *w)
+long_sub(PyLongObject *a, PyLongObject *b)
{
- PyLongObject *a, *b, *z;
+ PyLongObject *z;
- CONVERT_BINOP((PyObject *)v, (PyObject *)w, &a, &b);
+ CHECK_BINOP(a, b);
if (ABS(Py_Size(a)) <= 1 && ABS(Py_Size(b)) <= 1) {
PyObject* r;
r = PyLong_FromLong(MEDIUM_VALUE(a)-MEDIUM_VALUE(b));
- Py_DECREF(a);
- Py_DECREF(b);
return r;
}
if (Py_Size(a) < 0) {
else
z = x_sub(a, b);
}
- Py_DECREF(a);
- Py_DECREF(b);
return (PyObject *)z;
}
}
static PyObject *
-long_mul(PyLongObject *v, PyLongObject *w)
+long_mul(PyLongObject *a, PyLongObject *b)
{
- PyLongObject *a, *b, *z;
+ PyLongObject *z;
- if (!convert_binop((PyObject *)v, (PyObject *)w, &a, &b)) {
- Py_INCREF(Py_NotImplemented);
- return Py_NotImplemented;
- }
+ CHECK_BINOP(a, b);
- if (ABS(Py_Size(v)) <= 1 && ABS(Py_Size(w)) <= 1) {
+ if (ABS(Py_Size(a)) <= 1 && ABS(Py_Size(b)) <= 1) {
PyObject *r;
- r = PyLong_FromLong(MEDIUM_VALUE(v)*MEDIUM_VALUE(w));
- Py_DECREF(a);
- Py_DECREF(b);
+ r = PyLong_FromLong(MEDIUM_VALUE(a)*MEDIUM_VALUE(b));
return r;
}
/* Negate if exactly one of the inputs is negative. */
if (((Py_Size(a) ^ Py_Size(b)) < 0) && z)
NEGATE(z);
- Py_DECREF(a);
- Py_DECREF(b);
return (PyObject *)z;
}
}
static PyObject *
-long_div(PyObject *v, PyObject *w)
+long_div(PyObject *a, PyObject *b)
{
- PyLongObject *a, *b, *div;
+ PyLongObject *div;
- CONVERT_BINOP(v, w, &a, &b);
- if (l_divmod(a, b, &div, NULL) < 0)
+ CHECK_BINOP(a, b);
+ if (l_divmod((PyLongObject*)a, (PyLongObject*)b, &div, NULL) < 0)
div = NULL;
- Py_DECREF(a);
- Py_DECREF(b);
return (PyObject *)div;
}
static PyObject *
-long_true_divide(PyObject *v, PyObject *w)
+long_true_divide(PyObject *a, PyObject *b)
{
- PyLongObject *a, *b;
double ad, bd;
int failed, aexp = -1, bexp = -1;
- CONVERT_BINOP(v, w, &a, &b);
+ CHECK_BINOP(a, b);
ad = _PyLong_AsScaledDouble((PyObject *)a, &aexp);
bd = _PyLong_AsScaledDouble((PyObject *)b, &bexp);
failed = (ad == -1.0 || bd == -1.0) && PyErr_Occurred();
- Py_DECREF(a);
- Py_DECREF(b);
if (failed)
return NULL;
/* 'aexp' and 'bexp' were initialized to -1 to silence gcc-4.0.x,
}
static PyObject *
-long_mod(PyObject *v, PyObject *w)
+long_mod(PyObject *a, PyObject *b)
{
- PyLongObject *a, *b, *mod;
-
- CONVERT_BINOP(v, w, &a, &b);
+ PyLongObject *mod;
+
+ CHECK_BINOP(a, b);
- if (l_divmod(a, b, NULL, &mod) < 0)
+ if (l_divmod((PyLongObject*)a, (PyLongObject*)b, NULL, &mod) < 0)
mod = NULL;
- Py_DECREF(a);
- Py_DECREF(b);
return (PyObject *)mod;
}
static PyObject *
-long_divmod(PyObject *v, PyObject *w)
+long_divmod(PyObject *a, PyObject *b)
{
- PyLongObject *a, *b, *div, *mod;
+ PyLongObject *div, *mod;
PyObject *z;
- CONVERT_BINOP(v, w, &a, &b);
+ CHECK_BINOP(a, b);
- if (l_divmod(a, b, &div, &mod) < 0) {
- Py_DECREF(a);
- Py_DECREF(b);
+ if (l_divmod((PyLongObject*)a, (PyLongObject*)b, &div, &mod) < 0) {
return NULL;
}
z = PyTuple_New(2);
Py_DECREF(div);
Py_DECREF(mod);
}
- Py_DECREF(a);
- Py_DECREF(b);
return z;
}
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
/* a, b, c = v, w, x */
- CONVERT_BINOP(v, w, &a, &b);
+ CHECK_BINOP(v, w);
+ a = (PyLongObject*)v; Py_INCREF(a);
+ b = (PyLongObject*)w; Py_INCREF(b);
if (PyLong_Check(x)) {
c = (PyLongObject *)x;
Py_INCREF(x);
}
static PyObject *
-long_rshift(PyLongObject *v, PyLongObject *w)
+long_rshift(PyLongObject *a, PyLongObject *b)
{
- PyLongObject *a, *b;
PyLongObject *z = NULL;
long shiftby;
Py_ssize_t newsize, wordshift, loshift, hishift, i, j;
digit lomask, himask;
- CONVERT_BINOP((PyObject *)v, (PyObject *)w, &a, &b);
+ CHECK_BINOP(a, b);
if (Py_Size(a) < 0) {
/* Right shifting negative numbers is harder */
newsize = ABS(Py_Size(a)) - wordshift;
if (newsize <= 0) {
z = _PyLong_New(0);
- Py_DECREF(a);
- Py_DECREF(b);
return (PyObject *)z;
}
loshift = shiftby % PyLong_SHIFT;
z = long_normalize(z);
}
rshift_error:
- Py_DECREF(a);
- Py_DECREF(b);
return (PyObject *) z;
}
long_lshift(PyObject *v, PyObject *w)
{
/* This version due to Tim Peters */
- PyLongObject *a, *b;
+ PyLongObject *a = (PyLongObject*)v;
+ PyLongObject *b = (PyLongObject*)w;
PyLongObject *z = NULL;
long shiftby;
Py_ssize_t oldsize, newsize, wordshift, remshift, i, j;
twodigits accum;
- CONVERT_BINOP(v, w, &a, &b);
+ CHECK_BINOP(a, b);
shiftby = PyLong_AsLong((PyObject *)b);
if (shiftby == -1L && PyErr_Occurred())
assert(!accum);
z = long_normalize(z);
lshift_error:
- Py_DECREF(a);
- Py_DECREF(b);
return (PyObject *) z;
}
}
static PyObject *
-long_and(PyObject *v, PyObject *w)
+long_and(PyObject *a, PyObject *b)
{
- PyLongObject *a, *b;
PyObject *c;
- CONVERT_BINOP(v, w, &a, &b);
- c = long_bitwise(a, '&', b);
- Py_DECREF(a);
- Py_DECREF(b);
+ CHECK_BINOP(a, b);
+ c = long_bitwise((PyLongObject*)a, '&', (PyLongObject*)b);
return c;
}
static PyObject *
-long_xor(PyObject *v, PyObject *w)
+long_xor(PyObject *a, PyObject *b)
{
- PyLongObject *a, *b;
PyObject *c;
- CONVERT_BINOP(v, w, &a, &b);
- c = long_bitwise(a, '^', b);
- Py_DECREF(a);
- Py_DECREF(b);
+ CHECK_BINOP(a, b);
+ c = long_bitwise((PyLongObject*)a, '^', (PyLongObject*)b);
return c;
}
static PyObject *
-long_or(PyObject *v, PyObject *w)
+long_or(PyObject *a, PyObject *b)
{
- PyLongObject *a, *b;
PyObject *c;
- CONVERT_BINOP(v, w, &a, &b);
- c = long_bitwise(a, '|', b);
- Py_DECREF(a);
- Py_DECREF(b);
+ CHECK_BINOP(a, b);
+ c = long_bitwise((PyLongObject*)a, '|', (PyLongObject*)b);
return c;
}