Author: Brian Kearns <bdkea...@gmail.com>
Branch: 
Changeset: r61114:11d464cbfa08
Date: 2013-02-11 22:27 -0500
http://bitbucket.org/pypy/pypy/changeset/11d464cbfa08/

Log:    fix numpypy binop promotion

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
@@ -614,10 +614,12 @@
             for dtype in [self.w_float16dtype, self.w_float32dtype,
                           self.w_float64dtype, self.w_longdouble]
         )
+        self.dtypes_by_num = {}
         self.dtypes_by_name = {}
         # we reverse, so the stuff with lower numbers override stuff with
         # higher numbers
         for dtype in reversed(self.builtin_dtypes):
+            self.dtypes_by_num[dtype.num] = dtype
             self.dtypes_by_name[dtype.name] = dtype
             can_name = dtype.kind + str(dtype.itemtype.get_element_size())
             self.dtypes_by_name[can_name] = dtype
@@ -708,9 +710,7 @@
                     w_minobj = space.wrap(0)
                 items_w = items_w + [w_maxobj, w_minobj]
             items_w = items_w + [dtype.w_box_type]
-                       
-            w_tuple = space.newtuple(items_w)
-            space.setitem(w_typeinfo, space.wrap(k), w_tuple)
+            space.setitem(w_typeinfo, space.wrap(k), space.newtuple(items_w))
         self.w_typeinfo = w_typeinfo
 
 def get_dtype_cache(space):
diff --git a/pypy/module/micronumpy/interp_ufuncs.py 
b/pypy/module/micronumpy/interp_ufuncs.py
--- a/pypy/module/micronumpy/interp_ufuncs.py
+++ b/pypy/module/micronumpy/interp_ufuncs.py
@@ -405,7 +405,6 @@
         else:
             raise OperationError(space.w_TypeError, space.wrap("Unsupported 
types"))
 
-    
     if promote_to_float:
         return find_unaryop_result_dtype(space, dt2, promote_to_float=True)
     # If they're the same kind, choose the greater one.
@@ -426,13 +425,13 @@
             return dt2
         # we need to promote both dtypes
         dtypenum = dt2.num + 2
+    elif dt2.num == 10 or (LONG_BIT == 64 and dt2.num == 8):
+        # UInt64 + signed = Float64
+        dtypenum = 12
     else:
-        # increase to the next signed type (or to float)
+        # increase to the next signed type
         dtypenum = dt2.num + 1
-        # UInt64 + signed = Float64
-        if dt2.num == 10:
-            dtypenum += 2
-    newdtype = interp_dtype.get_dtype_cache(space).builtin_dtypes[dtypenum]
+    newdtype = interp_dtype.get_dtype_cache(space).dtypes_by_num[dtypenum]
 
     if (newdtype.itemtype.get_element_size() > dt2.itemtype.get_element_size() 
or
         newdtype.kind == interp_dtype.FLOATINGLTR):
@@ -440,11 +439,8 @@
     else:
         # we only promoted to long on 32-bit or to longlong on 64-bit
         # this is really for dealing with the Long and Ulong dtypes
-        if LONG_BIT == 32:
-            dtypenum += 2
-        else:
-            dtypenum += 4
-        return interp_dtype.get_dtype_cache(space).builtin_dtypes[dtypenum]
+        dtypenum += 2
+        return interp_dtype.get_dtype_cache(space).dtypes_by_num[dtypenum]
 
 
 @jit.unroll_safe
_______________________________________________
pypy-commit mailing list
pypy-commit@python.org
http://mail.python.org/mailman/listinfo/pypy-commit

Reply via email to