Author: Romain Guillebert <[email protected]>
Branch: numpypy-nditer
Changeset: r64868:27ffa87a4dbd
Date: 2013-06-12 19:27 +0200
http://bitbucket.org/pypy/pypy/changeset/27ffa87a4dbd/

Log:    Slices returned by nditer should be readonly by default

diff --git a/pypy/module/micronumpy/arrayimpl/concrete.py 
b/pypy/module/micronumpy/arrayimpl/concrete.py
--- a/pypy/module/micronumpy/arrayimpl/concrete.py
+++ b/pypy/module/micronumpy/arrayimpl/concrete.py
@@ -424,6 +424,13 @@
         return SliceArray(self.start, new_strides, new_backstrides, new_shape,
                           self, orig_array)
 
+    def readonly(self):
+        return NonWritableSlice(self.start, self.strides, self.backstrides, 
self.shape, self.parent, self.orig_arr, self.dtype)
+
+class NonWritableSlice(SliceArray):
+    def descr_setitem(self, space, orig_array, w_index, w_value):
+        raise OperationError(space.w_ValueError, space.wrap(
+            "Assignment destination is read-only"))
 
 class ArrayBuffer(RWBuffer):
     def __init__(self, impl):
diff --git a/pypy/module/micronumpy/interp_nditer.py 
b/pypy/module/micronumpy/interp_nditer.py
--- a/pypy/module/micronumpy/interp_nditer.py
+++ b/pypy/module/micronumpy/interp_nditer.py
@@ -85,8 +85,7 @@
     return W_NDimArray(res)
 
 def get_readonly_slice(space, array, it):
-    #XXX Not readonly
-    return W_NDimArray(it.getslice())
+    return W_NDimArray(it.getslice().readonly())
 
 def get_readwrite_slice(space, array, it):
     return W_NDimArray(it.getslice())
diff --git a/pypy/module/micronumpy/test/test_nditer.py 
b/pypy/module/micronumpy/test/test_nditer.py
--- a/pypy/module/micronumpy/test/test_nditer.py
+++ b/pypy/module/micronumpy/test/test_nditer.py
@@ -59,6 +59,12 @@
             n += 1
         assert n == 12
         assert (array(r) == [[ 0, 12], [ 4, 16], [ 8, 20], [ 1, 13], [ 5, 17], 
[ 9, 21], [ 2, 14], [ 6, 18], [10, 22], [ 3, 15], [ 7, 19], [11, 23]]).all()
+        e = None
+        try:
+            r[0][0] = 0
+        except ValueError, ex:
+            e = ex
+        assert e
 
     def test_interface(self):
         from numpypy import arange, nditer, zeros
@@ -207,3 +213,4 @@
         assert (it.operands[1] == [[6, 22, 38], [54, 70, 86]]).all()
         assert (it.operands[1] == a.sum(axis=2)).all()
 
+
_______________________________________________
pypy-commit mailing list
[email protected]
http://mail.python.org/mailman/listinfo/pypy-commit

Reply via email to