summaryrefslogtreecommitdiffstats
path: root/Objects/object.c
diff options
context:
space:
mode:
Diffstat (limited to 'Objects/object.c')
-rw-r--r--Objects/object.c19
1 files changed, 17 insertions, 2 deletions
diff --git a/Objects/object.c b/Objects/object.c
index a263bda..b15e76e 100644
--- a/Objects/object.c
+++ b/Objects/object.c
@@ -522,6 +522,7 @@ static int
default_3way_compare(PyObject *v, PyObject *w)
{
int c;
+ char *vname, *wname;
if (v->ob_type == w->ob_type) {
/* When comparing these pointers, they must be cast to
@@ -550,8 +551,22 @@ default_3way_compare(PyObject *v, PyObject *w)
}
/* different type: compare type names */
- c = strcmp(v->ob_type->tp_name, w->ob_type->tp_name);
- return (c < 0) ? -1 : (c > 0) ? 1 : 0;
+ if (v->ob_type->tp_as_number)
+ vname = "";
+ else
+ vname = v->ob_type->tp_name;
+ if (w->ob_type->tp_as_number)
+ wname = "";
+ else
+ wname = w->ob_type->tp_name;
+ c = strcmp(vname, wname);
+ if (c < 0)
+ return -1;
+ if (c > 0)
+ return 1;
+ /* Same type name, or (more likely) incomparable numeric types */
+ return ((Py_uintptr_t)(v->ob_type) < (
+ Py_uintptr_t)(w->ob_type)) ? -1 : 1;
}
#define CHECK_TYPES(o) PyType_HasFeature((o)->ob_type, Py_TPFLAGS_CHECKTYPES)