Index: src/templates/int.expose =================================================================== --- src/templates/int.expose (revision 3470) +++ src/templates/int.expose (working copy) @@ -9,7 +9,7 @@ expose_binary: __add__ __and__ __div__ __radd__ __rdiv__ __rfloordiv__ __rmod__ \ __rmul__ __rshift__ __rsub__ __rtruediv__ \ __sub__ __truediv__ __xor__ __rxor__ __rrshift__ \ - __ror__ __rand__ __rpow__ __rlshift__ __rdivmod__ + __ror__ __rand__ __rpow__ __rlshift__ __rdivmod__ __coerce__ expose_vanilla_cmp expose_vanilla_pow expose_new_immutable: Index: src/templates/long.expose =================================================================== --- src/templates/long.expose (revision 3470) +++ src/templates/long.expose (working copy) @@ -9,7 +9,7 @@ expose_binary: __add__ __and__ __div__ __radd__ __rdiv__ __rfloordiv__ __rmod__ \ __rmul__ __rshift__ __rsub__ __rtruediv__ \ __sub__ __truediv__ __xor__ __rxor__ __rrshift__ \ - __ror__ __rand__ __rpow__ __rlshift__ __rdivmod__ + __ror__ __rand__ __rpow__ __rlshift__ __rdivmod__ __coerce__ expose_meth: :b __nonzero__ expose_vanilla_cmp expose_vanilla_pow Index: src/templates/float.expose =================================================================== --- src/templates/float.expose (revision 3470) +++ src/templates/float.expose (working copy) @@ -8,7 +8,7 @@ expose_binary: __add__ __div__ __divmod_ __floordiv__ __mod__ __mul__ \ __radd__ __rdiv__ __rfloordiv__ __rmod__ \ __rmul__ __rsub__ __rtruediv__ \ - __sub__ __truediv__ __rdivmod__ __rpow__ + __sub__ __truediv__ __rdivmod__ __rpow__ __coerce__ expose_vanilla_cmp expose_vanilla_pow expose_new_immutable: Index: src/org/python/core/PyInteger.java =================================================================== --- src/org/python/core/PyInteger.java (revision 3470) +++ src/org/python/core/PyInteger.java (working copy) @@ -670,6 +670,25 @@ public class PyInteger extends PyObject } dict.__setitem__("__rdivmod__",new PyMethodDescr("__rdivmod__",PyInteger.class,1,1,new exposed___rdivmod__(null,null))); + class exposed___coerce__ extends PyBuiltinMethodNarrow { + + exposed___coerce__(PyObject self,PyBuiltinFunction.Info info) { + super(self,info); + } + + public PyBuiltinFunction bind(PyObject self) { + return new exposed___coerce__(self,info); + } + + public PyObject __call__(PyObject arg0) { + PyObject ret=((PyInteger)self).int___coerce__(arg0); + if (ret==null) + return Py.NotImplemented; + return ret; + } + + } + dict.__setitem__("__coerce__",new PyMethodDescr("__coerce__",PyInteger.class,1,1,new exposed___coerce__(null,null))); class exposed___cmp__ extends PyBuiltinMethodNarrow { exposed___cmp__(PyObject self,PyBuiltinFunction.Info info) { @@ -1204,6 +1223,10 @@ public class PyInteger extends PyObject }); } + final PyObject int___coerce__(PyObject other) { + return __coerce__(other); + } + public PyObject __pow__(PyObject right, PyObject modulo) { return int___pow__(right,modulo); } Index: src/org/python/core/PyLong.java =================================================================== --- src/org/python/core/PyLong.java (revision 3470) +++ src/org/python/core/PyLong.java (working copy) @@ -681,6 +681,25 @@ public class PyLong extends PyObject } dict.__setitem__("__rdivmod__",new PyMethodDescr("__rdivmod__",PyLong.class,1,1,new exposed___rdivmod__(null,null))); + class exposed___coerce__ extends PyBuiltinMethodNarrow { + + exposed___coerce__(PyObject self,PyBuiltinFunction.Info info) { + super(self,info); + } + + public PyBuiltinFunction bind(PyObject self) { + return new exposed___coerce__(self,info); + } + + public PyObject __call__(PyObject arg0) { + PyObject ret=((PyLong)self).long___coerce__(arg0); + if (ret==null) + return Py.NotImplemented; + return ret; + } + + } + dict.__setitem__("__coerce__",new PyMethodDescr("__coerce__",PyLong.class,1,1,new exposed___coerce__(null,null))); class exposed___cmp__ extends PyBuiltinMethodNarrow { exposed___cmp__(PyObject self,PyBuiltinFunction.Info info) { @@ -1272,6 +1291,9 @@ public class PyLong extends PyObject }); } + final PyObject long___coerce__(PyObject other) { + return __coerce__(other); + } public PyObject __pow__(PyObject right, PyObject modulo) { return long___pow__(right, modulo); } Index: src/org/python/core/PyFloat.java =================================================================== --- src/org/python/core/PyFloat.java (revision 3470) +++ src/org/python/core/PyFloat.java (working copy) @@ -434,6 +434,25 @@ public class PyFloat extends PyObject } dict.__setitem__("__rpow__",new PyMethodDescr("__rpow__",PyFloat.class,1,1,new exposed___rpow__(null,null))); + class exposed___coerce__ extends PyBuiltinMethodNarrow { + + exposed___coerce__(PyObject self,PyBuiltinFunction.Info info) { + super(self,info); + } + + public PyBuiltinFunction bind(PyObject self) { + return new exposed___coerce__(self,info); + } + + public PyObject __call__(PyObject arg0) { + PyObject ret=((PyFloat)self).float___coerce__(arg0); + if (ret==null) + return Py.NotImplemented; + return ret; + } + + } + dict.__setitem__("__coerce__",new PyMethodDescr("__coerce__",PyFloat.class,1,1,new exposed___coerce__(null,null))); class exposed___cmp__ extends PyBuiltinMethodNarrow { exposed___cmp__(PyObject self,PyBuiltinFunction.Info info) { @@ -945,6 +964,9 @@ public class PyFloat extends PyObject return __rpow__(left); } + final PyObject float___coerce__(PyObject other) { + return __coerce__(other); + } public PyObject __rpow__(PyObject left) { if (!canCoerce(left)) return null; --- /dev/null 2006-11-25 17:47:37.000000000 +0530 +++ Lib/test/test_coerce.py 2007-09-18 18:51:07.000000000 +0530 @@ -0,0 +1,17 @@ +import unittest, os +from test import test_support +class CoerceTest(unittest.TestCase): + def test_int_coerce__(self): + self.assertEqual(int.__coerce__(1, None), NotImplemented) + self.assertRaises(TypeError, int.__coerce__, None, 1) + def test_long_coerce__(self): + self.assertEqual(long.__coerce__(1L, None), NotImplemented) + self.assertRaises(TypeError, long.__coerce__, None, 1) + def test_float_coerce__(self): + self.assertRaises(TypeError, float.__coerce__, None, 1) + self.assertEqual(float.__coerce__(10.23, None), NotImplemented) +def test_main(): + test_support.run_unittest(CoerceTest) +if __name__ == "__main__": + test_main() +