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