[pypy-commit] pypy PyBuffer: replace rpython.rlib.buffer.Buffer (and subclasses) with pypy.interpreter.buffer.BinaryBuffer (and subclasses)

rlamy pypy.commits at gmail.com
Tue Apr 25 11:25:12 EDT 2017


Author: Ronan Lamy <ronan.lamy at gmail.com>
Branch: PyBuffer
Changeset: r91125:985fe7a93e47
Date: 2017-04-25 16:24 +0100
http://bitbucket.org/pypy/pypy/changeset/985fe7a93e47/

Log:	replace rpython.rlib.buffer.Buffer (and subclasses) with
	pypy.interpreter.buffer.BinaryBuffer (and subclasses)

diff --git a/pypy/interpreter/buffer.py b/pypy/interpreter/buffer.py
--- a/pypy/interpreter/buffer.py
+++ b/pypy/interpreter/buffer.py
@@ -1,7 +1,6 @@
-from rpython.rlib.rgc import nonmoving_raw_ptr_for_resizable_list
-from rpython.rlib.signature import signature
-from rpython.rlib import types
 from rpython.rlib.rstruct.error import StructError
+from rpython.rlib.buffer import Buffer as BinaryBuffer
+from rpython.rlib.buffer import StringBuffer, ByteBuffer, SubBuffer
 
 from pypy.interpreter.error import oefmt
 
@@ -128,12 +127,11 @@
             index += nitems
         if index < 0 or index >= nitems:
             raise oefmt(space.w_IndexError,
-                "index out of bounds on dimension %d", dim+1)
+                "index out of bounds on dimension %d", dim + 1)
         # TODO suboffsets?
         strides = self.getstrides()
         return strides[dim] * index
 
-
     def w_getitem(self, space, idx):
         offset = self.get_offset(space, 0, idx)
         itemsize = self.getitemsize()
@@ -146,14 +144,12 @@
 
     def setitem_w(self, space, idx, w_obj):
         offset = self.get_offset(space, 0, idx)
-        itemsize = self.getitemsize()
         # TODO: this probably isn't very fast
         byteval = self.bytes_from_value(space, w_obj)
         self.setbytes(offset, byteval)
 
     def w_tolist(self, space):
         dim = self.getndim()
-        fmt = self.getformat()
         if dim == 0:
             raise NotImplementedError
         elif dim == 1:
@@ -176,7 +172,7 @@
             bytecount = (stride * dimshape)
             values_w = [
                 self.value_from_bytes(space, self.getbytes(pos, itemsize))
-                    for pos in range(start, start + bytecount, stride)]
+                for pos in range(start, start + bytecount, stride)]
             return space.newlist(values_w)
 
         items = [None] * dimshape
@@ -262,11 +258,11 @@
 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
