[pypy-commit] pypy PyBuffer: Kill copies of buffer attributes on W_MemoryObject

rlamy pypy.commits at gmail.com
Tue Mar 28 11:21:31 EDT 2017


Author: Ronan Lamy <ronan.lamy at gmail.com>
Branch: PyBuffer
Changeset: r90844:74d97901f74e
Date: 2017-03-28 16:20 +0100
http://bitbucket.org/pypy/pypy/changeset/74d97901f74e/

Log:	Kill copies of buffer attributes on W_MemoryObject

diff --git a/pypy/module/cpyext/memoryobject.py b/pypy/module/cpyext/memoryobject.py
--- a/pypy/module/cpyext/memoryobject.py
+++ b/pypy/module/cpyext/memoryobject.py
@@ -84,7 +84,7 @@
     # Allow subclassing W_MemeoryView
     w_type = from_ref(space, rffi.cast(PyObject, obj.c_ob_type))
     w_obj = space.allocate_instance(W_MemoryView, w_type)
-    w_obj.__init__(buf, itemsize=buf.itemsize)
+    w_obj.__init__(buf)
     track_reference(space, obj, w_obj)
     return w_obj
 
diff --git a/pypy/objspace/std/memoryobject.py b/pypy/objspace/std/memoryobject.py
--- a/pypy/objspace/std/memoryobject.py
+++ b/pypy/objspace/std/memoryobject.py
@@ -28,51 +28,27 @@
     an interp-level buffer.
     """
 
-    def __init__(self, buf, format=None, itemsize=1, ndim=-1,
-                 shape=None, strides=None, suboffsets=None):
+    def __init__(self, buf):
         assert isinstance(buf, Buffer)
         self.buf = buf
         self._hash = -1
-        # private copies of format, shape, itemsize, ... on this class
-        self.format = format
-        self.itemsize = itemsize
-        self.shape = shape
-        self.strides = strides
-        self.suboffsets = suboffsets
-        self.ndim = ndim
         self.flags = 0
-        self.length = -1
         self._init_flags()
 
-    # several fields are "overwritten" by the memory view (shape, strides, ...)
-    # thus use only those getter fields instead of directly accessing the fields
     def getndim(self):
-        if self.ndim == -1:
-            return self.buf.getndim()
-        return self.ndim
+        return self.buf.getndim()
 
     def getshape(self):
-        if self.shape is None:
-            return self.buf.getshape()
-        return self.shape
+        return self.buf.getshape()
 
     def getstrides(self):
-        if self.strides is None:
-            return self.buf.getstrides()
-        return self.strides
+        return self.buf.getstrides()
 
     def getitemsize(self):
-        return self.itemsize
+        return self.buf.getitemsize()
 
-    # memoryview needs to modify the field 'format', to prevent the modification
-    # of the buffer, we save the new format here!
     def getformat(self):
-        if self.format is None:
-            return self.buf.getformat()
-        return self.format
-
-    def setformat(self, value):
-        self.format = value
+        return self.buf.getformat()
 
     def buffer_w(self, space, flags):
         self._check_released(space)
@@ -85,7 +61,7 @@
             w_object._check_released(space)
             return W_MemoryView.copy(w_object)
         buf = space.buffer_w(w_object, space.BUF_FULL_RO)
-        return W_MemoryView(buf, buf.getformat(), buf.getitemsize())
+        return W_MemoryView(buf)
 
     def _make_descr__cmp(name):
         def descr__cmp(self, space, w_other):
@@ -154,8 +130,6 @@
                 break
 
     def getlength(self):
-        if self.length != -1:
-            return self.length
         return self.buf.getlength()
 
     def descr_tobytes(self, space):
@@ -297,7 +271,7 @@
                     buf = SubBuffer(self.buf, idx, itemsize)
                     fmtiter = UnpackFormatIterator(space, buf)
                     fmtiter.length = buf.getlength()
-                    fmtiter.interpret(self.format)
+                    fmtiter.interpret(self.buf.getformat())
                     return fmtiter.result_w[0]
             else:
                 raise oefmt(space.w_NotImplementedError, "multi-dimensional sub-views are not implemented")
@@ -309,7 +283,7 @@
 
     def new_slice(self, start, stop, step, slicelength, dim):
         sliced = BufferSlice(self.buf, start, step, slicelength)
-        return W_MemoryView(sliced, sliced.getformat(), sliced.getitemsize())
+        return W_MemoryView(sliced)
 
     def init_len(self):
         self.length = self.bytecount_from_shape()
@@ -326,8 +300,7 @@
     def copy(view):
         # TODO suboffsets
         buf = view.buf
-        return W_MemoryView(buf, view.getformat(), view.getitemsize(),
-                            view.getndim(), view.getshape()[:], view.getstrides()[:])
+        return W_MemoryView(buf)
 
     def descr_setitem(self, space, w_index, w_obj):
         self._check_released(space)
@@ -350,11 +323,11 @@
                 # TODO: this probably isn't very fast
                 fmtiter = PackFormatIterator(space, [w_obj], itemsize)
                 try:
-                    fmtiter.interpret(self.format)
+                    fmtiter.interpret(self.getformat())
                 except StructError as e:
                     raise oefmt(space.w_TypeError,
                                 "memoryview: invalid type for format '%s'",
-                                self.format)
+                                self.getformat())
                 self.buf.setslice(idx, fmtiter.result.build())
         elif step == 1:
             value = space.buffer_w(w_obj, space.BUF_CONTIG_RO)
@@ -551,7 +524,7 @@
             fview = space.fixedview(w_shape)
             shape = [space.int_w(w_obj) for w_obj in fview]
             newbuf = self._cast_to_ND(space, newbuf, shape, ndim)
-        mv = W_MemoryView(newbuf, newbuf.getformat(), newbuf.getitemsize())
+        mv = W_MemoryView(newbuf)
         return mv
 
     def _init_flags(self):
@@ -577,10 +550,9 @@
                                       itemsize, 'F'):
                 flags |= MEMORYVIEW_FORTRAN
 
-        if self.suboffsets:
+        if False:  # TODO missing suboffsets
             flags |= MEMORYVIEW_PIL
             flags &= ~(MEMORYVIEW_C|MEMORYVIEW_FORTRAN)
-        # TODO missing suboffsets
 
         self.flags = flags
 
diff --git a/pypy/objspace/std/objspace.py b/pypy/objspace/std/objspace.py
--- a/pypy/objspace/std/objspace.py
+++ b/pypy/objspace/std/objspace.py
@@ -361,7 +361,7 @@
         return W_SeqIterObject(w_obj)
 
     def newbuffer(self, w_obj, itemsize=1):
-        return W_MemoryView(w_obj, itemsize=itemsize)
+        return W_MemoryView(w_obj)
 
     def newbytes(self, s):
         assert isinstance(s, str)


More information about the pypy-commit mailing list