Author: Manuel Jacob
Branch: py3k-memoryview
Changeset: r71691:8aef32a90ec4
Date: 2014-05-24 08:32 +0200
http://bitbucket.org/pypy/pypy/changeset/8aef32a90ec4/

Log:    Make format and itemsize attributes of W_MemoryView instead of
        Buffer. They are exported by returning a tuple from buffer_w().

diff --git a/pypy/interpreter/baseobjspace.py b/pypy/interpreter/baseobjspace.py
--- a/pypy/interpreter/baseobjspace.py
+++ b/pypy/interpreter/baseobjspace.py
@@ -1350,7 +1350,7 @@
     def readbuf_w(self, w_obj):
         # Old buffer interface, returns a readonly buffer 
(PyObject_AsReadBuffer)
         try:
-            return w_obj.buffer_w(self, self.BUF_SIMPLE)
+            return w_obj.buffer_w(self, self.BUF_SIMPLE)[0]
         except TypeError:
             raise oefmt(self.w_TypeError,
                         "expected an object with a buffer interface")
@@ -1358,7 +1358,7 @@
     def writebuf_w(self, w_obj):
         # Old buffer interface, returns a writeable buffer 
(PyObject_AsWriteBuffer)
         try:
-            return w_obj.buffer_w(self, self.BUF_WRITABLE)
+            return w_obj.buffer_w(self, self.BUF_WRITABLE)[0]
         except TypeError:
             raise oefmt(self.w_TypeError,
                         "expected an object with a writable buffer interface")
@@ -1366,7 +1366,7 @@
     def charbuf_w(self, w_obj):
         # Old buffer interface, returns a character buffer 
(PyObject_AsCharBuffer)
         try:
-            buf = w_obj.buffer_w(self, self.BUF_SIMPLE)
+            buf = w_obj.buffer_w(self, self.BUF_SIMPLE)[0]
         except TypeError:
             raise oefmt(self.w_TypeError,
                         "expected an object with a buffer interface")
@@ -1392,7 +1392,7 @@
             if self.isinstance_w(w_obj, self.w_unicode):
                 return StringBuffer(w_obj.identifier_w(self))
             try:
-                return w_obj.buffer_w(self, self.BUF_SIMPLE)
+                return w_obj.buffer_w(self, self.BUF_SIMPLE)[0]
             except TypeError:
                 self._getarg_error("bytes or buffer", w_obj)
         elif code == 's#':
@@ -1401,13 +1401,13 @@
             if self.isinstance_w(w_obj, self.w_unicode):
                 return w_obj.identifier_w(self)
             try:
-                return w_obj.buffer_w(self, self.BUF_SIMPLE).as_str()
+                return w_obj.buffer_w(self, self.BUF_SIMPLE)[0].as_str()
             except TypeError:
                 self._getarg_error("bytes or read-only buffer", w_obj)
         elif code == 'w*':
             try:
                 try:
-                    return w_obj.buffer_w(self, self.BUF_WRITABLE)
+                    return w_obj.buffer_w(self, self.BUF_WRITABLE)[0]
                 except OperationError:
                     pass
             except TypeError:
@@ -1415,7 +1415,7 @@
             self._getarg_error("read-write buffer", w_obj)
         elif code == 'y*':
             try:
-                return w_obj.buffer_w(self, self.BUF_SIMPLE)
+                return w_obj.buffer_w(self, self.BUF_SIMPLE)[0]
             except TypeError:
                 self._getarg_error("bytes or buffer", w_obj)
         else:
@@ -1437,7 +1437,7 @@
             if not e.match(self, self.w_TypeError):
                 raise
         try:
-            buf = w_obj.buffer_w(self, 0)
+            buf = w_obj.buffer_w(self, 0)[0]
         except TypeError:
             raise oefmt(self.w_TypeError,
                         "'%T' does not support the buffer interface", w_obj)
diff --git a/pypy/interpreter/pyopcode.py b/pypy/interpreter/pyopcode.py
--- a/pypy/interpreter/pyopcode.py
+++ b/pypy/interpreter/pyopcode.py
@@ -1559,7 +1559,7 @@
         source = space.bytes_w(w_source)
     else:
         try:
-            buf = space.buffer_w(w_source, space.BUF_SIMPLE)
+            buf = space.buffer_w(w_source, space.BUF_SIMPLE)[0]
         except OperationError as e:
             if not e.match(space, space.w_TypeError):
                 raise
