Log message for revision 87371: The Wrapper_compare function from tp_compare to tp_richcompare. Also another function Wrapper_richcompare is added.
Changed: U Zope/branches/gsoc-python-2.5/doc/CHANGES.txt U Zope/branches/gsoc-python-2.5/lib/python/Acquisition/_Acquisition.c -=- Modified: Zope/branches/gsoc-python-2.5/doc/CHANGES.txt =================================================================== --- Zope/branches/gsoc-python-2.5/doc/CHANGES.txt 2008-06-13 16:53:53 UTC (rev 87370) +++ Zope/branches/gsoc-python-2.5/doc/CHANGES.txt 2008-06-13 18:10:34 UTC (rev 87371) @@ -416,6 +416,9 @@ if( isinstance(status, types.ClassType) and issubclass(status, Exception)) to if( isinstance(status, (type, types.ClassType)) and issubclass(status, Exception)) for fixing the failures in the module Zope2 + + - The Wrapper_compare function from tp_compare to tp_richcompare. + Also another function Wrapper_richcompare is added. Other Changes Modified: Zope/branches/gsoc-python-2.5/lib/python/Acquisition/_Acquisition.c =================================================================== --- Zope/branches/gsoc-python-2.5/lib/python/Acquisition/_Acquisition.c 2008-06-13 16:53:53 UTC (rev 87370) +++ Zope/branches/gsoc-python-2.5/lib/python/Acquisition/_Acquisition.c 2008-06-13 18:10:34 UTC (rev 87371) @@ -103,6 +103,32 @@ #define Build Py_BuildValue +/* For obscure reasons, we need to use tp_richcompare instead of tp_compare. + * The comparisons here all most naturally compute a cmp()-like result. + * This little helper turns that into a bool result for rich comparisons. + */ +static PyObject * +diff_to_bool(int diff, int op) +{ + PyObject *result; + int istrue; + + switch (op) { + case Py_EQ: istrue = diff == 0; break; + case Py_NE: istrue = diff != 0; break; + case Py_LE: istrue = diff <= 0; break; + case Py_GE: istrue = diff >= 0; break; + case Py_LT: istrue = diff < 0; break; + case Py_GT: istrue = diff > 0; break; + default: + assert(! "op unknown"); + istrue = 0; /* To shut up compiler */ + } + result = istrue ? Py_True : Py_False; + Py_INCREF(result); + return result; +} + /* Declarations for objects of type Wrapper */ typedef struct { @@ -759,6 +785,13 @@ } static PyObject * +Wrapper_richcompare(Wrapper *self, PyObject *w, int op) +{ + int diff = Wrapper_compare(self, w); + return diff_to_bool(diff, op); +} + +static PyObject * Wrapper_repr(Wrapper *self) { PyObject *r; @@ -1241,7 +1274,7 @@ (printfunc)0, /*tp_print*/ (getattrfunc)0, /*tp_getattr*/ (setattrfunc)0, /*tp_setattr*/ - (cmpfunc)Wrapper_compare, /*tp_compare*/ + (cmpfunc)0, /*tp_compare*/ (reprfunc)Wrapper_repr, /*tp_repr*/ &Wrapper_as_number, /*tp_as_number*/ &Wrapper_as_sequence, /*tp_as_sequence*/ @@ -1259,7 +1292,7 @@ "Wrapper object for implicit acquisition", /* Documentation string */ /* tp_traverse */ (traverseproc)Wrapper_traverse, /* tp_clear */ (inquiry)Wrapper_clear, - /* tp_richcompare */ (richcmpfunc)0, + /* tp_richcompare */ (richcmpfunc)Wrapper_richcompare, /* tp_weaklistoffset */ (long)0, /* tp_iter */ (getiterfunc)0, /* tp_iternext */ (iternextfunc)0, _______________________________________________ Zope-Checkins maillist - Zope-Checkins@zope.org http://mail.zope.org/mailman/listinfo/zope-checkins