]> granicus.if.org Git - python/commitdiff
Add a new function PyNumber_CoerceEx() which works just like
authorGuido van Rossum <guido@python.org>
Wed, 19 Nov 1997 16:03:17 +0000 (16:03 +0000)
committerGuido van Rossum <guido@python.org>
Wed, 19 Nov 1997 16:03:17 +0000 (16:03 +0000)
PyNumber_Coerce() except that when the coercion can't be done and no
other exceptions happen, it returns 1 instead of raising an
exception.

Use this function in PyObject_Compare() to avoid raising an exception
simply because two objects with numeric behavior can't be coerced to a
common type; instead, proceed with the non-numeric default comparison.

Note that this is a somewhat questionable practice -- comparisons for
numeric objects shouldn't default to random behavior like this, but it
is required for backward compatibility.  (Case in point, it broke
comparison of kjDict objects to integers in Aaron Watters' kjbuckets
extension.)  A correct fix (for python 2.0) should involve a different
definiton of comparison altogether.

Objects/object.c

index 6adc2be113b164d3877899a582dd49c52a420a04..46487de851ed72c3e1112ca1aa6502a2924916f4 100644 (file)
@@ -300,9 +300,11 @@ 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)
+                       int err;
+                       err = PyNumber_CoerceEx(&v, &w);
+                       if (err < 0)
                                return -1;
-                       else {
+                       else if (err == 0) {
                                int cmp = (*v->ob_type->tp_compare)(v, w);
                                Py_DECREF(v);
                                Py_DECREF(w);
@@ -472,7 +474,7 @@ PyObject_IsTrue(v)
 */
 
 int
-PyNumber_Coerce(pv, pw)
+PyNumber_CoerceEx(pv, pw)
        PyObject **pv, **pw;
 {
        register PyObject *v = *pv;
@@ -494,6 +496,16 @@ PyNumber_Coerce(pv, pw)
                if (res <= 0)
                        return res;
        }
+       return 1;
+}
+
+int
+PyNumber_Coerce(pv, pw)
+       PyObject **pv, **pw;
+{
+       int err = PyNumber_CoerceEx(pv, pw);
+       if (err <= 0)
+               return err;
        PyErr_SetString(PyExc_TypeError, "number coercion failed");
        return -1;
 }