Author: Manuel Jacob
Branch: remove-remaining-smm
Changeset: r69300:e8346b7b8d72
Date: 2014-02-23 22:15 +0100
http://bitbucket.org/pypy/pypy/changeset/e8346b7b8d72/

Log:    IN-PROGESS: Kill binary SMMs of complex.

diff --git a/pypy/objspace/std/complexobject.py 
b/pypy/objspace/std/complexobject.py
--- a/pypy/objspace/std/complexobject.py
+++ b/pypy/objspace/std/complexobject.py
@@ -343,23 +343,95 @@
         """(A+Bj).conjugate() -> A-Bj"""
         return space.newcomplex(self.realval, -self.imagval)
 
+    def descr_add(self, space, w_rhs):
+        w_rhs = to_complex(space, w_rhs)
+        return W_ComplexObject(self.realval + w_rhs.realval,
+                               self.imagval + w_rhs.imagval)
+
+    def descr_radd(self, space, w_lhs):
+        w_lhs = to_complex(space, w_lhs)
+        return W_ComplexObject(w_lhs.realval + self.realval,
+                               w_lhs.imagval + self.imagval)
+
+    def descr_sub(self, space, w_rhs):
+        w_rhs = to_complex(space, w_rhs)
+        return W_ComplexObject(self.realval - w_rhs.realval,
+                               self.imagval - w_rhs.imagval)
+
+    def descr_rsub(self, space, w_lhs):
+        w_lhs = to_complex(space, w_lhs)
+        return W_ComplexObject(w_lhs.realval - self.realval,
+                               w_lhs.imagval - self.imagval)
+
+    def descr_mul(self, space, w_rhs):
+        w_rhs = to_complex(space, w_rhs)
+        return self.mul(w_rhs)
+
+    def descr_truediv(self, space, w_rhs):
+        w_rhs = to_complex(space, w_rhs)
+        try:
+            return self.div(w_rhs)
+        except ZeroDivisionError, e:
+            raise OperationError(space.w_ZeroDivisionError, space.wrap(str(e)))
+
+    def descr_floordiv(self, space, w_rhs):
+        w_rhs = to_complex(space, w_rhs)
+        w_rhs = to_complex(space, w_rhs)
+        # don't care about the slight slowdown you get from using divmod
+        try:
+            return self.divmod(space, w_rhs)[0]
+        except ZeroDivisionError, e:
+            raise OperationError(space.w_ZeroDivisionError, space.wrap(str(e)))
+
+    def descr_mod(self, space, w_rhs):
+        w_rhs = to_complex(space, w_rhs)
+        try:
+            return self.divmod(space, w_rhs)[1]
+        except ZeroDivisionError, e:
+            raise OperationError(space.w_ZeroDivisionError, space.wrap(str(e)))
+
+    def descr_divmod(self, space, w_rhs):
+        w_rhs = to_complex(space, w_rhs)
+        try:
+            div, mod = self.divmod(space, w_rhs)
+        except ZeroDivisionError, e:
+            raise OperationError(space.w_ZeroDivisionError, space.wrap(str(e)))
+        return space.newtuple([div, mod])
+
+    @unwrap_spec(w_third_arg=WrappedDefault(None))
+    def descr_pow(self, space, w_exponent, w_third_arg):
+        w_exponent = to_complex(space, w_exponent)
+        if not space.is_w(w_third_arg, space.w_None):
+            raise OperationError(space.w_ValueError, space.wrap('complex 
modulo'))
+        try:
+            r = w_exponent.realval
+            if w_exponent.imagval == 0.0 and -100.0 <= r <= 100.0 and r == 
int(r):
+                w_p = self.pow_small_int(int(r))
+            else:
+                w_p = self.pow(w_exponent)
+        except ZeroDivisionError:
+            raise OperationError(space.w_ZeroDivisionError, space.wrap("0.0 to 
a negative or complex power"))
+        except OverflowError:
+            raise OperationError(space.w_OverflowError, space.wrap("complex 
exponentiation"))
+        return w_p
+
 registerimplementation(W_ComplexObject)
 
 w_one = W_ComplexObject(1, 0)
 
 
-def delegate_Bool2Complex(space, w_bool):
-    return W_ComplexObject(w_bool.intval, 0.0)
-
-def delegate_Int2Complex(space, w_int):
-    return W_ComplexObject(w_int.intval, 0.0)
-
-def delegate_Long2Complex(space, w_long):
-    dval = w_long.tofloat(space)
-    return W_ComplexObject(dval, 0.0)
-
-def delegate_Float2Complex(space, w_float):
-    return W_ComplexObject(w_float.floatval, 0.0)
+def to_complex(space, w_obj):
+    if isinstance(w_obj, W_ComplexObject):
+        return w_obj
+    if space.isinstance_w(w_obj, space.w_bool):
+        return W_ComplexObject(w_obj.intval, 0.0)
+    if space.isinstance_w(w_obj, space.w_int):
+        return W_ComplexObject(w_obj.intval, 0.0)
+    if space.isinstance_w(w_obj, space.w_long):
+        dval = w_obj.tofloat(space)
+        return W_ComplexObject(dval, 0.0)
+    if space.isinstance_w(w_obj, space.w_float):
+        return W_ComplexObject(w_obj.floatval, 0.0)
 
 def hash__Complex(space, w_value):
     hashreal = _hash_float(space, w_value.realval)
@@ -367,60 +439,6 @@
     combined = intmask(hashreal + 1000003 * hashimg)
     return space.newint(combined)
 
-def add__Complex_Complex(space, w_complex1, w_complex2):
-    return W_ComplexObject(w_complex1.realval + w_complex2.realval,
-                           w_complex1.imagval + w_complex2.imagval)
-
-def sub__Complex_Complex(space, w_complex1, w_complex2):
-    return W_ComplexObject(w_complex1.realval - w_complex2.realval,
-                           w_complex1.imagval - w_complex2.imagval)
-
-def mul__Complex_Complex(space, w_complex1, w_complex2):
-    return w_complex1.mul(w_complex2)
-
-def div__Complex_Complex(space, w_complex1, w_complex2):
-    try:
-        return w_complex1.div(w_complex2)
-    except ZeroDivisionError, e:
-        raise OperationError(space.w_ZeroDivisionError, space.wrap(str(e)))
-
-truediv__Complex_Complex = div__Complex_Complex
-
-def mod__Complex_Complex(space, w_complex1, w_complex2):
-    try:
-        return w_complex1.divmod(space, w_complex2)[1]
-    except ZeroDivisionError, e:
-        raise OperationError(space.w_ZeroDivisionError, space.wrap(str(e)))
-
-def divmod__Complex_Complex(space, w_complex1, w_complex2):
-    try:
-        div, mod = w_complex1.divmod(space, w_complex2)
-    except ZeroDivisionError, e:
-        raise OperationError(space.w_ZeroDivisionError, space.wrap(str(e)))
-    return space.newtuple([div, mod])
-
-def floordiv__Complex_Complex(space, w_complex1, w_complex2):
-    # don't care about the slight slowdown you get from using divmod
-    try:
-        return w_complex1.divmod(space, w_complex2)[0]
-    except ZeroDivisionError, e:
-        raise OperationError(space.w_ZeroDivisionError, space.wrap(str(e)))
-
-def pow__Complex_Complex_ANY(space, w_complex, w_exponent, thirdArg):
-    if not space.is_w(thirdArg, space.w_None):
-        raise OperationError(space.w_ValueError, space.wrap('complex modulo'))
-    try:
-        r = w_exponent.realval
-        if w_exponent.imagval == 0.0 and -100.0 <= r <= 100.0 and r == int(r):
-            w_p = w_complex.pow_small_int(int(r))
-        else:
-            w_p = w_complex.pow(w_exponent)
-    except ZeroDivisionError:
-        raise OperationError(space.w_ZeroDivisionError, space.wrap("0.0 to a 
negative or complex power"))
-    except OverflowError:
-        raise OperationError(space.w_OverflowError, space.wrap("complex 
exponentiation"))
-    return w_p
-
 def neg__Complex(space, w_complex):
     return W_ComplexObject(-w_complex.realval, -w_complex.imagval)
 
@@ -473,6 +491,7 @@
                          (w_complex.imagval != 0.0))
 
 def coerce__Complex_Complex(space, w_complex1, w_complex2):
+    #w_complex2 = to_complex(w_complex2)
     return space.newtuple([w_complex1, w_complex2])
 
 def float__Complex(space, w_complex):
@@ -532,7 +551,19 @@
     __getnewargs__ = interp2app(W_ComplexObject.descr___getnewargs__),
     real = complexwprop('realval'),
     imag = complexwprop('imagval'),
-    conjugate = interp2app(W_ComplexObject.descr_conjugate)
+    conjugate = interp2app(W_ComplexObject.descr_conjugate),
+
+    __add__ = interp2app(W_ComplexObject.descr_add),
+    __radd__ = interp2app(W_ComplexObject.descr_radd),
+    __sub__ = interp2app(W_ComplexObject.descr_sub),
+    __rsub__ = interp2app(W_ComplexObject.descr_rsub),
+    __mul__ = interp2app(W_ComplexObject.descr_mul),
+    __div__ = interp2app(W_ComplexObject.descr_truediv),
+    __truediv__ = interp2app(W_ComplexObject.descr_truediv),
+    __floordiv__ = interp2app(W_ComplexObject.descr_floordiv),
+    __mod__ = interp2app(W_ComplexObject.descr_mod),
+    __divmod__ = interp2app(W_ComplexObject.descr_divmod),
+    __pow__ = interp2app(W_ComplexObject.descr_pow),
     )
 
 W_ComplexObject.typedef.registermethods(globals())
diff --git a/pypy/objspace/std/model.py b/pypy/objspace/std/model.py
--- a/pypy/objspace/std/model.py
+++ b/pypy/objspace/std/model.py
@@ -136,11 +136,9 @@
 
         self.typeorder[boolobject.W_BoolObject] += [
             (floatobject.W_FloatObject, floatobject.delegate_Bool2Float),
-            (complexobject.W_ComplexObject, 
complexobject.delegate_Bool2Complex),
             ]
         self.typeorder[intobject.W_IntObject] += [
             (floatobject.W_FloatObject, floatobject.delegate_Int2Float),
-            (complexobject.W_ComplexObject, 
complexobject.delegate_Int2Complex),
             ]
         if config.objspace.std.withsmalllong:
             from pypy.objspace.std import smalllongobject
@@ -150,12 +148,6 @@
                 ]
         self.typeorder[longobject.W_LongObject] += [
             (floatobject.W_FloatObject, floatobject.delegate_Long2Float),
-            (complexobject.W_ComplexObject,
-                    complexobject.delegate_Long2Complex),
-            ]
-        self.typeorder[floatobject.W_FloatObject] += [
-            (complexobject.W_ComplexObject,
-                    complexobject.delegate_Float2Complex),
             ]
 
         if config.objspace.std.withstrbuf:
diff --git a/pypy/objspace/std/test/test_complexobject.py 
b/pypy/objspace/std/test/test_complexobject.py
--- a/pypy/objspace/std/test/test_complexobject.py
+++ b/pypy/objspace/std/test/test_complexobject.py
@@ -1,6 +1,5 @@
 import py
-from pypy.objspace.std.complexobject import W_ComplexObject, \
-    pow__Complex_Complex_ANY, _split_complex
+from pypy.objspace.std.complexobject import W_ComplexObject, _split_complex
 from pypy.objspace.std.multimethod import FailedToImplement
 from pypy.objspace.std import StdObjSpace
 
@@ -75,7 +74,7 @@
         assert _powi((0.0,1.0),2) == (-1.0,0.0)
         c = W_ComplexObject(0.0,1.0)
         p = W_ComplexObject(2.0,0.0)
-        r = pow__Complex_Complex_ANY(self.space,c,p,self.space.wrap(None))
+        r = c.descr_pow(self.space, p, self.space.wrap(None))
         assert r.realval == -1.0
         assert r.imagval == 0.0
 
_______________________________________________
pypy-commit mailing list
pypy-commit@python.org
https://mail.python.org/mailman/listinfo/pypy-commit

Reply via email to