[Python-checkins] python/dist/src/Objects object.c,2.224,2.225
arigo at users.sourceforge.net
arigo at users.sourceforge.net
Thu Dec 23 23:13:16 CET 2004
Update of /cvsroot/python/python/dist/src/Objects
In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv21400/Objects
Modified Files:
object.c
Log Message:
Dima Dorfman's patch for coercion/comparison of C types (patch #995939), with
a minor change after the coercion, to accept two objects not necessarily of
the same type but with the same tp_compare.
Index: object.c
===================================================================
RCS file: /cvsroot/python/python/dist/src/Objects/object.c,v
retrieving revision 2.224
retrieving revision 2.225
diff -u -d -r2.224 -r2.225
--- object.c 25 Sep 2004 01:37:24 -0000 2.224
+++ object.c 23 Dec 2004 22:13:13 -0000 2.225
@@ -606,33 +606,28 @@
w->ob_type->tp_compare == _PyObject_SlotCompare)
return _PyObject_SlotCompare(v, w);
- /* Try coercion; if it fails, give up */
+ /* If we're here, v and w,
+ a) are not instances;
+ b) have different types or a type without tp_compare; and
+ c) don't have a user-defined tp_compare.
+ tp_compare implementations in C assume that both arguments
+ have their type, so we give up if the coercion fails or if
+ it yields types which are still incompatible (which can
+ happen with a user-defined nb_coerce).
+ */
c = PyNumber_CoerceEx(&v, &w);
if (c < 0)
return -2;
if (c > 0)
return 2;
-
- /* Try v's comparison, if defined */
- if ((f = v->ob_type->tp_compare) != NULL) {
+ f = v->ob_type->tp_compare;
+ if (f != NULL && f == w->ob_type->tp_compare) {
c = (*f)(v, w);
Py_DECREF(v);
Py_DECREF(w);
return adjust_tp_compare(c);
}
- /* Try w's comparison, if defined */
- if ((f = w->ob_type->tp_compare) != NULL) {
- c = (*f)(w, v); /* swapped! */
- Py_DECREF(v);
- Py_DECREF(w);
- c = adjust_tp_compare(c);
- if (c >= -1)
- return -c; /* Swapped! */
- else
- return c;
- }
-
/* No comparison defined */
Py_DECREF(v);
Py_DECREF(w);
More information about the Python-checkins
mailing list