[pypy-commit] pypy default: put getitem/setitem/fill on array, not dtype

bdkearns noreply at buildbot.pypy.org
Fri Nov 15 01:58:38 CET 2013


Author: Brian Kearns <bdkearns at gmail.com>
Branch: 
Changeset: r68125:bdb4b5232832
Date: 2013-11-14 19:44 -0500
http://bitbucket.org/pypy/pypy/changeset/bdb4b5232832/

Log:	put getitem/setitem/fill on array, not dtype

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
@@ -36,10 +36,13 @@
         return backstrides
 
     def getitem(self, index):
-        return self.dtype.getitem(self, index)
+        return self.dtype.itemtype.read(self, index, 0)
+
+    def getitem_bool(self, index):
+        return self.dtype.itemtype.read_bool(self, index, 0)
 
     def setitem(self, index, value):
-        self.dtype.setitem(self, index, value)
+        self.dtype.itemtype.store(self, index, 0, value)
 
     def setslice(self, space, arr):
         impl = arr.implementation
@@ -268,7 +271,7 @@
     def create_dot_iter(self, shape, skip):
         r = calculate_dot_strides(self.get_strides(), self.get_backstrides(),
                                   shape, skip)
-        return iter.MultiDimViewIterator(self, self.dtype, self.start, r[0], r[1], shape)
+        return iter.MultiDimViewIterator(self, self.start, r[0], r[1], shape)
 
     def swapaxes(self, space, orig_arr, axis1, axis2):
         shape = self.get_shape()[:]
@@ -331,21 +334,24 @@
                 support.product(shape) > support.product(self.get_shape()):
             r = calculate_broadcast_strides(self.get_strides(),
                                             self.get_backstrides(),
-                                            self.get_shape(), shape, backward_broadcast)
-            return iter.MultiDimViewIterator(self, self.dtype, self.start, r[0], r[1], shape)
-
+                                            self.get_shape(), shape,
+                                            backward_broadcast)
+            return iter.MultiDimViewIterator(self, self.start,
+                                             r[0], r[1], shape)
         if not require_index:
             return iter.ConcreteArrayIterator(self)
-        else:
-            if len(self.get_shape()) == 1:
-                return iter.OneDimViewIterator(self, self.dtype, self.start,
-                        self.get_strides(), self.get_shape())
-            else:
-                return iter.MultiDimViewIterator(self, self.dtype, self.start,
-                        self.get_strides(), self.get_backstrides(), self.get_shape())
+        if len(self.get_shape()) == 1:
+            return iter.OneDimViewIterator(self, self.start,
+                                           self.get_strides(),
+                                           self.get_shape())
+        return iter.MultiDimViewIterator(self, self.start,
+                                         self.get_strides(),
+                                         self.get_backstrides(),
+                                         self.get_shape())
 
     def fill(self, box):
-        self.dtype.fill(self.storage, box, 0, self.size)
+        self.dtype.itemtype.fill(self.storage, self.dtype.get_size(),
+                                 box, 0, self.size, 0)
 
     def set_shape(self, space, orig_array, new_shape):
         strides, backstrides = support.calc_strides(new_shape, self.dtype,
@@ -416,14 +422,16 @@
                                             self.get_backstrides(),
                                             self.get_shape(), shape,
                                             backward_broadcast)
-            return iter.MultiDimViewIterator(self.parent, self.dtype,
-                                             self.start, r[0], r[1], shape)
+            return iter.MultiDimViewIterator(self, self.start,
+                                             r[0], r[1], shape)
         if len(self.get_shape()) == 1:
-            return iter.OneDimViewIterator(self.parent, self.dtype, self.start,
-                    self.get_strides(), self.get_shape())
-        return iter.MultiDimViewIterator(self.parent, self.dtype, self.start,
-                                    self.get_strides(),
-                                    self.get_backstrides(), self.get_shape())
+            return iter.OneDimViewIterator(self, self.start,
+                                           self.get_strides(),
+                                           self.get_shape())
+        return iter.MultiDimViewIterator(self, self.start,
+                                         self.get_strides(),
+                                         self.get_backstrides(),
+                                         self.get_shape())
 
     def set_shape(self, space, orig_array, new_shape):
         if len(self.get_shape()) < 2 or self.size == 0:
diff --git a/pypy/module/micronumpy/interp_dtype.py b/pypy/module/micronumpy/interp_dtype.py
--- a/pypy/module/micronumpy/interp_dtype.py
+++ b/pypy/module/micronumpy/interp_dtype.py
@@ -81,19 +81,6 @@
     def coerce(self, space, w_item):
         return self.itemtype.coerce(space, self, w_item)
 
-    def getitem(self, arr, i):
-        item = self.itemtype.read(arr, i, 0)
-        return item
-
-    def getitem_bool(self, arr, i):
-        return self.itemtype.read_bool(arr, i, 0)
-
-    def setitem(self, arr, i, box):
-        self.itemtype.store(arr, i, 0, box)
-
-    def fill(self, storage, box, start, stop):
-        self.itemtype.fill(storage, self.get_size(), box, start, stop, 0)
-
     def is_int_type(self):
         return (self.kind == NPY_SIGNEDLTR or self.kind == NPY_UNSIGNEDLTR or
                 self.kind == NPY_GENBOOLLTR)