@@ -320,174 +316,3 @@
 
     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"""
-    _attrs_ = ['readonly']
-    _immutable_ = True
-
-    def getlength(self):
-        """Returns the size in bytes (even if getitemsize() > 1)."""
-        raise NotImplementedError
-
-    def __len__(self):
-        res = self.getlength()
-        assert res >= 0
-        return res
-
-    def as_str(self):
-        "Returns an interp-level string with the whole content of the buffer."
-        # May be overridden.
-        return self.getslice(0, self.getlength(), 1, self.getlength())
-
-    def as_str_and_offset_maybe(self):
-        """
-        If the buffer is backed by a string, return a pair (string, offset),
-        where offset is the offset inside the string where the buffer start.
-        Else, return (None, 0).
-        """
-        return None, 0
-
-    def getitem(self, index):
-        "Returns the index'th character in the buffer."
-        raise NotImplementedError   # Must be overriden.  No bounds checks.
-
-    def __getitem__(self, i):
-        return self.getitem(i)
-
-    def getslice(self, start, stop, step, size):
-        # May be overridden.  No bounds checks.
-        return ''.join([self.getitem(i) for i in range(start, stop, step)])
-
-    @signature(types.any(), types.int(), types.int(), returns=types.str())
-    def __getslice__(self, start, stop):
-        return self.getslice(start, stop, 1, stop - start)
-
-    def setitem(self, index, char):
-        "Write a character into the buffer."
-        raise NotImplementedError   # Must be overriden.  No bounds checks.
-
-    def __setitem__(self, i, char):
-        return self.setitem(i, char)
-
-    def setslice(self, start, string):
-        # May be overridden.  No bounds checks.
-        for i in range(len(string)):
-            self.setitem(start + i, string[i])
-
-class ByteBuffer(BinaryBuffer):
-    _immutable_ = True
-
-    def __init__(self, len):
-        self.data = ['\x00'] * len
-        self.readonly = False
-
-    def getlength(self):
-        return len(self.data)
-
-    def getitem(self, index):
-        return self.data[index]
-
-    def setitem(self, index, char):
-        self.data[index] = char
-
-    def get_raw_address(self):
-        return nonmoving_raw_ptr_for_resizable_list(self.data)
-
-class StringBuffer(BinaryBuffer):
-    _attrs_ = ['readonly', 'value']
-    _immutable_ = True
-
-    def __init__(self, value):
-        self.value = value
-        self.readonly = 1
-
-    def getlength(self):
-        return len(self.value)
-
-    def as_str(self):
-        return self.value
-
-    def as_str_and_offset_maybe(self):
-        return self.value, 0
-
-    def getitem(self, index):
-        return self.value[index]
-
-    def getslice(self, start, stop, step, size):
-        if size == 0:
-            return ""
-        if step == 1:
-            assert 0 <= start <= stop
-            if start == 0 and stop == len(self.value):
-                return self.value
-            return self.value[start:stop]
-        return BinaryBuffer.getslice(self, start, stop, step, size)
-
-    def get_raw_address(self):
-        from rpython.rtyper.lltypesystem import rffi
-        # may still raise ValueError on some GCs
-        return rffi.get_raw_address_of_string(self.value)
-
-class SubBuffer(BinaryBuffer):
-    _attrs_ = ['buffer', 'offset', 'size', 'readonly']
-    _immutable_ = True
-
-    @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
-            # we want a view (offset, size) over a view
-            # (buffer.offset, buffer.size) over buffer.buffer.
-            # Note that either '.size' can be -1 to mean 'up to the end'.
-            at_most = buffer.getlength() - offset
-            if size > at_most or size < 0:
-                if at_most < 0:
-                    at_most = 0
-                size = at_most
-            offset += buffer.offset
-            buffer = buffer.buffer
-        #
-        self.buffer = buffer
-        self.offset = offset
-        self.size = size
-
-    def getlength(self):
-        at_most = self.buffer.getlength() - self.offset
-        if 0 <= self.size <= at_most:
-            return self.size
-        elif at_most >= 0:
-            return at_most
-        else:
-            return 0
-
-    def as_str_and_offset_maybe(self):
-        string, offset = self.buffer.as_str_and_offset_maybe()
-        if string is not None:
-            return string, offset + self.offset
-        return None, 0
-
-    def getitem(self, index):
-        return self.buffer.getitem(self.offset + index)
-
-    def getslice(self, start, stop, step, size):
-        if start == stop:
-            return ''     # otherwise, adding self.offset might make them
-                          # out of bounds
-        return self.buffer.getslice(self.offset + start, self.offset + stop,
-                                    step, size)
-
-    def setitem(self, index, char):
-        self.buffer.setitem(self.offset + index, char)
-
-    def setslice(self, start, string):
-        if len(string) == 0:
-            return        # otherwise, adding self.offset might make 'start'
-                          # out of bounds
-        self.buffer.setslice(self.offset + start, string)
-
-    def get_raw_address(self):
-        from rpython.rtyper.lltypesystem import rffi
-        ptr = self.buffer.get_raw_address()
-        return rffi.ptradd(ptr, self.offset)
diff --git a/rpython/rlib/buffer.py b/rpython/rlib/buffer.py
--- a/rpython/rlib/buffer.py
+++ b/rpython/rlib/buffer.py
@@ -1,13 +1,12 @@
 """
 Buffer protocol support.
 """
-from rpython.rlib import jit
-from rpython.rlib.rgc import (resizable_list_supporting_raw_ptr,
-        nonmoving_raw_ptr_for_resizable_list)
-
+from rpython.rlib.rgc import nonmoving_raw_ptr_for_resizable_list
+from rpython.rlib.signature import signature
+from rpython.rlib import types
 
 class Buffer(object):
-    """Abstract base class for buffers."""
+    """Base class for buffers of bytes"""
     _attrs_ = ['readonly']
     _immutable_ = True
 
@@ -27,8 +26,8 @@
 
     def as_str_and_offset_maybe(self):
         """
-        If the buffer is backed by a string, return a pair (string, offset), where
-        offset is the offset inside the string where the buffer start.
+        If the buffer is backed by a string, return a pair (string, offset),
+        where offset is the offset inside the string where the buffer start.
         Else, return (None, 0).
         """
         return None, 0
@@ -44,6 +43,7 @@
         # May be overridden.  No bounds checks.
         return ''.join([self.getitem(i) for i in range(start, stop, step)])
 
+    @signature(types.any(), types.int(), types.int(), returns=types.str())
     def __getslice__(self, start, stop):
         return self.getslice(start, stop, 1, stop - start)
 
@@ -59,26 +59,24 @@
         for i in range(len(string)):
             self.setitem(start + i, string[i])
 
+class ByteBuffer(Buffer):
+    _immutable_ = True
+
+    def __init__(self, len):
+        self.data = ['\x00'] * len
+        self.readonly = False
+
+    def getlength(self):
+        return len(self.data)
+
+    def getitem(self, index):
+        return self.data[index]
+
+    def setitem(self, index, char):
+        self.data[index] = char
+
     def get_raw_address(self):
-        raise ValueError("no raw buffer")
-
-    def getformat(self):
-        return 'B'
-
-    def getitemsize(self):
-        return 1
-
-    def getndim(self):
-        return 1
-
-    def getshape(self):
-        return [self.getlength()]
-
-    def getstrides(self):
-        return [1]
-
-    def releasebuffer(self):
-        pass
+        return nonmoving_raw_ptr_for_resizable_list(self.data)
 
 class StringBuffer(Buffer):
     _attrs_ = ['readonly', 'value']
@@ -119,6 +117,7 @@
     _attrs_ = ['buffer', 'offset', 'size', 'readonly']
     _immutable_ = True
 
+    @signature(types.any(), types.instance(Buffer), 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
@@ -149,7 +148,7 @@
     def as_str_and_offset_maybe(self):
         string, offset = self.buffer.as_str_and_offset_maybe()
         if string is not None:
-            return string, offset+self.offset
+            return string, offset + self.offset
         return None, 0
 
     def getitem(self, index):


More information about the pypy-commit mailing list