diff --git a/pypy/module/__pypy__/bytebuffer.py 
b/pypy/module/__pypy__/bytebuffer.py
--- a/pypy/module/__pypy__/bytebuffer.py
+++ b/pypy/module/__pypy__/bytebuffer.py
@@ -12,8 +12,6 @@
     def __init__(self, len):
         self.data = ['\x00'] * len
         self.readonly = False
-        self.format = 'B'
-        self.itemsize = 1
 
     def getlength(self):
         return len(self.data)
diff --git a/pypy/module/_cffi_backend/cbuffer.py 
b/pypy/module/_cffi_backend/cbuffer.py
--- a/pypy/module/_cffi_backend/cbuffer.py
+++ b/pypy/module/_cffi_backend/cbuffer.py
@@ -17,8 +17,6 @@
         self.raw_cdata = raw_cdata
         self.size = size
         self.readonly = False
-        self.format = 'B'
-        self.itemsize = 1
 
     def getlength(self):
         return self.size
@@ -48,7 +46,7 @@
         self.keepalive = keepalive
 
     def buffer_w(self, space, flags):
-        return self.buffer
+        return self.buffer, 'B', 1
 
     def descr_len(self, space):
         return space.wrap(self.buffer.getlength())
@@ -66,7 +64,7 @@
                                                       self.buffer.getlength())
         if step not in (0, 1):
             raise oefmt(space.w_NotImplementedError, "")
-        value = space.buffer_w(w_newstring, space.BUF_CONTIG_RO)
+        value = space.buffer_w(w_newstring, space.BUF_CONTIG_RO)[0]
         if value.getlength() != size:
             raise oefmt(space.w_ValueError,
                         "cannot modify size of memoryview object")
diff --git a/pypy/module/_io/interp_bufferedio.py 
b/pypy/module/_io/interp_bufferedio.py
--- a/pypy/module/_io/interp_bufferedio.py
+++ b/pypy/module/_io/interp_bufferedio.py
@@ -114,8 +114,6 @@
         self.start = start
         self.length = length
         self.readonly = False
-        self.format = 'B'
-        self.itemsize = 1
 
     def getlength(self):
         return self.length
diff --git a/pypy/module/_io/interp_bytesio.py 
b/pypy/module/_io/interp_bytesio.py
--- a/pypy/module/_io/interp_bytesio.py
+++ b/pypy/module/_io/interp_bytesio.py
@@ -17,8 +17,6 @@
     def __init__(self, w_bytesio):
         self.w_bytesio = w_bytesio
         self.readonly = False
-        self.format = 'B'
-        self.itemsize = 1
 
     def getlength(self):
         return int(self.w_bytesio.getsize())
@@ -96,7 +94,7 @@
 
     def write_w(self, space, w_data):
         self._check_closed(space)
-        buf = space.buffer_w(w_data, space.BUF_CONTIG_RO).as_str()
+        buf = space.buffer_w(w_data, space.BUF_CONTIG_RO)[0].as_str()
         length = len(buf)
         if length <= 0:
             return space.wrap(0)
diff --git a/pypy/module/_rawffi/buffer.py b/pypy/module/_rawffi/buffer.py
--- a/pypy/module/_rawffi/buffer.py
+++ b/pypy/module/_rawffi/buffer.py
@@ -9,8 +9,6 @@
     def __init__(self, datainstance):
         self.datainstance = datainstance
         self.readonly = False
-        self.format = 'B'
-        self.itemsize = 1
 
     def getlength(self):
         return self.datainstance.getrawsize()
diff --git a/pypy/module/_rawffi/interp_rawffi.py 
b/pypy/module/_rawffi/interp_rawffi.py
--- a/pypy/module/_rawffi/interp_rawffi.py
+++ b/pypy/module/_rawffi/interp_rawffi.py
@@ -361,7 +361,7 @@
         self.ll_buffer = lltype.nullptr(rffi.VOIDP.TO)
 
     def buffer_w(self, space, flags):
-        return RawFFIBuffer(self)
+        return RawFFIBuffer(self), 'B', 1
 
     def getrawsize(self):
         raise NotImplementedError("abstract base class")
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
@@ -139,7 +139,7 @@
         self.allocated = 0
 
     def buffer_w(self, space, flags):
