[pypy-commit] pypy refactor-signature: Refactoring in progress - code removal.

fijal noreply at buildbot.pypy.org
Sat Dec 17 15:27:32 CET 2011


Author: Maciej Fijalkowski <fijall at gmail.com>
Branch: refactor-signature
Changeset: r50616:2e85e96a3a5b
Date: 2011-12-17 16:26 +0200
http://bitbucket.org/pypy/pypy/changeset/2e85e96a3a5b/

Log:	Refactoring in progress - code removal.

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
@@ -633,8 +633,8 @@
             shape += concr.shape[s:]
             strides += concr.strides[s:]
             backstrides += concr.backstrides[s:]
-        return W_NDimSlice(concr, start, strides[:], backstrides[:],
-                           shape[:])
+        return W_NDimSlice(start, strides[:], backstrides[:],
+                           shape[:], concr)
 
     def descr_reshape(self, space, args_w):
         """reshape(...)
@@ -664,8 +664,8 @@
             new_backstrides = [0] * ndims
             for nd in range(ndims):
                 new_backstrides[nd] = (new_shape[nd] - 1) * new_strides[nd]
-            arr = W_NDimSlice(self, self.start, new_strides,
-                              new_backstrides, new_shape)
+            arr = W_NDimSlice(self.start, new_strides, new_backstrides,
+                              new_shape, self)
         else:
             # Create copy with contiguous data
             arr = concrete.copy()
@@ -696,8 +696,8 @@
             strides.append(concrete.strides[i])
             backstrides.append(concrete.backstrides[i])
             shape.append(concrete.shape[i])
-        return space.wrap(W_NDimSlice(concrete, self.start, strides[:],
-                                      backstrides[:], shape[:]))
+        return space.wrap(W_NDimSlice(self.start, strides[:],
+                                      backstrides[:], shape[:], concrete))
 
     def descr_get_flatiter(self, space):
         return space.wrap(W_FlatIterator(self))
@@ -875,11 +875,39 @@
 class ConcreteArray(BaseArray):
     """ An array that have actual storage, whether owned or not
     """
-    def __init__(self, shape, order):
+    def __init__(self, size, shape, dtype, order='C', parent=None):
+        self.size = size
+        self.parent = parent
+        if parent is not None:
+            self.storage = parent.storage
+        else:
+            self.storage = dtype.malloc(size)
         self.order = order
+        self.dtype = dtype
         if self.strides is None:
             self.calc_strides(shape)
         BaseArray.__init__(self, shape)
+        if parent is not None:
+            self.invalidates = parent.invalidates
+
+    def get_concrete(self):
+        return self
+
+    def find_size(self):
+        return self.size
+
+    def find_dtype(self):
+        return self.dtype
+
+    def getitem(self, item):
+        return self.dtype.getitem(self.storage, item)
+
+    def setitem_w(self, space, item, w_value):
+        return self.setitem(item, self.dtype.coerce(space, w_value))
+
+    def setitem(self, item, value):
+        self.invalidated()
+        self.dtype.setitem(self.storage, item, value)
 
     def calc_strides(self, shape):
         strides = []
@@ -898,41 +926,51 @@
         self.strides = strides[:]
         self.backstrides = backstrides[:]
 
-
-class ConcreteViewArray(ConcreteArray):
-    """
-    Class for representing views of arrays, they will reflect changes of parent
-    arrays. Example: slices
-    """
-    def __init__(self, parent, strides, backstrides, shape):
+class W_NDimSlice(ConcreteArray):
+    def __init__(self, start, strides, backstrides, shape, parent):
+        if isinstance(parent, W_NDimSlice):
+            parent = parent.parent
+        size = 1
+        for sh in shape:
+            size *= sh
         self.strides = strides
         self.backstrides = backstrides
-        ConcreteArray.__init__(self, shape, parent.order)
-        assert isinstance(parent, W_NDimArray)
-        self.parent = parent
-        self.invalidates = parent.invalidates
+        ConcreteArray.__init__(self, size, shape, parent.dtype, parent.order,
+                               parent)
+        self.start = start
 
-    def get_concrete(self):
-        # in fact, ConcreteViewArray never gets "concrete" as it never
-        # stores data.
-        # This implementation is needed for BaseArray getitem/setitem to work,
-        # can be refactored.
-        self.parent.get_concrete()
-        return self
+    def setslice(self, space, w_value):
+        res_shape = shape_agreement(space, self.shape, w_value.shape)
+        self._sliceloop(w_value, res_shape)
 
-    def getitem(self, item):
-        return self.parent.getitem(item)
+    def _sliceloop(self, source, res_shape):
+        sig = source.find_sig()
+        frame = sig.create_frame(source)
+        res_iter = ViewIterator(self)
+        shapelen = len(res_shape)
+        while not res_iter.done():
+            slice_driver.jit_merge_point(sig=sig,
+                                         frame=frame,
+                                         shapelen=shapelen,
+                                         self=self, source=source,
+                                         res_iter=res_iter)
+            self.setitem(res_iter.offset, sig.eval(frame, source).convert_to(
+                self.find_dtype()))
+            frame.next(shapelen)
+            res_iter = res_iter.next(shapelen)
 
-    def eval(self, iter):
-        return self.parent.getitem(iter.get_offset())
+    def copy(self):
+        array = W_NDimArray(self.size, self.shape[:], self.find_dtype())
+        iter = ViewIterator(self)
+        a_iter = ArrayIterator(array.size)
+        while not iter.done():
+            array.setitem(a_iter.offset, self.getitem(iter.offset))
+            iter = iter.next(len(self.shape))
+            a_iter = a_iter.next(len(array.shape))
+        return array
 
-    @unwrap_spec(item=int)
-    def setitem_w(self, space, item, w_value):
-        return self.parent.setitem_w(space, item, w_value)
-
-    def setitem(self, item, value):
-        # This is currently not possible to be called from anywhere.
-        raise NotImplementedError
+    def create_sig(self):
+        return signature.ViewSignature(self.parent.create_sig())
 
     def setshape(self, space, new_shape):
         if len(self.shape) < 1:
@@ -968,85 +1006,11 @@
         self.backstrides = new_backstrides[:]
         self.shape = new_shape[:]
 
-class W_NDimSlice(ConcreteViewArray):
-    def __init__(self, parent, start, strides, backstrides, shape):
-        if isinstance(parent, W_NDimSlice):
-            parent = parent.parent
-        else:
-            # XXX this should not force the array, but it did before the
-            #     refactoring anyway, just in a more obscure way
-            parent = parent.get_concrete()
-        ConcreteViewArray.__init__(self, parent, strides, backstrides, shape)
-        self.start = start
-        self.size = 1
-        for sh in shape:
-            self.size *= sh
-
-    def find_size(self):
-        return self.size
-
-    def find_dtype(self):
-        return self.parent.find_dtype()
-
-    def setslice(self, space, w_value):
-        res_shape = shape_agreement(space, self.shape, w_value.shape)
-        self._sliceloop(w_value, res_shape)
-
-    def _sliceloop(self, source, res_shape):
-        sig = source.find_sig()
-        frame = sig.create_frame(source)
-        res_iter = ViewIterator(self)
-        shapelen = len(res_shape)
-        while not res_iter.done():
-            slice_driver.jit_merge_point(sig=sig,
-                                         frame=frame,
-                                         shapelen=shapelen,
-                                         self=self, source=source,
-                                         res_iter=res_iter)
-            self.setitem(res_iter.offset, sig.eval(frame, source).convert_to(
-                self.find_dtype()))
-            frame.next(shapelen)
-            res_iter = res_iter.next(shapelen)
-
-    def setitem(self, item, value):
-        self.parent.setitem(item, value)
-
-    def copy(self):
-        array = W_NDimArray(self.size, self.shape[:], self.find_dtype())
-        iter = ViewIterator(self)
-        a_iter = ArrayIterator(array.size)
-        while not iter.done():
-            array.setitem(a_iter.offset, self.getitem(iter.offset))
-            iter = iter.next(len(self.shape))
-            a_iter = a_iter.next(len(array.shape))
-        return array
-
-    def create_sig(self):
-        return signature.ViewSignature(self.parent.create_sig())
-
 class W_NDimArray(ConcreteArray):
     """ A class representing contiguous array. We know that each iteration
     by say ufunc will increase the data index by one
     """
     _immutable_fields_ = ['storage']
-    
-    def __init__(self, size, shape, dtype, order='C'):
-        ConcreteArray.__init__(self, shape, order)
-        self.size = size
-        self.dtype = dtype
-        self.storage = dtype.malloc(size)
-
-    def get_concrete(self):
-        return self
-
-    def find_size(self):
-        return self.size
-
-    def find_dtype(self):
-        return self.dtype
-
-    def getitem(self, item):
-        return self.dtype.getitem(self.storage, item)
 
     def copy(self):
         array = W_NDimArray(self.size, self.shape[:], self.dtype, self.order)
@@ -1057,13 +1021,6 @@
         )
         return array
 
-    def setitem_w(self, space, item, w_value):
-        return self.setitem(item, self.dtype.coerce(space, w_value))
-
-    def setitem(self, item, value):
-        self.invalidated()
-        self.dtype.setitem(self.storage, item, value)
-
     def setshape(self, space, new_shape):
         self.shape = new_shape
         self.calc_strides(new_shape)
@@ -1216,15 +1173,15 @@
 )
 
 
-class W_FlatIterator(ConcreteViewArray):
+class W_FlatIterator(ConcreteArray):
 
     @jit.unroll_safe
     def __init__(self, arr):
         size = 1
         for sh in arr.shape:
             size *= sh
-        ConcreteViewArray.__init__(self, arr.get_concrete(), [arr.strides[-1]],
-                                   [arr.backstrides[-1]], [size])
+        ConcreteArray.__init__(self, arr.get_concrete(), [arr.strides[-1]],
+                               [arr.backstrides[-1]], [size])
         self.shapelen = len(arr.shape)
         self.arr = arr
         self.iter = OneDimIterator(self.arr.start, self.strides[0],
diff --git a/pypy/module/micronumpy/signature.py b/pypy/module/micronumpy/signature.py
--- a/pypy/module/micronumpy/signature.py
+++ b/pypy/module/micronumpy/signature.py
@@ -132,21 +132,21 @@
         return 'Array'
 
     def _invent_array_numbering(self, arr, cache):
-        from pypy.module.micronumpy.interp_numarray import W_NDimArray
-        assert isinstance(arr, W_NDimArray)
+        from pypy.module.micronumpy.interp_numarray import ConcreteArray
+        assert isinstance(arr, ConcreteArray)
         self.array_no = _add_ptr_to_cache(arr.storage, cache)
 
     def _create_iter(self, iterlist, arraylist, arr):
-        from pypy.module.micronumpy.interp_numarray import W_NDimArray
-        assert isinstance(arr, W_NDimArray)
+        from pypy.module.micronumpy.interp_numarray import ConcreteArray
+        assert isinstance(arr, ConcreteArray)
         if self.iter_no >= len(iterlist):
             iterlist.append(ArrayIterator(arr.size))
         if self.array_no >= len(arraylist):
             arraylist.append(arr.storage)
 
     def eval(self, frame, arr):
-        from pypy.module.micronumpy.interp_numarray import W_NDimArray
-        assert isinstance(arr, W_NDimArray)
+        from pypy.module.micronumpy.interp_numarray import ConcreteArray
+        assert isinstance(arr, ConcreteArray)
         iter = frame.iterators[self.iter_no]
         return self.dtype.getitem(frame.arrays[self.array_no], iter.offset)
 
@@ -193,21 +193,7 @@
         assert isinstance(arr, Scalar)
         return arr.value
 
-class ViewSignature(Signature):
-    _immutable_fields_ = ['child']
-
-    def __init__(self, child):
-        self.child = child
-    
-    def eq(self, other, compare_array_no=True):
-        if type(self) is not type(other):
-            return False
-        assert isinstance(other, ViewSignature)
-        return self.child.eq(other.child, compare_array_no)
-
-    def hash(self):
-        return self.child.hash() ^ 0x12345
-
+class ViewSignature(ArraySignature):
     def debug_repr(self):
         return 'Slice(%s)' % self.child.debug_repr()
 
@@ -217,28 +203,6 @@
         allnumbers.append(no)
         self.iter_no = no
 
-    def _invent_array_numbering(self, arr, cache):
-        from pypy.module.micronumpy.interp_numarray import ConcreteViewArray
-        assert isinstance(arr, ConcreteViewArray)
-        self.array_no = _add_ptr_to_cache(arr.parent.storage, cache)
-
-    def _create_iter(self, iterlist, arraylist, arr):
-        from pypy.module.micronumpy.interp_numarray import ConcreteViewArray
-
-        assert isinstance(arr, ConcreteViewArray)
-        if self.iter_no >= len(iterlist):
-            iterlist.append(ViewIterator(arr))
-        if self.array_no >= len(arraylist):
-            arraylist.append(arr.parent.storage)
-
-    def eval(self, frame, arr):
-        from pypy.module.micronumpy.interp_numarray import W_NDimSlice
-        assert isinstance(arr, W_NDimSlice)
-        arr = arr.get_concrete()
-        iter = frame.iterators[self.iter_no]
-        return arr.find_dtype().getitem(frame.arrays[self.array_no],
-                                        iter.offset)
-
 class FlatiterSignature(ViewSignature):
     def debug_repr(self):
         return 'FlatIter(%s)' % self.child.debug_repr()


More information about the pypy-commit mailing list