[pypy-commit] pypy fix-result-types: extract W_Ufunc1.find_specialization()

rlamy noreply at buildbot.pypy.org
Mon May 11 21:23:40 CEST 2015


Author: Ronan Lamy <ronan.lamy at gmail.com>
Branch: fix-result-types
Changeset: r77294:3ba5bdc3be93
Date: 2015-05-11 18:56 +0100
http://bitbucket.org/pypy/pypy/changeset/3ba5bdc3be93/

Log:	extract W_Ufunc1.find_specialization()

diff --git a/pypy/module/micronumpy/ufuncs.py b/pypy/module/micronumpy/ufuncs.py
--- a/pypy/module/micronumpy/ufuncs.py
+++ b/pypy/module/micronumpy/ufuncs.py
@@ -337,18 +337,7 @@
                 out = None
         w_obj = numpify(space, w_obj)
         dtype = w_obj.get_dtype(space)
-        if dtype.is_flexible():
-            raise OperationError(space.w_TypeError,
-                      space.wrap('Not implemented for this type'))
-        if (self.int_only and not (dtype.is_int() or dtype.is_object()) or
-                not self.allow_bool and dtype.is_bool() or
-                not self.allow_complex and dtype.is_complex()):
-            raise oefmt(space.w_TypeError,
-                "ufunc %s not supported for the input type", self.name)
-        calc_dtype = find_unaryop_result_dtype(space,
-                                  dtype,
-                                  promote_to_float=self.promote_to_float,
-                                  promote_bools=self.promote_bools)
+        calc_dtype, func = self.find_specialization(space, dtype)
         if out is not None:
             if not isinstance(out, W_NDimArray):
                 raise oefmt(space.w_TypeError, 'output must be an array')
@@ -371,7 +360,7 @@
         assert isinstance(w_obj, W_NDimArray)
         shape = shape_agreement(space, w_obj.get_shape(), out,
                                 broadcast_down=False)
-        return loop.call1(space, shape, self.func, calc_dtype, res_dtype,
+        return loop.call1(space, shape, func, calc_dtype, res_dtype,
                           w_obj, out)
 
     def call_scalar(self, space, w_arg, in_dtype, out_dtype, out):
@@ -387,6 +376,20 @@
             out.fill(space, w_val)
         return out
 
+    def find_specialization(self, space, dtype):
+        if dtype.is_flexible():
+            raise oefmt(space.w_TypeError, 'Not implemented for this type')
+        if (self.int_only and not (dtype.is_int() or dtype.is_object()) or
+                not self.allow_bool and dtype.is_bool() or
+                not self.allow_complex and dtype.is_complex()):
+            raise oefmt(space.w_TypeError,
+                "ufunc %s not supported for the input type", self.name)
+        calc_dtype = find_unaryop_result_dtype(space,
+                                  dtype,
+                                  promote_to_float=self.promote_to_float,
+                                  promote_bools=self.promote_bools)
+        return calc_dtype, self.func
+
 
 class W_Ufunc2(W_Ufunc):
     _immutable_fields_ = ["func", "comparison_func", "done_func"]


More information about the pypy-commit mailing list