Author: Ronan Lamy <ronan.l...@gmail.com>
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
pypy-commit@python.org
https://mail.python.org/mailman/listinfo/pypy-commit

Reply via email to