[Python-3000] [Python-3000-checkins] r54588

Amaury Forgeot d'Arc amauryfa at gmail.com
Thu Mar 29 21:31:16 CEST 2007


Hello,

Sorry if I am wrong, but it seems to me that the change in r54588 has a problem:
http://mail.python.org/pipermail/python-3000-checkins/2007-March/000433.html
- in the normal case, the return value is INCREF'ed twice
- in the error case, Py_INCREF(NULL) is called...

One easy way to correct this is to move the last INCREF:
(sorry for the approximative patch format)

python/branches/p3yk/Objects/typeobject.c:
=================================================
 static PyObject *
 object_richcompare(PyObject *self, PyObject *other, int op)
 {
 	PyObject *res;

 	switch (op) {

 	case Py_EQ:
 		res = (self == other) ? Py_True : Py_False;
+		Py_INCREF(res);
 		break;

 	case Py_NE:
 		/* By default, != returns the opposite of ==,
 		   unless the latter returns NotImplemented. */
 		res = PyObject_RichCompare(self, other, Py_EQ);
 		if (res != NULL && res != Py_NotImplemented) {
 			int ok = PyObject_IsTrue(res);
 			Py_DECREF(res);
 			if (ok < 0)
 				res = NULL;
 			else {
 				if (ok)
 					res = Py_False;
 				else
 					res = Py_True;
 				Py_INCREF(res);
 			}
 		}
 		break;

 	default:
 		res = Py_NotImplemented;
+		Py_INCREF(res);
 		break;
 	}

-	Py_INCREF(res);
 	return res;
 }



Just trying to be faster than Coverity...

-- 
Amaury Forgeot d'Arc


More information about the Python-3000 mailing list