Author: mattip <matti.pi...@gmail.com>
Branch: object-dtype2
Changeset: r76762:48af64138cf8
Date: 2015-04-09 10:51 +0300
http://bitbucket.org/pypy/pypy/changeset/48af64138cf8/

Log:    add tests that match -A behaviour, hack till they pass (cleanup
        needed)

diff --git a/pypy/module/micronumpy/boxes.py b/pypy/module/micronumpy/boxes.py
--- a/pypy/module/micronumpy/boxes.py
+++ b/pypy/module/micronumpy/boxes.py
@@ -614,6 +614,8 @@
         self.w_obj = w_obj
 
     def convert_to(self, space, dtype):
+        if dtype.is_bool():
+            return W_BoolBox(space.bool_w(self.w_obj))
         return self # XXX
 
     def descr__getattr__(self, space, w_key):
diff --git a/pypy/module/micronumpy/ndarray.py 
b/pypy/module/micronumpy/ndarray.py
--- a/pypy/module/micronumpy/ndarray.py
+++ b/pypy/module/micronumpy/ndarray.py
@@ -202,11 +202,14 @@
             return self
         elif isinstance(w_idx, W_NDimArray) and w_idx.get_dtype().is_bool() \
                 and w_idx.ndims() > 0:
-            return self.getitem_filter(space, w_idx)
+            w_res = self.getitem_filter(space, w_idx)
         try:
-            return self.implementation.descr_getitem(space, self, w_idx)
+            w_res = self.implementation.descr_getitem(space, self, w_idx)
         except ArrayArgumentException:
-            return self.getitem_array_int(space, w_idx)
+            w_res = self.getitem_array_int(space, w_idx)
+        if w_res.is_scalar() and w_res.get_dtype(space).is_object():
+            return w_res.get_dtype(space).itemtype.unbox(w_res)
+        return w_res
 
     def getitem(self, space, index_list):
         return self.implementation.getitem_index(space, index_list)
@@ -889,7 +892,10 @@
                 "The truth value of an array with more than one element "
                 "is ambiguous. Use a.any() or a.all()"))
         iter, state = self.create_iter()
-        return space.wrap(space.is_true(iter.getitem(state)))
+        w_val = iter.getitem(state)
+        if self.get_dtype().is_object():
+            w_val = self.get_dtype().itemtype.unbox(w_val) 
+        return space.wrap(space.is_true(w_val))
 
     def _binop_impl(ufunc_name):
         def impl(self, space, w_other, w_out=None):
diff --git a/pypy/module/micronumpy/test/test_object_arrays.py 
b/pypy/module/micronumpy/test/test_object_arrays.py
--- a/pypy/module/micronumpy/test/test_object_arrays.py
+++ b/pypy/module/micronumpy/test/test_object_arrays.py
@@ -33,16 +33,26 @@
         a = np.array(["foo"], dtype=object)
         b = a and complex(1, -1)
         assert b == complex(1, -1)
-        b = complex(1, -1) and a
+        b = np.array(complex(1, -1)) and a
         assert (b == a).all()
 
     def test_logical_ufunc(self):
         import numpy as np
         a = np.array(["foo"], dtype=object)
         b = np.array([1], dtype=object)
-        raises(TypeError, np.logical_and, a, 1)
-        raises(TypeError, np.logical_and, b, complex(1, -1))
+        d = np.array([complex(1, 10)], dtype=object)
+        c = np.logical_and(a, 1)
+        assert c.dtype == np.dtype('object')
+        assert c == 1
+        c = np.logical_and(b, complex(1, -1))
+        assert c.dtype == np.dtype('object')
+        assert c == complex(1, -1)
+        c = np.logical_and(d, b)
+        assert c == 1
         c = b & 1
+        assert c.dtype == np.dtype('object')
+        assert (c == 1).all()
+        c = np.array(1) & b
         assert (c == b).all()
 
     def test_reduce(self):
diff --git a/pypy/module/micronumpy/types.py b/pypy/module/micronumpy/types.py
--- a/pypy/module/micronumpy/types.py
+++ b/pypy/module/micronumpy/types.py
@@ -149,9 +149,8 @@
         return self.box(array[0])
 
     def unbox(self, box):
-        if not isinstance(box, self.BoxType):
-            # i.e. box is an ObjectBox
-            raise oefmt(self.space.w_AttributeError, '')
+        if isinstance(box, ObjectType.BoxType):
+            return box.w_obj
         return box.value
 
     def coerce(self, space, dtype, w_item):
@@ -1701,12 +1700,15 @@
 
     @specialize.argtype(1, 2)
     def box_complex(self, real, imag):
+        if isinstance(real, rffi.r_singlefloat):
+            real = rffi.cast(rffi.DOUBLE, real)
+        if isinstance(imag, rffi.r_singlefloat):
+            imag = rffi.cast(rffi.DOUBLE, imag)
         w_obj = self.space.newcomplex(real, imag)
         return self.BoxType(w_obj)
 
     def str_format(self, box):
-        return 'Object as string'
-        #return space.str_w(space.repr(self.unbox(box)))
+        return self.space.str_w(self.space.repr(self.unbox(box)))
 
     def to_builtin_type(self, space, box):
         assert isinstance(box, self.BoxType)
@@ -1716,7 +1718,7 @@
     def for_computation(v):
         return v
 
-    @raw_binary_op
+    @simple_binary_op
     def eq(self, v1, v2):
         return self.space.eq_w(v1, v2)
 
@@ -1735,28 +1737,32 @@
     def arctan2(self, v1, v2):
         raise oefmt(self.space.w_AttributeError, 'arctan2')
 
-    @raw_unary_op
+    @simple_unary_op
     def bool(self,v):
-        return not self.space.is_w(v, self.space.w_None) and \
-               not self.space.eq_w(v, self.space.wrap(0)) and \
-               not self.space.len_w(v) == 0 
+        return self._bool(v)
 
     def _bool(self, v):
-        return self.space.bool_w(v)
+        if self.space.is_true(v):
+            return True 
+        return False
 
-    @raw_binary_op
+    @simple_binary_op
     def logical_and(self, v1, v2):
-        return self._bool(v1) and self._bool(v2)
+        if self._bool(v1):
+            return v2
+        return v1
 
-    @raw_binary_op
+    @simple_binary_op
     def logical_or(self, v1, v2):
-        return self._bool(v1) or self._bool(v2)
+        if self._bool(v1):
+            return v1
+        return v2
 
-    @raw_unary_op
+    @simple_unary_op
     def logical_not(self, v):
         return not self._bool(v)
 
-    @raw_binary_op
+    @simple_binary_op
     def logical_xor(self, v1, v2):
         a = self._bool(v1)
         b = self._bool(v2)
@@ -1808,7 +1814,7 @@
     def func(self, w_v):
         w_impl = self.space.lookup(w_v, op)
         if w_impl is None:
-            raise oefmt(self.space.w_AttributeError, op)
+            raise oefmt(self.space.w_AttributeError, 'unknown op "%s" on 
object' % op)
         return self.space.get_and_call_function(w_impl, w_v)
     func.__name__ = 'object_' + op
     setattr(cls, op, func)
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
@@ -378,6 +378,8 @@
             w_val = self.func(calc_dtype,
                               w_obj.get_scalar_value().convert_to(space, 
calc_dtype))
             if out is None:
+                if res_dtype.is_object():
+                    w_val = w_obj.get_scalar_value()
                 return w_val
             w_val = res_dtype.coerce(space, w_val)
             if out.is_scalar():
@@ -481,7 +483,7 @@
         else:
             out = w_out
             calc_dtype = out.get_dtype()
-        if self.comparison_func:
+        if self.comparison_func and not calc_dtype.is_object():
             res_dtype = get_dtype_cache(space).w_booldtype
         else:
             res_dtype = calc_dtype
@@ -495,6 +497,8 @@
                     out.set_scalar_value(arr)
                 else:
                     out.fill(space, arr)
+            elif calc_dtype.is_object():
+                out = arr.get_scalar_value()
             else:
                 out = arr
             return out
@@ -1130,6 +1134,8 @@
         def impl(res_dtype, lvalue, rvalue):
             res = get_op(res_dtype)(lvalue, rvalue)
             if comparison_func:
+                if res_dtype.is_object():
+                    return res
                 return dtype_cache.w_booldtype.box(res)
             return res
     return func_with_new_name(impl, ufunc_name)
_______________________________________________
pypy-commit mailing list
pypy-commit@python.org
https://mail.python.org/mailman/listinfo/pypy-commit

Reply via email to