[Python-3000] [Python-3000-checkins] r54588
Brett Cannon
brett at python.org
Thu Mar 29 21:52:40 CEST 2007
On 3/29/07, Amaury Forgeot d'Arc <amauryfa at gmail.com> wrote:
> 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;
> }
>
It looks right, although you could also remove the INCREF in Py_NE and
change the INCREF at the bottom to XINCREF or just return on the
error.
-Brett
More information about the Python-3000
mailing list