mirror of
https://github.com/python/cpython.git
synced 2025-08-03 16:39:00 +00:00
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.
This commit is contained in:
parent
0a6864ecc5
commit
a174813113
2 changed files with 47 additions and 16 deletions
|
@ -606,33 +606,28 @@ try_3way_compare(PyObject *v, PyObject *w)
|
|||
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);
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue