Commit cd5a5f62 authored by Guido van Rossum's avatar Guido van Rossum

When comparing objects of different types (which is done by comparing

the type names), make sure that numeric objects are considered smaller
than all other objects, by forcing their name to "".
parent 5d23758b
......@@ -284,7 +284,7 @@ int
PyObject_Compare(v, w)
PyObject *v, *w;
{
PyTypeObject *tp;
PyTypeObject *vtp, *wtp;
if (v == NULL || w == NULL) {
PyErr_BadInternalCall();
return -1;
......@@ -309,9 +309,11 @@ PyObject_Compare(v, w)
Py_DECREF(res);
return (c < 0) ? -1 : (c > 0) ? 1 : 0;
}
if ((tp = v->ob_type) != w->ob_type) {
if (tp->tp_as_number != NULL &&
w->ob_type->tp_as_number != NULL) {
if ((vtp = v->ob_type) != (wtp = w->ob_type)) {
char *vname = vtp->tp_name;
char *wname = wtp->tp_name;
if (vtp->tp_as_number != NULL &&
wtp->tp_as_number != NULL) {
int err;
err = PyNumber_CoerceEx(&v, &w);
if (err < 0)
......@@ -323,11 +325,16 @@ PyObject_Compare(v, w)
return cmp;
}
}
return strcmp(tp->tp_name, w->ob_type->tp_name);
}
if (tp->tp_compare == NULL)
else if (vtp->tp_as_number != NULL)
vname = "";
else if (wtp->tp_as_number != NULL)
wname = "";
/* Numerical types compare smaller than all other types */
return strcmp(vname, wname);
}
if (vtp->tp_compare == NULL)
return (v < w) ? -1 : 1;
return (*tp->tp_compare)(v, w);
return (*vtp->tp_compare)(v, w);
}
long
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment