[pypy-commit] pypy fix-result-types: fix return type for unary ufuncs on object scalars

rlamy noreply at buildbot.pypy.org
Fri May 15 19:08:58 CEST 2015


Author: Ronan Lamy <ronan.lamy at gmail.com>
Branch: fix-result-types
Changeset: r77341:55bc2289b455
Date: 2015-05-15 18:09 +0100
http://bitbucket.org/pypy/pypy/changeset/55bc2289b455/

Log:	fix return type for unary ufuncs on object scalars

diff --git a/pypy/module/micronumpy/test/test_ufuncs.py b/pypy/module/micronumpy/test/test_ufuncs.py
--- a/pypy/module/micronumpy/test/test_ufuncs.py
+++ b/pypy/module/micronumpy/test/test_ufuncs.py
@@ -403,6 +403,12 @@
         b = negative(a + a)
         assert (b == [[-2, -4], [-6, -8]]).all()
 
+        class Obj(object):
+            def __neg__(self):
+                return 'neg'
+        x = Obj()
+        assert type(negative(x)) is str
+
     def test_abs(self):
         from numpy import array, absolute
 
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
@@ -21,6 +21,7 @@
         get_storage_as_int, is_rhs_priority_higher)
 from .casting import (
     find_unaryop_result_dtype, find_binop_result_dtype, can_cast_type)
+from .boxes import W_ObjectBox
 
 def done_if_true(dtype, val):
     return dtype.itemtype.bool(val)
@@ -459,7 +460,8 @@
         w_val = self.func(in_dtype, w_arg.convert_to(space, in_dtype))
         if out is None:
             if out_dtype.is_object():
-                w_val = w_arg
+                assert isinstance(w_val, W_ObjectBox)
+                return w_val.w_obj
             return w_val
         w_val = out_dtype.coerce(space, w_val)
         if out.is_scalar():


More information about the pypy-commit mailing list