diff options
-rw-r--r-- | Objects/object.c | 23 |
1 files changed, 15 insertions, 8 deletions
diff --git a/Objects/object.c b/Objects/object.c index 964c5c5..2428cc9 100644 --- a/Objects/object.c +++ b/Objects/object.c @@ -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 |