[pypy-commit] pypy default: numpy: receiving slice object as argument of descr_getitem

snus_mumrik noreply at buildbot.pypy.org
Mon Jun 13 09:44:18 CEST 2011


Author: Ilya Osadchiy <osadchiy.ilya at gmail.com>
Branch: 
Changeset: r44894:cfbf3985a1f6
Date: 2011-05-31 22:15 +0300
http://bitbucket.org/pypy/pypy/changeset/cfbf3985a1f6/

Log:	numpy: receiving slice object as argument of descr_getitem

diff --git a/pypy/module/micronumpy/interp_numarray.py b/pypy/module/micronumpy/interp_numarray.py
--- a/pypy/module/micronumpy/interp_numarray.py
+++ b/pypy/module/micronumpy/interp_numarray.py
@@ -83,20 +83,30 @@
     def descr_len(self, space):
         return self.get_concrete().descr_len(space)
 
-    @unwrap_spec(item=int)
-    def descr_getitem(self, space, item):
-        return self.get_concrete().descr_getitem(space, item)
+#    unwrap_spec(item=int)
+    def descr_getitem(self, space, w_idx):
+        # TODO: indexation by tuples
+        start, stop, step, slice_length = space.decode_index4(w_idx, self.find_size())
+        if step == 0:
+            # Single index
+            return space.wrap(self.get_concrete().getitem(start))
+        else:
+            # Slice
+            signature = Signature()
+            res = SingleDimSlice(start, stop, step, slice_length, self, self.signature.transition(signature))
+            return space.wrap(res)
+            
 
     @unwrap_spec(item=int, value=float)
     def descr_setitem(self, space, item, value):
         self.invalidated()
         return self.get_concrete().descr_setitem(space, item, value)
 
-    @unwrap_spec(sta=int, sto=int)
-    def descr_getslice(self, space, sta, sto):
-        signature = Signature()
-        res = SingleDimSlice(sta, sto, self, self.signature.transition(signature))
-        return res
+#    @unwrap_spec(sta=int, sto=int)
+#    def descr_getslice(self, space, sta, sto):
+#        signature = Signature()
+#        res = SingleDimSlice(sta, sto, self, self.signature.transition(signature))
+#        return res
 
 class FloatWrapper(BaseArray):
     """
@@ -203,32 +213,32 @@
     def eval(self, i):
         return self.parent.eval(self.calc_index(i))
 
-    @unwrap_spec(item=int)
-    def descr_getitem(self, space, item):
-        return self.parent.descr_getitem(space, self.calc_index(item))
+#    @unwrap_spec(item=int)
+    def getitem(self, item):
+        return self.parent.getitem(self.calc_index(item))
 
     @unwrap_spec(item=int, value=float)
     def descr_setitem(self, space, item, value):
         return self.parent.descr_setitem(space, self.calc_index(item), value)
+
+    def descr_len(self, space):
+        return space.wrap(self.find_size())
         
 #    def calc_index(self, item):
 #        raise NotImplementedError
 
 class SingleDimSlice(ViewArray):
-    _immutable_fields_ = ["start", "stop", "step"]
+    _immutable_fields_ = ["start", "stop", "step", "size"]
 
-    def __init__(self, start, stop, parent, signature):
+    def __init__(self, start, stop, step, slice_length, parent, signature):
         ViewArray.__init__(self, parent, signature)
-        self.start = start #sl.start
-        l = parent.find_size()
-        if stop > l:
-            self.stop = l
-        else:
-            self.stop = stop #sl.stop
-        self.step = 1 #sl.step
+        self.start = start
+        self.stop = stop
+        self.step = step
+        self.size = slice_length
 
     def find_size(self):
-        return (self.stop - self.start) # FIXME divide by step
+        return self.size
 
     def calc_index(self, item):
         return (self.start + item * self.step)
@@ -267,10 +277,10 @@
     def descr_len(self, space):
         return space.wrap(self.size)
 
-    @unwrap_spec(item=int)
-    def descr_getitem(self, space, item):
-        item = self.getindex(space, item)
-        return space.wrap(self.storage[item])
+#    @unwrap_spec(item=int)
+    def getitem(self, item):
+#FIXME        item = self.getindex(space, item)
+        return self.storage[item]
 
     @unwrap_spec(item=int, value=float)
     def descr_setitem(self, space, item, value):
@@ -301,7 +311,7 @@
     __len__ = interp2app(BaseArray.descr_len),
     __getitem__ = interp2app(BaseArray.descr_getitem),
     __setitem__ = interp2app(BaseArray.descr_setitem),
-    __getslice__ = interp2app(BaseArray.descr_getslice),
+#    __getslice__ = interp2app(BaseArray.descr_getslice),
 
     __add__ = interp2app(BaseArray.descr_add),
     __sub__ = interp2app(BaseArray.descr_sub),


More information about the pypy-commit mailing list