[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