summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGuido van Rossum <guido@python.org>1998-06-09 18:58:44 +0000
committerGuido van Rossum <guido@python.org>1998-06-09 18:58:44 +0000
commitcd5a5f627a4b30aacc1991feca5bc7f48ef7584d (patch)
tree7ad1275d831e057c2a7a803ca7de46725c58fe0b
parent5d23758be7bca6c64f6b74f49227a8039d93fb5d (diff)
downloadcpython-git-cd5a5f627a4b30aacc1991feca5bc7f48ef7584d.tar.gz
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 "".
-rw-r--r--Objects/object.c23
1 files changed, 15 insertions, 8 deletions
diff --git a/Objects/object.c b/Objects/object.c
index 964c5c59f2..2428cc9331 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