Index: src/templates/complex.expose =================================================================== --- src/templates/complex.expose (revision 3470) +++ src/templates/complex.expose (working copy) @@ -11,7 +11,7 @@ expose_binary: __add__ __div__ __divmod_ __mod__ __mul__ __radd__ __rdiv__ __rdivmod__ \ __rfloordiv__ __rmod__ __rmul__ __rpow__ __rsub__ \ __rtruediv__ __sub__ __truediv__ __eq__ __ne__ __ge__ \ - __le__ __gt__ __lt__ + __le__ __gt__ __lt__ __coerce__ #expose_vanilla_cmp expose_vanilla_pow expose_new_immutable: Index: src/org/python/core/PyObject.java =================================================================== --- src/org/python/core/PyObject.java (revision 3470) +++ src/org/python/core/PyObject.java (working copy) @@ -1225,7 +1225,7 @@ public class PyObject implements java.io if (o == null) throw Py.AttributeError("__coerce__"); if (o == Py.None) - return (PyObject) o; + return Py.NotImplemented ; if (o instanceof PyObject[]) return new PyTuple((PyObject[]) o); else Index: src/org/python/core/PyComplex.java =================================================================== --- src/org/python/core/PyComplex.java (revision 3470) +++ src/org/python/core/PyComplex.java (working copy) @@ -551,6 +551,25 @@ public class PyComplex extends PyObject } dict.__setitem__("__lt__",new PyMethodDescr("__lt__",PyComplex.class,1,1,new exposed___lt__(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=((PyComplex)self).complex___coerce__(arg0); + if (ret==null) + return Py.NotImplemented; + return ret; + } + + } + dict.__setitem__("__coerce__",new PyMethodDescr("__coerce__",PyComplex.class,1,1,new exposed___coerce__(null,null))); class exposed___pow__ extends PyBuiltinMethodNarrow { exposed___pow__(PyObject self,PyBuiltinFunction.Info info) { @@ -914,6 +933,9 @@ public class PyComplex extends PyObject return unsupported_comparison(other); } + final PyObject complex___coerce__(PyObject other) { + return __coerce__(other); + } public Object __coerce_ex__(PyObject other) { if (other instanceof PyComplex) Index: Lib/test/test_complex.py =================================================================== --- Lib/test/test_complex.py (revision 3470) +++ Lib/test/test_complex.py (working copy) @@ -98,6 +98,8 @@ class ComplexTest(unittest.TestCase): def test_coerce(self): self.assertRaises(OverflowError, complex.__coerce__, 1+1j, 1L<<10000) + self.assertEqual(complex.__coerce__(1+1j, None), NotImplemented) + self.assertRaises(TypeError, complex.__coerce__, None, 1+2j) def test_richcompare(self): self.assertRaises(OverflowError, complex.__eq__, 1+1j, 1L<<10000) @@ -312,7 +314,7 @@ def test_main(): del ComplexTest.test_constructor # complex is missing __coerce__ # http://jython.org/bugs/1758282 - del ComplexTest.test_coerce + ComplexTest.test_coerce test_support.run_unittest(ComplexTest) if __name__ == "__main__":