[pypy-commit] pypy numpy-dtype-refactor-complex: added real and imag descriptors to complex objs

alex_gaynor noreply at buildbot.pypy.org
Mon Dec 5 19:57:55 CET 2011


Author: Alex Gaynor <alex.gaynor at gmail.com>
Branch: numpy-dtype-refactor-complex
Changeset: r50176:7a810c2bdf0d
Date: 2011-12-05 13:51 -0500
http://bitbucket.org/pypy/pypy/changeset/7a810c2bdf0d/

Log:	added real and imag descriptors to complex objs

diff --git a/pypy/module/micronumpy/interp_boxes.py b/pypy/module/micronumpy/interp_boxes.py
--- a/pypy/module/micronumpy/interp_boxes.py
+++ b/pypy/module/micronumpy/interp_boxes.py
@@ -1,7 +1,7 @@
 from pypy.interpreter.baseobjspace import Wrappable
 from pypy.interpreter.error import operationerrfmt
 from pypy.interpreter.gateway import interp2app
-from pypy.interpreter.typedef import TypeDef
+from pypy.interpreter.typedef import TypeDef, GetSetProperty
 from pypy.objspace.std.complextype import complex_typedef
 from pypy.objspace.std.floattype import float_typedef
 from pypy.objspace.std.inttype import int_typedef
@@ -65,6 +65,14 @@
         dtype = self.get_dtype(space)
         return space.wrap(dtype.itemtype.bool(self))
 
+    def descr_get_real(self, space):
+        dtype = self.get_dtype(space)
+        return dtype.itemtype.real(self)
+
+    def descr_get_imag(self, space):
+        dtype = self.get_dtype(space)
+        return dtype.itemtype.imag(self)
+
     def _binop_impl(ufunc_name):
         def impl(self, space, w_other):
             from pypy.module.micronumpy import interp_ufuncs
@@ -197,6 +205,9 @@
 
     __neg__ = interp2app(W_GenericBox.descr_neg),
     __abs__ = interp2app(W_GenericBox.descr_abs),
+
+    real = GetSetProperty(W_GenericBox.descr_get_real),
+    imag = GetSetProperty(W_GenericBox.descr_get_imag),
 )
 
 W_BoolBox.typedef = TypeDef("bool_", W_GenericBox.typedef,
diff --git a/pypy/module/micronumpy/types.py b/pypy/module/micronumpy/types.py
--- a/pypy/module/micronumpy/types.py
+++ b/pypy/module/micronumpy/types.py
@@ -34,6 +34,15 @@
         )
     return dispatcher
 
+def raw_unary_op(func):
+    specialize.argtype(1)
+    @functools.wraps(func)
+    def dispatcher(self, v):
+        return func(self,
+            self.for_computation(self.unbox(v))
+        )
+    return dispatcher
+
 def raw_binary_op(func):
     specialize.argtype(1, 2)(func)
     @functools.wraps(func)
@@ -429,20 +438,28 @@
 
     def __init__(self, itemtypes):
         BaseCompositeType.__init__(self, itemtypes)
-        [self.real, self.imag] = self.itemtypes
+        [self.real_type, self.imag_type] = self.itemtypes
 
     def coerce(self, space, w_item):
         if isinstance(w_item, self.BoxType):
             return w_item
         real, imag = space.unpackcomplex(w_item)
-        return self.box([self.real.box(real), self.imag.box(imag)])
-    
+        return self.box([self.real_type.box(real), self.imag_type.box(imag)])
+
     def for_computation(self, (real, imag)):
         return [
-            self.real.for_computation(self.real.unbox(real)),
-            self.imag.for_computation(self.imag.unbox(imag)),
+            self.real_type.for_computation(self.real_type.unbox(real)),
+            self.imag_type.for_computation(self.imag_type.unbox(imag)),
         ]
 
     @raw_binary_op
     def eq(self, (real1, imag1), (real2, imag2)):
         return real1 == real2 and imag1 == imag2
+
+    @raw_unary_op
+    def real(self, (real, imag)):
+        return self.real_type.box(real)
+
+    @raw_unary_op
+    def imag(self, (real, imag)):
+        return self.imag_type.box(imag)
\ No newline at end of file


More information about the pypy-commit mailing list