diff --git a/pypy/module/micronumpy/iter.py b/pypy/module/micronumpy/iter.py
--- a/pypy/module/micronumpy/iter.py
+++ b/pypy/module/micronumpy/iter.py
@@ -159,23 +159,21 @@
         return [space.wrap(self.indexes[i]) for i in range(shapelen)]
 
 class ConcreteArrayIterator(base.BaseArrayIterator):
-    _immutable_fields_ = ['dtype', 'skip', 'size']
+    _immutable_fields_ = ['array', 'skip', 'size']
     def __init__(self, array):
         self.array = array
         self.offset = 0
-        self.dtype = array.dtype
-        self.skip = self.dtype.get_size()
+        self.skip = array.dtype.get_size()
         self.size = array.size
 
     def setitem(self, elem):
-        self.dtype.setitem(self.array, self.offset, elem)
+        self.array.setitem(self.offset, elem)
 
     def getitem(self):
-        item = self.dtype.getitem(self.array, self.offset)
-        return item
+        return self.array.getitem(self.offset)
 
     def getitem_bool(self):
-        return self.dtype.getitem_bool(self.array, self.offset)
+        return self.array.getitem_bool(self.offset)
 
     def next(self):
         self.offset += self.skip
@@ -190,12 +188,8 @@
         self.offset %= self.size
 
 class OneDimViewIterator(ConcreteArrayIterator):
-    ''' The view iterator dtype can be different from the
-    array.dtype, this is what makes it a View
-    '''
-    def __init__(self, array, dtype, start, strides, shape):
+    def __init__(self, array, start, strides, shape):
         self.array = array
-        self.dtype = dtype
         self.offset = start
         self.skip = strides[0]
         self.index = 0
@@ -219,13 +213,9 @@
         return self.index
 
 class MultiDimViewIterator(ConcreteArrayIterator):
-    ''' The view iterator dtype can be different from the
-    array.dtype, this is what makes it a View
-    '''
-    def __init__(self, array, dtype, start, strides, backstrides, shape):
+    def __init__(self, array, start, strides, backstrides, shape):
         self.indexes = [0] * len(shape)
         self.array = array
-        self.dtype = dtype
         self.shape = shape
         self.offset = start
         self.shapelen = len(shape)
@@ -295,14 +285,12 @@
         self.offset = array.start
         self.dim = dim
         self.array = array
-        self.dtype = array.dtype
 
     def setitem(self, elem):
-        self.dtype.setitem(self.array, self.offset, elem)
+        self.array.setitem(self.offset, elem)
 
     def getitem(self):
-        item = self.dtype.getitem(self.array, self.offset)
-        return item
+        return self.array.getitem(self.offset)
 
     @jit.unroll_safe
     def next(self):
diff --git a/pypy/module/micronumpy/test/test_iter.py b/pypy/module/micronumpy/test/test_iter.py
--- a/pypy/module/micronumpy/test/test_iter.py
+++ b/pypy/module/micronumpy/test/test_iter.py
@@ -13,7 +13,7 @@
         strides = [5, 1]
         backstrides = [x * (y - 1) for x,y in zip(strides, shape)]
         assert backstrides == [10, 4]
-        i = MultiDimViewIterator(MockArray, None, start, strides, backstrides, shape)
+        i = MultiDimViewIterator(MockArray, start, strides, backstrides, shape)
         i.next()
         i.next()
         i.next()
@@ -31,7 +31,7 @@
         strides = [1, 3]
         backstrides = [x * (y - 1) for x,y in zip(strides, shape)]
         assert backstrides == [2, 12]
-        i = MultiDimViewIterator(MockArray, None, start, strides, backstrides, shape)
+        i = MultiDimViewIterator(MockArray, start, strides, backstrides, shape)
         i.next()
         i.next()
         i.next()
@@ -52,7 +52,7 @@
         strides = [5, 1]
         backstrides = [x * (y - 1) for x,y in zip(strides, shape)]
         assert backstrides == [10, 4]
-        i = MultiDimViewIterator(MockArray, None, start, strides, backstrides, shape)
+        i = MultiDimViewIterator(MockArray, start, strides, backstrides, shape)
         i.next_skip_x(2)
         i.next_skip_x(2)
         i.next_skip_x(2)
@@ -75,7 +75,7 @@
         strides = [1, 3]
         backstrides = [x * (y - 1) for x,y in zip(strides, shape)]
         assert backstrides == [2, 12]
-        i = MultiDimViewIterator(MockArray, None, start, strides, backstrides, shape)
+        i = MultiDimViewIterator(MockArray, start, strides, backstrides, shape)
         i.next_skip_x(2)
         i.next_skip_x(2)
         i.next_skip_x(2)


More information about the pypy-commit mailing list