diff Objects/longobject.c @ 40751:d594ec858fe9

Fix refcounting bugs related to CONVERT_BINOP.
author Martin v. Löwis <martin@v.loewis.de>
date Tue, 06 Feb 2007 21:05:30 +0000
parents 342532f4536e
children f2f0b41f270d
line wrap: on
line diff
--- a/Objects/longobject.c	Mon Feb 05 01:24:16 2007 +0000
+++ b/Objects/longobject.c	Tue Feb 06 21:05:30 2007 +0000
@@ -2147,8 +2147,12 @@
 long_richcompare(PyObject *self, PyObject *other, int op)
 {
 	PyLongObject *a, *b;
+	PyObject *result;
 	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
@@ -2283,9 +2287,13 @@
 
 	CONVERT_BINOP((PyObject *)v, (PyObject *)w, &a, &b);
 
-	if (ABS(a->ob_size) <= 1 && ABS(b->ob_size) <= 1)
-		return PyInt_FromLong(MEDIUM_VALUE(a) +
-				      MEDIUM_VALUE(b));
+	if (ABS(a->ob_size) <= 1 && ABS(b->ob_size) <= 1) {
+		PyObject *result = PyInt_FromLong(MEDIUM_VALUE(a) +
+						  MEDIUM_VALUE(b));
+		Py_DECREF(a);
+		Py_DECREF(b);
+		return result;
+	}
 	if (a->ob_size < 0) {
 		if (b->ob_size < 0) {
 			z = x_add(a, b);
@@ -2313,8 +2321,13 @@
 
 	CONVERT_BINOP((PyObject *)v, (PyObject *)w, &a, &b);
 
-	if (ABS(a->ob_size) <= 1 && ABS(b->ob_size) <= 1)
-		return PyLong_FromLong(MEDIUM_VALUE(a)-MEDIUM_VALUE(b));
+	if (ABS(a->ob_size) <= 1 && ABS(b->ob_size) <= 1) {
+		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 (b->ob_size < 0)
 			z = x_sub(a, b);
@@ -2744,8 +2757,13 @@
 		return Py_NotImplemented;
 	}
 
-	if (ABS(v->ob_size) <= 1 && ABS(w->ob_size) <= 1)
-		return PyLong_FromLong(MEDIUM_VALUE(v)*MEDIUM_VALUE(w));
+	if (ABS(v->ob_size) <= 1 && ABS(w->ob_size) <= 1) {
+		PyObject *r;
+		r = PyLong_FromLong(MEDIUM_VALUE(v)*MEDIUM_VALUE(w));
+		Py_DECREF(a);
+		Py_DECREF(b);
+		return r;
+	}
 
 	z = k_mul(a, b);
 	/* Negate if exactly one of the inputs is negative. */