Commit 010b8601 authored by Martin v. Löwis's avatar Martin v. Löwis

Fix refcounting bugs related to CONVERT_BINOP.

parent 2c1e13fc
...@@ -2147,8 +2147,12 @@ static PyObject * ...@@ -2147,8 +2147,12 @@ static PyObject *
long_richcompare(PyObject *self, PyObject *other, int op) long_richcompare(PyObject *self, PyObject *other, int op)
{ {
PyLongObject *a, *b; PyLongObject *a, *b;
PyObject *result;
CONVERT_BINOP((PyObject *)self, (PyObject *)other, &a, &b); CONVERT_BINOP((PyObject *)self, (PyObject *)other, &a, &b);
return Py_CmpToRich(op, long_compare(a, b)); result = Py_CmpToRich(op, long_compare(a, b));
Py_DECREF(a);
Py_DECREF(b);
return result;
} }
static long static long
...@@ -2283,9 +2287,13 @@ long_add(PyLongObject *v, PyLongObject *w) ...@@ -2283,9 +2287,13 @@ long_add(PyLongObject *v, PyLongObject *w)
CONVERT_BINOP((PyObject *)v, (PyObject *)w, &a, &b); CONVERT_BINOP((PyObject *)v, (PyObject *)w, &a, &b);
if (ABS(a->ob_size) <= 1 && ABS(b->ob_size) <= 1) if (ABS(a->ob_size) <= 1 && ABS(b->ob_size) <= 1) {
return PyInt_FromLong(MEDIUM_VALUE(a) + PyObject *result = PyInt_FromLong(MEDIUM_VALUE(a) +
MEDIUM_VALUE(b)); MEDIUM_VALUE(b));
Py_DECREF(a);
Py_DECREF(b);
return result;
}
if (a->ob_size < 0) { if (a->ob_size < 0) {
if (b->ob_size < 0) { if (b->ob_size < 0) {
z = x_add(a, b); z = x_add(a, b);
...@@ -2313,8 +2321,13 @@ long_sub(PyLongObject *v, PyLongObject *w) ...@@ -2313,8 +2321,13 @@ long_sub(PyLongObject *v, PyLongObject *w)
CONVERT_BINOP((PyObject *)v, (PyObject *)w, &a, &b); CONVERT_BINOP((PyObject *)v, (PyObject *)w, &a, &b);
if (ABS(a->ob_size) <= 1 && ABS(b->ob_size) <= 1) if (ABS(a->ob_size) <= 1 && ABS(b->ob_size) <= 1) {
return PyLong_FromLong(MEDIUM_VALUE(a)-MEDIUM_VALUE(b)); PyObject* r;
r = PyLong_FromLong(MEDIUM_VALUE(a)-MEDIUM_VALUE(b));
Py_DECREF(a);
Py_DECREF(b);
return r;
}
if (a->ob_size < 0) { if (a->ob_size < 0) {
if (b->ob_size < 0) if (b->ob_size < 0)
z = x_sub(a, b); z = x_sub(a, b);
...@@ -2744,8 +2757,13 @@ long_mul(PyLongObject *v, PyLongObject *w) ...@@ -2744,8 +2757,13 @@ long_mul(PyLongObject *v, PyLongObject *w)
return Py_NotImplemented; return Py_NotImplemented;
} }
if (ABS(v->ob_size) <= 1 && ABS(w->ob_size) <= 1) if (ABS(v->ob_size) <= 1 && ABS(w->ob_size) <= 1) {
return PyLong_FromLong(MEDIUM_VALUE(v)*MEDIUM_VALUE(w)); PyObject *r;
r = PyLong_FromLong(MEDIUM_VALUE(v)*MEDIUM_VALUE(w));
Py_DECREF(a);
Py_DECREF(b);
return r;
}
z = k_mul(a, b); z = k_mul(a, b);
/* Negate if exactly one of the inputs is negative. */ /* Negate if exactly one of the inputs is negative. */
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment