Author: Brian Kearns <[email protected]>
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
[email protected]
http://mail.python.org/mailman/listinfo/pypy-commit