[pypy-commit] pypy longdouble2: merge implementations of W_Float96Box and W_Float128Box, etc.

rlamy noreply at buildbot.pypy.org
Wed Mar 27 21:29:09 CET 2013


Author: Ronan Lamy <ronan.lamy at gmail.com>
Branch: longdouble2
Changeset: r62841:0d1617b3c655
Date: 2013-03-25 16:02 +0000
http://bitbucket.org/pypy/pypy/changeset/0d1617b3c655/

Log:	merge implementations of W_Float96Box and W_Float128Box, etc.

diff --git a/pypy/module/micronumpy/__init__.py b/pypy/module/micronumpy/__init__.py
--- a/pypy/module/micronumpy/__init__.py
+++ b/pypy/module/micronumpy/__init__.py
@@ -79,13 +79,13 @@
         ]
         if long_double_size == 16:
             long_double_dtypes += [
-                ('float128', 'interp_boxes.W_Float128Box'),
-                ('complex256', 'interp_boxes.W_Complex256Box'),
+                ('float128', 'interp_boxes.W_LongDoubleBox'),
+                ('complex256', 'interp_boxes.W_CLongDoubleBox'),
             ]
         elif long_double_size == 12:
             long_double_dtypes += [
-                ('float96', 'interp_boxes.W_Float96Box'),
-                ('complex192', 'interp_boxes.W_Complex192Box'),
+                ('float96', 'interp_boxes.W_LongDoubleBox'),
+                ('complex192', 'interp_boxes.W_CLongDoubleBox'),
             ]
         for dt, box in long_double_dtypes:
             interpleveldefs[dt] = box
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
@@ -346,34 +346,34 @@
     descr__new__, _get_dtype = new_dtype_getter("complex128")
     _COMPONENTS_BOX = W_Float64Box
 
-if ENABLED_LONG_DOUBLE and long_double_size == 12:
-    class W_Float96Box(W_FloatingBox, PrimitiveBox):
-        descr__new__, _get_dtype = new_dtype_getter("float96")
+if ENABLED_LONG_DOUBLE and long_double_size > 8:
+    class W_LongDoubleBox(W_FloatingBox, PrimitiveBox):
+        @staticmethod
+        def _get_dtype(space):
+            from pypy.module.micronumpy.interp_dtype import get_dtype_cache
+            return get_dtype_cache(space).w_longdouble
 
-    W_LongDoubleBox = W_Float96Box
+        def descr__new__(space, w_subtype, w_value):
+            dtype = W_LongDoubleBox._get_dtype(space)
+            return dtype.itemtype.coerce_subtype(space, w_subtype, w_value)
 
-    class W_Complex192Box(ComplexBox, W_ComplexFloatingBox):
-        descr__new__, _get_dtype = new_dtype_getter("complex192")
-        _COMPONENTS_BOX = W_Float96Box
 
-    W_CLongDoubleBox = W_Complex192Box
+    class W_CLongDoubleBox(ComplexBox, W_ComplexFloatingBox):
+        @staticmethod
+        def _get_dtype(space):
+            from pypy.module.micronumpy.interp_dtype import get_dtype_cache
+            return get_dtype_cache(space).w_clongdouble
 
-elif ENABLED_LONG_DOUBLE and long_double_size == 16:
-    class W_Float128Box(W_FloatingBox, PrimitiveBox):
-        descr__new__, _get_dtype = new_dtype_getter("float128")
-    W_LongDoubleBox = W_Float128Box
-
-    class W_Complex256Box(ComplexBox, W_ComplexFloatingBox):
-        descr__new__, _get_dtype = new_dtype_getter("complex256")
-        _COMPONENTS_BOX = W_Float128Box
-
-    W_CLongDoubleBox = W_Complex256Box
+        def descr__new__(space, w_subtype, w_value):
+            dtype = W_CLongDoubleBox._get_dtype(space)
+            return dtype.itemtype.coerce_subtype(space, w_subtype, w_value)
+        _COMPONENTS_BOX = W_LongDoubleBox
 
 elif ENABLED_LONG_DOUBLE:
     W_LongDoubleBox = W_Float64Box
     W_CLongDoubleBox = W_Complex64Box
 
-    
+
 W_GenericBox.typedef = TypeDef("generic",
     __module__ = "numpypy",
 
@@ -539,33 +539,25 @@
     __new__ = interp2app(W_Float64Box.descr__new__.im_func),
 )
 
