summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorGuido van Rossum <guido@python.org>1995-01-12 11:26:10 (GMT)
committerGuido van Rossum <guido@python.org>1995-01-12 11:26:10 (GMT)
commit20566845c6fffdb58875cdaf1118bc95b590d5c0 (patch)
treef0f5695b2b5db9b85ab3f42e8c942cb42cb161a3
parenta597dde3f1959127c33296a77f76331b59449c01 (diff)
downloadcpython-20566845c6fffdb58875cdaf1118bc95b590d5c0.zip
cpython-20566845c6fffdb58875cdaf1118bc95b590d5c0.tar.gz
cpython-20566845c6fffdb58875cdaf1118bc95b590d5c0.tar.bz2
properly implement cmp() for class instances
-rw-r--r--Objects/object.c31
1 files changed, 31 insertions, 0 deletions
diff --git a/Objects/object.c b/Objects/object.c
index c19d96f..be3cce7 100644
--- a/Objects/object.c
+++ b/Objects/object.c
@@ -201,6 +201,19 @@ strobject(v)
}
}
+static object *
+do_cmp(v, w)
+ object *v, *w;
+{
+ /* __rcmp__ actually won't be called unless __cmp__ isn't defined,
+ because the check in cmpobject() reverses the objects first.
+ This is intentional -- it makes no sense to define cmp(x,y) different
+ than -cmp(y,x). */
+ if (is_instanceobject(v) || is_instanceobject(w))
+ return instancebinop(v, w, "__cmp__", "__rcmp__", do_cmp);
+ return newintobject((long)cmpobject(v, w));
+}
+
int
cmpobject(v, w)
object *v, *w;
@@ -212,6 +225,24 @@ cmpobject(v, w)
return -1;
if (w == NULL)
return 1;
+ if (is_instanceobject(v) || is_instanceobject(w)) {
+ object *res;
+ int c;
+ if (!is_instanceobject(v))
+ return -cmpobject(w, v);
+ res = do_cmp(v, w);
+ if (res == NULL) {
+ err_clear();
+ return (v < w) ? -1 : 1;
+ }
+ if (!is_intobject(res)) {
+ DECREF(res);
+ return (v < w) ? -1 : 1;
+ }
+ c = getintvalue(res);
+ 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) {