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