[pypy-commit] pypy fix-result-types: Create scalar2dtype() to simplify find_dtype_for_scalar()

rlamy noreply at buildbot.pypy.org
Fri May 22 04:13:11 CEST 2015


Author: Ronan Lamy <ronan.lamy at gmail.com>
Branch: fix-result-types
Changeset: r77470:9efeedc33356
Date: 2015-05-22 03:13 +0100
http://bitbucket.org/pypy/pypy/changeset/9efeedc33356/

Log:	Create scalar2dtype() to simplify find_dtype_for_scalar()

diff --git a/pypy/module/micronumpy/casting.py b/pypy/module/micronumpy/casting.py
--- a/pypy/module/micronumpy/casting.py
+++ b/pypy/module/micronumpy/casting.py
@@ -201,7 +201,7 @@
     return can_cast_type(space, dtype, target, casting)
 
 def as_scalar(space, w_obj):
-    dtype = find_dtype_for_scalar(space, w_obj)
+    dtype = scalar2dtype(space, w_obj)
     return dtype.coerce(space, w_obj)
 
 def min_scalar_type(space, w_a):
@@ -289,8 +289,7 @@
         su = su1 and (su2 or not dt2.is_signed())
     return _promote_types(space, dt1, dt2), su
 
-
-def find_dtype_for_scalar(space, w_obj, current_guess=None):
+def scalar2dtype(space, w_obj):
     from .boxes import W_GenericBox
     bool_dtype = get_dtype_cache(space).w_booldtype
     long_dtype = get_dtype_cache(space).w_longdtype
@@ -300,34 +299,30 @@
     float_dtype = get_dtype_cache(space).w_float64dtype
     object_dtype = get_dtype_cache(space).w_objectdtype
     if isinstance(w_obj, W_GenericBox):
-        dtype = w_obj.get_dtype(space)
-        return find_binop_result_dtype(space, dtype, current_guess)
+        return w_obj.get_dtype(space)
 
     if space.isinstance_w(w_obj, space.w_bool):
-        return find_binop_result_dtype(space, bool_dtype, current_guess)
+        return bool_dtype
     elif space.isinstance_w(w_obj, space.w_int):
-        return find_binop_result_dtype(space, long_dtype, current_guess)
+        return long_dtype
     elif space.isinstance_w(w_obj, space.w_long):
         try:
             space.int_w(w_obj)
         except OperationError, e:
             if e.match(space, space.w_OverflowError):
                 if space.is_true(space.le(w_obj, space.wrap(0))):
-                    return find_binop_result_dtype(space, int64_dtype,
-                                               current_guess)
-                return find_binop_result_dtype(space, uint64_dtype,
-                                               current_guess)
+                    return int64_dtype
+                return uint64_dtype
             raise
-        return find_binop_result_dtype(space, int64_dtype, current_guess)
+        return int64_dtype
     elif space.isinstance_w(w_obj, space.w_float):
-        return find_binop_result_dtype(space, float_dtype, current_guess)
+        return float_dtype
     elif space.isinstance_w(w_obj, space.w_complex):
         return complex_dtype
     elif space.isinstance_w(w_obj, space.w_str):
-        if current_guess is None:
-            return variable_dtype(space, 'S%d' % space.len_w(w_obj))
-        elif current_guess.num == NPY.STRING:
-            if current_guess.elsize < space.len_w(w_obj):
-                return variable_dtype(space, 'S%d' % space.len_w(w_obj))
-        return current_guess
+        return variable_dtype(space, 'S%d' % space.len_w(w_obj))
     return object_dtype
+
+def find_dtype_for_scalar(space, w_obj, current_guess=None):
+    dtype = scalar2dtype(space, w_obj)
+    return find_binop_result_dtype(space, dtype, current_guess)
diff --git a/pypy/module/micronumpy/descriptor.py b/pypy/module/micronumpy/descriptor.py
--- a/pypy/module/micronumpy/descriptor.py
+++ b/pypy/module/micronumpy/descriptor.py
@@ -1021,15 +1021,14 @@
     return get_dtype_cache(space).dtypes_by_num[num]
 
 def as_dtype(space, w_arg, allow_None=True):
-    from pypy.module.micronumpy.casting import find_dtype_for_scalar
+    from pypy.module.micronumpy.casting import scalar2dtype
     # roughly equivalent to CNumPy's PyArray_DescrConverter2
     if not allow_None and space.is_none(w_arg):
         raise TypeError("Cannot create dtype from None here")
     if isinstance(w_arg, W_NDimArray):
         return w_arg.get_dtype()
     elif is_scalar_w(space, w_arg):
-        result = find_dtype_for_scalar(space, w_arg)
-        assert result is not None  # XXX: not guaranteed
+        result = scalar2dtype(space, w_arg)
         return result
     else:
         return space.interp_w(W_Dtype,


More information about the pypy-commit mailing list