-        return ArrayBuffer(self, False)
+        return ArrayBuffer(self, False), self.typecode, self.itemsize_
 
     def descr_append(self, space, w_x):
         """ append(x)
@@ -632,12 +632,10 @@
 
     def __init__(self, array, readonly):
         self.array = array
-        self.format = array.typecode
-        self.itemsize = array.itemsize_
         self.readonly = readonly
 
     def getlength(self):
-        return self.array.len * self.itemsize
+        return self.array.len * self.array.itemsize_
 
     def getitem(self, index):
         array = self.array
diff --git a/pypy/module/cpyext/buffer.py b/pypy/module/cpyext/buffer.py
--- a/pypy/module/cpyext/buffer.py
+++ b/pypy/module/cpyext/buffer.py
@@ -20,8 +20,6 @@
         self.c_buf = c_buf
         self.c_len = c_len
         self.w_obj = w_obj
-        self.format = 'B'
-        self.itemsize = 1
 
     def destructor(self):
         assert isinstance(self, CBufferMixin)
diff --git a/pypy/module/cpyext/bytesobject.py 
b/pypy/module/cpyext/bytesobject.py
--- a/pypy/module/cpyext/bytesobject.py
+++ b/pypy/module/cpyext/bytesobject.py
@@ -253,7 +253,5 @@
     the buffer protocol."""
     if space.is_w(space.type(w_obj), space.w_bytes):
         return w_obj
-    buffer = space.buffer_w(w_obj, space.BUF_FULL_RO)
+    buffer = space.buffer_w(w_obj, space.BUF_FULL_RO)[0]
     return space.wrapbytes(buffer.as_str())
-    
-
diff --git a/pypy/module/cpyext/slotdefs.py b/pypy/module/cpyext/slotdefs.py
--- a/pypy/module/cpyext/slotdefs.py
+++ b/pypy/module/cpyext/slotdefs.py
@@ -237,8 +237,6 @@
         self.size = size
         self.w_obj = w_obj # kept alive
         self.readonly = True
-        self.format = 'B'
-        self.itemsize = 1
 
     def getlength(self):
         return self.size
diff --git a/pypy/module/micronumpy/concrete.py 
b/pypy/module/micronumpy/concrete.py
--- a/pypy/module/micronumpy/concrete.py
+++ b/pypy/module/micronumpy/concrete.py
@@ -477,9 +477,6 @@
     def __init__(self, impl, readonly):
         self.impl = impl
         self.readonly = readonly
-        #XXX
-        self.format = 'B'
-        self.itemsize = 1
 
     def getitem(self, item):
         return raw_storage_getitem(lltype.Char, self.impl.storage, item)
diff --git a/pypy/module/micronumpy/ndarray.py 
b/pypy/module/micronumpy/ndarray.py
--- a/pypy/module/micronumpy/ndarray.py
+++ b/pypy/module/micronumpy/ndarray.py
@@ -619,7 +619,8 @@
             "ctypes not implemented yet"))
 
     def buffer_w(self, space, flags):
-        return self.implementation.get_buffer(space, True)
+        # XXX format isn't always 'B' probably
+        return self.implementation.get_buffer(space, True), 'B', 1
 
     def descr_get_data(self, space):
         return space.newbuffer(self.implementation.get_buffer(space, False))
diff --git a/pypy/module/mmap/interp_mmap.py b/pypy/module/mmap/interp_mmap.py
--- a/pypy/module/mmap/interp_mmap.py
+++ b/pypy/module/mmap/interp_mmap.py
@@ -19,8 +19,9 @@
 
     def buffer_w(self, space, flags):
         self.check_valid()
-        return MMapBuffer(self.space, self.mmap,
-                          bool(flags & space.BUF_WRITABLE))
+        return (MMapBuffer(self.space, self.mmap,
+                           bool(flags & space.BUF_WRITABLE)),
+                'B', 1)
 
     def close(self):
         self.mmap.close()
@@ -311,8 +312,6 @@
         self.space = space
         self.mmap = mmap
         self.readonly = readonly
-        self.format = 'B'
-        self.itemsize = 1
 
     def getlength(self):
         return self.mmap.size
diff --git a/pypy/module/struct/interp_struct.py 
b/pypy/module/struct/interp_struct.py
--- a/pypy/module/struct/interp_struct.py
+++ b/pypy/module/struct/interp_struct.py
@@ -96,7 +96,7 @@
 @unwrap_spec(format=str, offset=int)
 def unpack_from(space, format, w_buffer, offset=0):
     size = _calcsize(space, format)