-if ENABLED_LONG_DOUBLE and long_double_size == 12:
-    W_Float96Box.typedef = TypeDef("float96", (W_FloatingBox.typedef),
+if ENABLED_LONG_DOUBLE and long_double_size > 8:
+    W_LongDoubleBox.typedef = TypeDef("float00", (W_FloatingBox.typedef),
         __module__ = "numpypy",
 
-        __new__ = interp2app(W_Float96Box.descr__new__.im_func),
+        __new__ = interp2app(W_LongDoubleBox.descr__new__.im_func),
     )
 
-    W_Complex192Box.typedef = TypeDef("complex192", (W_ComplexFloatingBox.typedef, complex_typedef),
+    W_CLongDoubleBox.typedef = TypeDef("complex00", (W_ComplexFloatingBox.typedef, complex_typedef),
         __module__ = "numpypy",
-        __new__ = interp2app(W_Complex192Box.descr__new__.im_func),
+        __new__ = interp2app(W_CLongDoubleBox.descr__new__.im_func),
         real = GetSetProperty(W_ComplexFloatingBox.descr_get_real),
         imag = GetSetProperty(W_ComplexFloatingBox.descr_get_imag),
     )
-
-elif ENABLED_LONG_DOUBLE and long_double_size == 16:
-    W_Float128Box.typedef = TypeDef("float128", (W_FloatingBox.typedef),
-        __module__ = "numpypy",
-
-        __new__ = interp2app(W_Float128Box.descr__new__.im_func),
-    )
-
-    W_Complex256Box.typedef = TypeDef("complex256", (W_ComplexFloatingBox.typedef, complex_typedef),
-        __module__ = "numpypy",
-        __new__ = interp2app(W_Complex256Box.descr__new__.im_func),
-        real = GetSetProperty(W_ComplexFloatingBox.descr_get_real),
-        imag = GetSetProperty(W_ComplexFloatingBox.descr_get_imag),
-    )
+    if long_double_size == 12:
+        W_LongDoubleBox.name = "float96"
+        W_CLongDoubleBox.name = "complex192"
+    elif long_double_size == 16:
+        W_LongDoubleBox.name = "float128"
+        W_CLongDoubleBox.name = "complex256"
 
 W_FlexibleBox.typedef = TypeDef("flexible", W_GenericBox.typedef,
     __module__ = "numpypy",
diff --git a/pypy/module/micronumpy/interp_dtype.py b/pypy/module/micronumpy/interp_dtype.py
--- a/pypy/module/micronumpy/interp_dtype.py
+++ b/pypy/module/micronumpy/interp_dtype.py
@@ -482,21 +482,21 @@
         )
         if interp_boxes.ENABLED_LONG_DOUBLE and interp_boxes.long_double_size > 8:
             self.w_longdouble = W_Dtype(
-                types.Float96(),
+                types.Float80(),
                 num=13,
                 kind=FLOATINGLTR,
                 name="",
                 char="g",
-                w_box_type=space.gettypefor(interp_boxes.W_Float96Box),
+                w_box_type=space.gettypefor(interp_boxes.W_LongDoubleBox),
                 aliases=["longdouble", "longfloat"],
             )
             self.w_clongdouble = W_ComplexDtype(
-                types.Complex192(),
+                types.Complex160(),
                 num=16,
                 kind=COMPLEXLTR,
                 name="",
                 char="G",
-                w_box_type = space.gettypefor(interp_boxes.W_Complex192Box),
+                w_box_type = space.gettypefor(interp_boxes.W_CLongDoubleBox),
                 alternate_constructors=[space.w_complex],
                 aliases=["clongdouble", "clongfloat"],
                 float_type = self.w_longdouble,
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
@@ -1567,7 +1567,7 @@
         _attrs_ = ()
 
         T = rffi.LONGDOUBLE
-        BoxType = interp_boxes.W_Float96Box
+        BoxType = interp_boxes.W_LongDoubleBox
         format_code = "q"
 
         def runpack_str(self, s):
@@ -1587,18 +1587,12 @@
         _attrs_ = ()
 
         T = rffi.LONGDOUBLE
-        BoxType = interp_boxes.W_Complex192Box
-        ComponentBoxType = interp_boxes.W_Float96Box
+        BoxType = interp_boxes.W_CLongDoubleBox
+        ComponentBoxType = interp_boxes.W_LongDoubleBox
     NonNativeComplex160 = Complex160
 
-    if interp_boxes.long_double_size == 12:
-        Float80.storage_bytes = 12
-        Float96 = Float80
-        Complex192 = Complex160
-    elif interp_boxes.long_double_size == 16:
-        Float80.storage_bytes = 16
-        Float128 = Float80
-        Complex256 = Complex160
+    if interp_boxes.long_double_size in (12, 16):
+        Float80.storage_bytes = interp_boxes.long_double_size
     else:
         raise ImportError("Unsupported size for long double")
 


More information about the pypy-commit mailing list