Author: Ronan Lamy <[email protected]>
Branch: PyBuffer
Changeset: r91123:10cb464da2fc
Date: 2017-04-25 15:38 +0100
http://bitbucket.org/pypy/pypy/changeset/10cb464da2fc/
Log: Move new_slice() method to PyBuffer, and BufferSlice to
pypy.interpreter.buffer
diff --git a/pypy/interpreter/buffer.py b/pypy/interpreter/buffer.py
--- a/pypy/interpreter/buffer.py
+++ b/pypy/interpreter/buffer.py
@@ -141,6 +141,9 @@
data = self.getbytes(offset, itemsize)
return self.value_from_bytes(space, data)
+ def new_slice(self, start, step, slicelength):
+ return BufferSlice(self, start, step, slicelength)
+
def setitem_w(self, space, idx, w_obj):
offset = self.get_offset(space, 0, idx)
itemsize = self.getitemsize()
@@ -246,10 +249,73 @@
ch = self.data[idx]
return space.newint(ord(ch))
+ def new_slice(self, start, step, slicelength):
+ if step == 1:
+ return SimpleBuffer(SubBuffer(self.data, start, slicelength))
+ else:
+ return BufferSlice(self, start, step, slicelength)
+
def setitem_w(self, space, idx, w_obj):
idx = self.get_offset(space, 0, idx)
self.data[idx] = space.byte_w(w_obj)
+class BufferSlice(PyBuffer):
+ _immutable_ = True
+ _attrs_ = ['buf', 'readonly', 'shape', 'strides', 'start', 'step']
+ def __init__(self, buf, start, step, length):
+ self.buf = buf
+ self.readonly = self.buf.readonly
+ self.strides = buf.getstrides()[:]
+ itemsize = buf.getitemsize()
+ self.start = start
+ self.step = step
+ self.strides[0] *= step
+ self.shape = buf.getshape()[:]
+ self.shape[0] = length
+
+ def getlength(self):
+ return self.shape[0] * self.getitemsize()
+
+ def getbytes(self, start, size):
+ offset = self.start * self.buf.getstrides()[0]
+ return self.buf.getbytes(offset + start, size)
+
+ def setbytes(self, start, string):
+ if len(string) == 0:
+ return # otherwise, adding self.offset might make 'start'
+ # out of bounds
+ offset = self.start * self.buf.getstrides()[0]
+ self.buf.setbytes(offset + start, string)
+
+ def get_raw_address(self):
+ from rpython.rtyper.lltypesystem import rffi
+ offset = self.start * self.buf.getstrides()[0]
+ return rffi.ptradd(self.buf.get_raw_address(), offset)
+
+ def getformat(self):
+ return self.buf.getformat()
+
+ def getitemsize(self):
+ return self.buf.getitemsize()
+
+ def getndim(self):
+ return self.buf.getndim()
+
+ def getshape(self):
+ return self.shape
+
+ def getstrides(self):
+ return self.strides
+
+ def parent_index(self, idx):
+ return self.start + self.step * idx
+
+ def w_getitem(self, space, idx):
+ return self.buf.w_getitem(space, self.parent_index(idx))
+
+ def setitem_w(self, space, idx, w_obj):
+ return self.buf.setitem_w(space, self.parent_index(idx), w_obj)
+
class BinaryBuffer(object):
"""Base class for buffers of bytes"""
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
@@ -160,19 +160,11 @@
else:
raise oefmt(space.w_NotImplementedError, "multi-dimensional
sub-views are not implemented")
elif is_slice:
- return self.new_slice(start, stop, step, slicelength, 0)
+ return W_MemoryView(self.buf.new_slice(start, step, slicelength))
# multi index is handled at the top of this function
else:
raise TypeError("memoryview: invalid slice key")
- def new_slice(self, start, stop, step, slicelength, dim):
- pybuf = self.buf
- if step == 1 and isinstance(pybuf, SimpleBuffer):
- sliced = SimpleBuffer(SubBuffer(pybuf.data, start, slicelength))
- else:
- sliced = BufferSlice(pybuf, start, step, slicelength)
- return W_MemoryView(sliced)
-
def init_len(self):
self.length = self.bytecount_from_shape()
@@ -593,63 +585,6 @@
_IsFortranContiguous(ndim, shape, strides, itemsize))
return 0
-class BufferSlice(PyBuffer):
- _immutable_ = True
- _attrs_ = ['buf', 'readonly', 'shape', 'strides', 'start', 'step']
- def __init__(self, buf, start, step, length):
- self.buf = buf
- self.readonly = self.buf.readonly
- self.strides = buf.getstrides()[:]
- itemsize = buf.getitemsize()
- self.start = start
- self.step = step
- self.strides[0] *= step
- self.shape = buf.getshape()[:]
- self.shape[0] = length
-
- def getlength(self):
- return self.shape[0] * self.getitemsize()
-
- def getbytes(self, start, size):
- offset = self.start * self.buf.getstrides()[0]
- return self.buf.getbytes(offset + start, size)
-
- def setbytes(self, start, string):
- if len(string) == 0:
- return # otherwise, adding self.offset might make 'start'
- # out of bounds
- offset = self.start * self.buf.getstrides()[0]
- self.buf.setbytes(offset + start, string)
-
- def get_raw_address(self):
- from rpython.rtyper.lltypesystem import rffi
- offset = self.start * self.buf.getstrides()[0]
- return rffi.ptradd(self.buf.get_raw_address(), offset)
-
- def getformat(self):
- return self.buf.getformat()
-
- def getitemsize(self):
- return self.buf.getitemsize()
-
- def getndim(self):
- return self.buf.getndim()
-
- def getshape(self):
- return self.shape
-
- def getstrides(self):
- return self.strides
-
- def parent_index(self, idx):
- return self.start + self.step * idx
-
- def w_getitem(self, space, idx):
- return self.buf.w_getitem(space, self.parent_index(idx))
-
- def setitem_w(self, space, idx, w_obj):
- return self.buf.setitem_w(space, self.parent_index(idx), w_obj)
-
class BufferViewBase(PyBuffer):
_immutable_ = True
_______________________________________________
pypy-commit mailing list
[email protected]
https://mail.python.org/mailman/listinfo/pypy-commit