Author: Ronan Lamy <[email protected]>
Branch: PyBuffer
Changeset: r90861:7d94af72aafd
Date: 2017-03-29 18:10 +0100
http://bitbucket.org/pypy/pypy/changeset/7d94af72aafd/
Log: Make sure that SubBuffer only receives BinaryBuffers
diff --git a/pypy/interpreter/baseobjspace.py b/pypy/interpreter/baseobjspace.py
--- a/pypy/interpreter/baseobjspace.py
+++ b/pypy/interpreter/baseobjspace.py
@@ -1540,7 +1540,7 @@
self._getarg_error("bytes or read-only buffer", w_obj)
elif code == 'w*':
try:
- return w_obj.buffer_w(self, self.BUF_WRITABLE)
+ return w_obj.buffer_w(self, self.BUF_WRITABLE).as_binary()
except OperationError:
pass
except BufferInterfaceNotFound:
@@ -1548,7 +1548,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).as_binary()
except BufferInterfaceNotFound:
self._getarg_error("bytes-like object", w_obj)
elif code == 'y#':
diff --git a/pypy/interpreter/buffer.py b/pypy/interpreter/buffer.py
--- a/pypy/interpreter/buffer.py
+++ b/pypy/interpreter/buffer.py
@@ -219,7 +219,7 @@
_attrs_ = ['buffer', 'offset', 'size', 'readonly']
_immutable_ = True
- #@signature(types.any(), types.instance(BinaryBuffer), types.int(),
types.int(), returns=types.none())
+ @signature(types.any(), types.instance(BinaryBuffer), types.int(),
types.int(), returns=types.none())
def __init__(self, buffer, offset, size):
self.readonly = buffer.readonly
if isinstance(buffer, SubBuffer): # don't nest them
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
@@ -577,6 +577,7 @@
return space.newbytes(builder.build())
def _raw_read(self, space, buffer, start, length):
+ assert buffer is not None
length = intmask(length)
start = intmask(start)
w_buf = space.newbuffer(SimpleBuffer(SubBuffer(buffer, start, length)))
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
@@ -113,7 +113,7 @@
def do_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).as_binary()
if offset < 0:
offset += buf.getlength()
if offset < 0 or (buf.getlength() - offset) < size:
@@ -126,7 +126,7 @@
class W_UnpackIter(W_Root):
def __init__(self, space, w_struct, w_buffer):
- buf = space.buffer_w(w_buffer, space.BUF_SIMPLE)
+ buf = space.buffer_w(w_buffer, space.BUF_SIMPLE).as_binary()
if w_struct.size <= 0:
raise oefmt(get_error(space),
"cannot iteratively unpack with a struct of length %d",
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
@@ -149,7 +149,7 @@
return self._tolist(space, buf, self.getlength(), itemsize, fmt,
self.getstrides())
else:
- return self._tolist_rec(space, buf, 0, 0, fmt)
+ return self._tolist_rec(space, buf.as_binary(), 0, 0, fmt)
def _tolist(self, space, buf, bytecount, itemsize, fmt, strides=None):
# TODO: this probably isn't very fast
@@ -179,7 +179,7 @@
orig_buf = buf
for i in range(dimshape):
- buf = SubBuffer(orig_buf, start, stride)
+ buf = SubBuffer(orig_buf.as_binary(), start, stride)
item = self._tolist_rec(space, buf, start, idim+1, fmt)
items[i] = item
start += stride
@@ -233,7 +233,7 @@
start = self._start_from_tuple(space, w_index)
- buf = SubBuffer(self.buf, start, view.getitemsize())
+ buf = SubBuffer(self.buf.as_binary(), start, view.getitemsize())
fmtiter = UnpackFormatIterator(space, buf)
fmtiter.interpret(fmt)
return fmtiter.result_w[0]
@@ -268,7 +268,7 @@
return space.newint(ord(ch))
else:
# TODO: this probably isn't very fast
- buf = SubBuffer(self.buf, idx, itemsize)
+ buf = SubBuffer(self.buf.as_binary(), idx, itemsize)
fmtiter = UnpackFormatIterator(space, buf)
fmtiter.length = buf.getlength()
fmtiter.interpret(self.buf.getformat())
@@ -347,14 +347,12 @@
src = space.buffer_w(w_obj, space.BUF_CONTIG_RO)
dst_strides = self.getstrides()
dim = 0
- dst = SubBuffer(self.buf, start * itemsize, slicelength * itemsize)
+ dst = SubBuffer(self.buf.as_binary(), start * itemsize,
slicelength * itemsize)
src_stride0 = dst_strides[dim]
off = 0
src_shape0 = slicelength
src_stride0 = src.getstrides()[0]
- if isinstance(w_obj, W_MemoryView):
- src_stride0 = w_obj.getstrides()[0]
for i in range(src_shape0):
data.append(src.getslice(off,off+itemsize,1,itemsize))
off += src_stride0
diff --git a/pypy/objspace/std/test/test_memoryobject.py
b/pypy/objspace/std/test/test_memoryobject.py
--- a/pypy/objspace/std/test/test_memoryobject.py
+++ b/pypy/objspace/std/test/test_memoryobject.py
@@ -323,6 +323,9 @@
self.data.append(c)
self.data = ''.join(self.data)
+ def as_str(self):
+ return self.data
+
def getformat(self):
return self.format
_______________________________________________
pypy-commit mailing list
[email protected]
https://mail.python.org/mailman/listinfo/pypy-commit