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