diff options
author | Guido van Rossum <guido@python.org> | 1995-01-12 11:26:10 +0000 |
---|---|---|
committer | Guido van Rossum <guido@python.org> | 1995-01-12 11:26:10 +0000 |
commit | 20566845c6fffdb58875cdaf1118bc95b590d5c0 (patch) | |
tree | f0f5695b2b5db9b85ab3f42e8c942cb42cb161a3 | |
parent | cosmetic changes so these modules will work with the strict new naming scheme (diff) | |
download | cpython-20566845c6fffdb58875cdaf1118bc95b590d5c0.tar.gz cpython-20566845c6fffdb58875cdaf1118bc95b590d5c0.tar.bz2 cpython-20566845c6fffdb58875cdaf1118bc95b590d5c0.zip |
properly implement cmp() for class instances
-rw-r--r-- | Objects/object.c | 31 |
1 files changed, 31 insertions, 0 deletions
diff --git a/Objects/object.c b/Objects/object.c index c19d96ff371..be3cce7e809 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) { |