-    buf = space.buffer_w(w_buffer, space.BUF_SIMPLE)
+    buf = space.buffer_w(w_buffer, space.BUF_SIMPLE)[0]
     if offset < 0:
         offset += buf.getlength()
     if offset < 0 or (buf.getlength() - offset) < size:
diff --git a/pypy/objspace/fake/objspace.py b/pypy/objspace/fake/objspace.py
--- a/pypy/objspace/fake/objspace.py
+++ b/pypy/objspace/fake/objspace.py
@@ -41,7 +41,7 @@
         is_root(w_subtype)
 
     def buffer_w(self, space, flags):
-        return StringBuffer("foobar")
+        return StringBuffer("foobar"), 'B', 1
 
     def str_w(self, space):
         return NonConstant("foobar")
diff --git a/pypy/objspace/std/bytearrayobject.py 
b/pypy/objspace/std/bytearrayobject.py
--- a/pypy/objspace/std/bytearrayobject.py
+++ b/pypy/objspace/std/bytearrayobject.py
@@ -29,7 +29,7 @@
         return "%s(%s)" % (w_self.__class__.__name__, ''.join(w_self.data))
 
     def buffer_w(self, space, flags):
-        return BytearrayBuffer(self.data, False)
+        return BytearrayBuffer(self.data, False), 'B', 1
 
     def _new(self, value):
         return W_BytearrayObject(_make_data(value))
@@ -55,7 +55,7 @@
 
     @staticmethod
     def _op_val(space, w_other):
-        return space.buffer_w(w_other, space.BUF_SIMPLE).as_str()
+        return space.buffer_w(w_other, space.BUF_SIMPLE)[0].as_str()
 
     def _chr(self, char):
         assert len(char) == 1
@@ -1062,8 +1062,6 @@
     def __init__(self, data, readonly):
         self.data = data
         self.readonly = readonly
-        self.format = 'B'
-        self.itemsize = 1
 
     def getlength(self):
         return len(self.data)
diff --git a/pypy/objspace/std/bytesobject.py b/pypy/objspace/std/bytesobject.py
--- a/pypy/objspace/std/bytesobject.py
+++ b/pypy/objspace/std/bytesobject.py
@@ -400,7 +400,7 @@
 
     def buffer_w(self, space, flags):
         space.check_buf_flags(flags, True)
-        return StringBuffer(self._value)
+        return StringBuffer(self._value), 'B', 1
 
     def listview_int(self):
         return _create_list_from_bytes(self._value)
@@ -433,7 +433,7 @@
         except OperationError, e:
             if not e.match(space, space.w_TypeError):
                 raise
-        return space.buffer_w(w_other, space.BUF_SIMPLE).as_str()
+        return space.buffer_w(w_other, space.BUF_SIMPLE)[0].as_str()
 
     def _chr(self, char):
         assert len(char) == 1
@@ -733,7 +733,7 @@
 
     # String-like argument
     try:
-        buf = space.buffer_w(w_source, space.BUF_FULL_RO)
+        buf = space.buffer_w(w_source, space.BUF_FULL_RO)[0]
     except OperationError, e:
         if not e.match(space, space.w_TypeError):
             raise
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
@@ -15,18 +15,20 @@
     an interp-level buffer.
     """
 
-    def __init__(self, buf):
+    def __init__(self, buf, format='B', itemsize=1):
         assert isinstance(buf, Buffer)
         self.buf = buf
+        self.format = format
+        self.itemsize = itemsize
 
     def buffer_w(self, space, flags):
         self._check_released(space)
         space.check_buf_flags(flags, self.buf.readonly)
-        return self.buf
+        return self.buf, self.format, self.itemsize
 
     @staticmethod
     def descr_new_memoryview(space, w_subtype, w_object):
-        return W_MemoryView(space.buffer_w(w_object, space.BUF_FULL_RO))
+        return W_MemoryView(*space.buffer_w(w_object, space.BUF_FULL_RO))
 
     def _make_descr__cmp(name):
         def descr__cmp(self, space, w_other):
@@ -39,7 +41,7 @@
                 return space.wrap(getattr(operator, name)(str1, str2))
 
             try:
-                buf = space.buffer_w(w_other, space.BUF_CONTIG_RO)
+                buf = space.buffer_w(w_other, space.BUF_CONTIG_RO)[0]
             except OperationError, e:
                 if not e.match(space, space.w_TypeError):
                     raise
@@ -60,7 +62,7 @@
         return buf.getslice(0, n_bytes, 1, n_bytes)
 
     def getlength(self):
-        return self.buf.getlength() // self.buf.itemsize
+        return self.buf.getlength() // self.itemsize
 
     def descr_tobytes(self, space):
         self._check_released(space)
@@ -69,7 +71,7 @@
     def descr_tolist(self, space):
         self._check_released(space)
         buf = self.buf
-        if buf.format != 'B':
+        if self.format != 'B':
             raise oefmt(space.w_NotImplementedError,
                         "tolist() only supports byte views")
         result = []
@@ -83,13 +85,13 @@
         if step not in (0, 1):
             raise oefmt(space.w_NotImplementedError, "")
         if step == 0:  # index only
-            a = start * self.buf.itemsize
-            b = a + self.buf.itemsize
+            a = start * self.itemsize
+            b = a + self.itemsize
             return space.wrapbytes(
                 ''.join([self.buf.getitem(i) for i in range(a, b)]))
         else:
-            buf = SubBuffer(self.buf, start * self.buf.itemsize,
-                            size * self.buf.itemsize)
+            buf = SubBuffer(self.buf, start * self.itemsize,
+                            size * self.itemsize)
             return W_MemoryView(buf)
 
     def descr_setitem(self, space, w_index, w_obj):
@@ -99,11 +101,11 @@
         start, stop, step, size = space.decode_index4(w_index, 
self.getlength())
         if step not in (0, 1):
             raise oefmt(space.w_NotImplementedError, "")
-        value = space.buffer_w(w_obj, space.BUF_CONTIG_RO)
-        if value.getlength() != size * self.buf.itemsize:
+        value = space.buffer_w(w_obj, space.BUF_CONTIG_RO)[0]
+        if value.getlength() != size * self.itemsize:
             raise oefmt(space.w_ValueError,
                         "cannot modify size of memoryview object")
-        self.buf.setslice(start * self.buf.itemsize, value.as_str())
+        self.buf.setslice(start * self.itemsize, value.as_str())
 
     def descr_len(self, space):
         self._check_released(space)
@@ -111,11 +113,11 @@
 
     def w_get_format(self, space):
         self._check_released(space)
-        return space.wrap(self.buf.format)
+        return space.wrap(self.format)
 
     def w_get_itemsize(self, space):
         self._check_released(space)
-        return space.wrap(self.buf.itemsize)
+        return space.wrap(self.itemsize)
 
     def w_get_ndim(self, space):
         self._check_released(space)
@@ -131,7 +133,7 @@
 
     def w_get_strides(self, space):
         self._check_released(space)
-        return space.newtuple([space.wrap(self.buf.itemsize)])
+        return space.newtuple([space.wrap(self.itemsize)])
 
     def w_get_suboffsets(self, space):
         self._check_released(space)
diff --git a/pypy/objspace/std/strbufobject.py 
b/pypy/objspace/std/strbufobject.py
--- a/pypy/objspace/std/strbufobject.py
+++ b/pypy/objspace/std/strbufobject.py
@@ -37,7 +37,7 @@
         return self.force()
 
     def buffer_w(self, space, flags):
-        return StringBuffer(self.force())
+        return StringBuffer(self.force()), 'B', 1
 
     def descr_len(self, space):
         return space.wrap(self.length)
diff --git a/rpython/rlib/buffer.py b/rpython/rlib/buffer.py
--- a/rpython/rlib/buffer.py
+++ b/rpython/rlib/buffer.py
@@ -6,7 +6,7 @@
 
 class Buffer(object):
     """Abstract base class for buffers."""
-    __slots__ = ['readonly', 'format', 'itemsize']
+    __slots__ = ['readonly']
     _immutable_ = True
 
     def getlength(self):
@@ -45,8 +45,6 @@
     def __init__(self, value):
         self.value = value
         self.readonly = True
-        self.format = 'B'
-        self.itemsize = 1
 
     def getlength(self):
         return len(self.value)
@@ -72,8 +70,6 @@
 
     def __init__(self, buffer, offset, size):
         self.readonly = buffer.readonly
-        self.format = buffer.format
-        self.itemsize = buffer.itemsize
         self.buffer = buffer
         self.offset = offset
         self.size = size
_______________________________________________
pypy-commit mailing list
[email protected]
https://mail.python.org/mailman/listinfo/pypy-commit

Reply via email to