[pypy-svn] pypy fast-forward: Fix (and simplify) slicing in array objects

amauryfa commits-noreply at bitbucket.org
Sun Jan 9 19:11:16 CET 2011


Author: Amaury Forgeot d'Arc <amauryfa at gmail.com>
Branch: fast-forward
Changeset: r40534:c4e426aaebb5
Date: 2011-01-09 19:06 +0100
http://bitbucket.org/pypy/pypy/changeset/c4e426aaebb5/

Log:	Fix (and simplify) slicing in array objects

diff --git a/pypy/module/array/interp_array.py b/pypy/module/array/interp_array.py
--- a/pypy/module/array/interp_array.py
+++ b/pypy/module/array/interp_array.py
@@ -331,24 +331,13 @@
         return self.space.wrap(item)
 
     def getitem__Array_Slice(space, self, w_slice):
-        start, stop, step = space.decode_index(w_slice, self.len)
-        if step < 0:
-            w_lst = array_tolist__Array(space, self)
-            w_lst = space.getitem(w_lst, w_slice)
-            w_a = mytype.w_class(self.space)
-            w_a.fromsequence(w_lst)
-        elif step == 0:
-            raise ValueError('getitem__Array_Slice with step zero')
-        else:
-            size = (stop - start) / step
-            if (stop - start) % step > 0:
-                size += 1
-            w_a = mytype.w_class(self.space)
-            w_a.setlen(size)
-            j = 0
-            for i in range(start, stop, step):
-                w_a.buffer[j] = self.buffer[i]
-                j += 1
+        start, stop, step, size = space.decode_index4(w_slice, self.len)
+        w_a = mytype.w_class(self.space)
+        w_a.setlen(size)
+        j = 0
+        for i in range(start, stop, step):
+            w_a.buffer[j] = self.buffer[i]
+            j += 1
         return w_a
 
     def getslice__Array_ANY_ANY(space, self, w_i, w_j):
@@ -363,18 +352,13 @@
         self.buffer[idx] = item
 
     def setitem__Array_Slice_Array(space, self, w_idx, w_item):
-        start, stop, step = self.space.decode_index(w_idx, self.len)
-        size = (stop - start) / step
-        if (stop - start) % step > 0:
-            size += 1
-        if w_item.len != size or step < 0:
+        start, stop, step, size = self.space.decode_index4(w_idx, self.len)
+        if w_item.len != size:
             w_lst = array_tolist__Array(space, self)
             w_item = space.call_method(w_item, 'tolist')
             space.setitem(w_lst, w_idx, w_item)
             self.setlen(0)
             self.fromsequence(w_lst)
-        elif step == 0:
-            raise ValueError('setitem__Array_Slice with step zero')
         else:
             j = 0
             for i in range(start, stop, step):


More information about the Pypy-commit mailing list