summaryrefslogtreecommitdiffstats
path: root/Objects/object.c
diff options
context:
space:
mode:
Diffstat (limited to 'Objects/object.c')
-rw-r--r--Objects/object.c31
1 files changed, 16 insertions, 15 deletions
diff --git a/Objects/object.c b/Objects/object.c
index 29269d0..023477f 100644
--- a/Objects/object.c
+++ b/Objects/object.c
@@ -255,13 +255,17 @@ static PyObject *
do_cmp(v, w)
PyObject *v, *w;
{
+ long c;
/* __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 (PyInstance_Check(v) || PyInstance_Check(w))
return PyInstance_DoBinOp(v, w, "__cmp__", "__rcmp__", do_cmp);
- return PyInt_FromLong((long)PyObject_Compare(v, w));
+ c = PyObject_Compare(v, w);
+ if (c && PyErr_Occurred())
+ return NULL;
+ return PyInt_FromLong(c);
}
int
@@ -269,25 +273,25 @@ PyObject_Compare(v, w)
PyObject *v, *w;
{
PyTypeObject *tp;
+ if (v == NULL || w == NULL) {
+ PyErr_BadInternalCall();
+ return -1;
+ }
if (v == w)
return 0;
- if (v == NULL)
- return -1;
- if (w == NULL)
- return 1;
if (PyInstance_Check(v) || PyInstance_Check(w)) {
PyObject *res;
int c;
if (!PyInstance_Check(v))
return -PyObject_Compare(w, v);
res = do_cmp(v, w);
- if (res == NULL) {
- PyErr_Clear();
- return (v < w) ? -1 : 1;
- }
+ if (res == NULL)
+ return -1;
if (!PyInt_Check(res)) {
Py_DECREF(res);
- return (v < w) ? -1 : 1;
+ PyErr_SetString(PyExc_TypeError,
+ "comparison did not return an int");
+ return -1;
}
c = PyInt_AsLong(res);
Py_DECREF(res);
@@ -296,11 +300,8 @@ PyObject_Compare(v, w)
if ((tp = v->ob_type) != w->ob_type) {
if (tp->tp_as_number != NULL &&
w->ob_type->tp_as_number != NULL) {
- if (PyNumber_Coerce(&v, &w) != 0) {
- PyErr_Clear();
- /* XXX Should report the error,
- XXX but the interface isn't there... */
- }
+ if (PyNumber_Coerce(&v, &w) != 0)
+ return -1;
else {
int cmp = (*v->ob_type->tp_compare)(v, w);
Py_DECREF(v);