Author: Armin Rigo <ar...@tunes.org>
Branch: 
Changeset: r79939:d2674661565e
Date: 2015-10-03 09:43 +0200
http://bitbucket.org/pypy/pypy/changeset/d2674661565e/

Log:    Fix for fed018f3c786: there were reasons for why even __radd__ would
        fall back to space.add().

diff --git a/pypy/module/__builtin__/interp_classobj.py 
b/pypy/module/__builtin__/interp_classobj.py
--- a/pypy/module/__builtin__/interp_classobj.py
+++ b/pypy/module/__builtin__/interp_classobj.py
@@ -272,11 +272,9 @@
                 return space.w_NotImplemented
             return space.call_function(w_meth, w_b)
         else:
-            # here, if coerce returns a non-W_Instance object as first
-            # argument, then give up.  The idea is that this strange
-            # case should already have been handled by the binaryop()
-            # called from descroperation first.
-            return space.w_NotImplemented
+            # fall back to space.xxx() if coerce returns a non-W_Instance
+            # object as first argument
+            return getattr(space, objspacename)(w_b, w_a)
     rbinaryop.func_name = "r" + name
     return binaryop, rbinaryop
 
@@ -658,7 +656,7 @@
                     return space.w_NotImplemented
                 return space.call_function(w_func, w_other)
             else:
-                return space.w_NotImplemented
+                return space.pow(w_b, w_a, space.w_None)
         else:
             # CPython also doesn't try coercion in this case
             w_func = self.getattr(space, '__rpow__', False)
diff --git a/pypy/module/__builtin__/test/test_classobj.py 
b/pypy/module/__builtin__/test/test_classobj.py
--- a/pypy/module/__builtin__/test/test_classobj.py
+++ b/pypy/module/__builtin__/test/test_classobj.py
@@ -425,6 +425,14 @@
                 return 42
         assert B() + B() == 42
 
+    def test_coerce_reverse(self):
+        class CoerceNumber:
+            def __coerce__(self, other):
+                assert isinstance(other, int)
+                return (6, other)
+        assert 5 + CoerceNumber() == 11
+        assert 2 ** CoerceNumber() == 64
+
     def test_binaryop(self):
         class A:
             def __add__(self, other):
_______________________________________________
pypy-commit mailing list
pypy-commit@python.org
https://mail.python.org/mailman/listinfo/pypy-commit

Reply via email to