]> granicus.if.org Git - python/commitdiff
Add additional coercion support for "self subtypes" to int, long,
authorGuido van Rossum <guido@python.org>
Wed, 19 Sep 2001 01:25:16 +0000 (01:25 +0000)
committerGuido van Rossum <guido@python.org>
Wed, 19 Sep 2001 01:25:16 +0000 (01:25 +0000)
float (compare the recent checkin to complex).  Added tests for these.

Lib/test/test_descr.py
Objects/floatobject.c
Objects/intobject.c
Objects/longobject.c

index a57471bb60e4e254a66d2714dc06ede80a758d9f..d9c166bb14440f8a939673a4fa0d24819a58947d 100644 (file)
@@ -1924,6 +1924,33 @@ def rich_comparisons():
                     verify(eval("x %s c[y]" % op) == eval("x %s y" % op),
                            "x=%d, y=%d" % (x, y))
 
+def coercions():
+    if verbose: print "Testing coercions..."
+    class I(int): pass
+    coerce(I(0), 0)
+    coerce(0, I(0))
+    class L(long): pass
+    coerce(L(0), 0)
+    coerce(L(0), 0L)
+    coerce(0, L(0))
+    coerce(0L, L(0))
+    class F(float): pass
+    coerce(F(0), 0)
+    coerce(F(0), 0L)
+    coerce(F(0), 0.)
+    coerce(0, F(0))
+    coerce(0L, F(0))
+    coerce(0., F(0))
+    class C(complex): pass
+    coerce(C(0), 0)
+    coerce(C(0), 0L)
+    coerce(C(0), 0.)
+    coerce(C(0), 0j)
+    coerce(0, C(0))
+    coerce(0L, C(0))
+    coerce(0., C(0))
+    coerce(0j, C(0))
+
 
 def all():
     lists()
@@ -1964,6 +1991,7 @@ def all():
     str_subclass_as_dict_key()
     classic_comparisons()
     rich_comparisons()
+    coercions()
 
 all()
 
index b9a5e1b84d77016af9443605e47bfe29d2610fa3..2de5535a707e3eb3d15a8796b9e47ad5807a2d86 100644 (file)
@@ -590,6 +590,11 @@ float_coerce(PyObject **pv, PyObject **pw)
                Py_INCREF(*pv);
                return 0;
        }
+       else if (PyFloat_Check(*pw)) {
+               Py_INCREF(*pv);
+               Py_INCREF(*pw);
+               return 0;
+       }
        return 1; /* Can't do it */
 }
 
index 16e4336bbf66d92982ddad952b964cba7db547d4..bb5ad16c9a5eb0548a299479cd7785d6d23332ec 100644 (file)
@@ -782,6 +782,17 @@ int_or(PyIntObject *v, PyIntObject *w)
        return PyInt_FromLong(a | b);
 }
 
+static int
+int_coerce(PyObject **pv, PyObject **pw)
+{
+       if (PyInt_Check(*pw)) {
+               Py_INCREF(*pv);
+               Py_INCREF(*pw);
+               return 0;
+       }
+       return 1; /* Can't do it */
+}
+
 static PyObject *
 int_int(PyIntObject *v)
 {
@@ -904,7 +915,7 @@ static PyNumberMethods int_as_number = {
        (binaryfunc)int_and,    /*nb_and*/
        (binaryfunc)int_xor,    /*nb_xor*/
        (binaryfunc)int_or,     /*nb_or*/
-       0,                      /*nb_coerce*/
+       int_coerce,             /*nb_coerce*/
        (unaryfunc)int_int,     /*nb_int*/
        (unaryfunc)int_long,    /*nb_long*/
        (unaryfunc)int_float,   /*nb_float*/
index 1e01bf074b60874fb730ba9b64579dadc7810e0b..8f7d9e4f8412e49234e19d7b830d180d4f78469a 100644 (file)
@@ -2134,6 +2134,11 @@ long_coerce(PyObject **pv, PyObject **pw)
                Py_INCREF(*pv);
                return 0;
        }
+       else if (PyLong_Check(*pw)) {
+               Py_INCREF(*pv);
+               Py_INCREF(*pw);
+               return 0;
+       }
        return 1; /* Can't do it */
 }