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