[pypy-commit] pypy PyBuffer: Split ArrayBuffer class into a BinaryBuffer and a Py_buffer

rlamy pypy.commits at gmail.com
Thu Mar 30 12:42:49 EDT 2017


Author: Ronan Lamy <ronan.lamy at gmail.com>
Branch: PyBuffer
Changeset: r90874:4e09a31a43fe
Date: 2017-03-30 17:42 +0100
http://bitbucket.org/pypy/pypy/changeset/4e09a31a43fe/

Log:	Split ArrayBuffer class into a BinaryBuffer and a Py_buffer

diff --git a/pypy/module/array/interp_array.py b/pypy/module/array/interp_array.py
--- a/pypy/module/array/interp_array.py
+++ b/pypy/module/array/interp_array.py
@@ -6,7 +6,7 @@
 from rpython.rtyper.lltypesystem import lltype, rffi
 from rpython.rtyper.lltypesystem.rstr import copy_string_to_raw
 
-from pypy.interpreter.buffer import Buffer
+from pypy.interpreter.buffer import Buffer, BinaryBuffer
 from pypy.interpreter.baseobjspace import W_Root
 from pypy.interpreter.error import OperationError, oefmt
 from pypy.interpreter.gateway import (
@@ -257,7 +257,7 @@
             lltype.free(oldbuffer, flavor='raw')
 
     def buffer_w(self, space, flags):
-        return ArrayBuffer(self, False)
+        return ArrayBuffer(ArrayData(self), self.typecode, self.itemsize, False)
 
     def descr_append(self, space, w_x):
         """ append(x)
@@ -846,60 +846,89 @@
     v.typecode = k
 unroll_typecodes = unrolling_iterable(types.keys())
 
+class ArrayData(BinaryBuffer):
+    _immutable_ = True
+    readonly = False
+    def __init__(self, w_array):
+        self.w_array = w_array
+
+    def getlength(self):
+        return self.w_array.len * self.w_array.itemsize
+
+    def getitem(self, index):
+        w_array = self.w_array
+        data = w_array._charbuf_start()
+        char = data[index]
+        w_array._charbuf_stop()
+        return char
+
+    def setitem(self, index, char):
+        w_array = self.w_array
+        data = w_array._charbuf_start()
+        data[index] = char
+        w_array._charbuf_stop()
+
+    def getslice(self, start, stop, step, size):
+        if size == 0:
+            return ''
+        assert step == 1
+        data = self.w_array._charbuf_start()
+        try:
+            return rffi.charpsize2str(rffi.ptradd(data, start), size)
+        finally:
+            self.w_array._charbuf_stop()
+
+    def get_raw_address(self):
+        return self.w_array._charbuf_start()
+
+
 class ArrayBuffer(Buffer):
     _immutable_ = True
 
-    def __init__(self, array, readonly):
-        self.array = array
+    def __init__(self, data, fmt, itemsize, readonly):
+        self.data = data
+        self.fmt = fmt
+        self.itemsize = itemsize
         self.readonly = readonly
 
     def getlength(self):
-        return self.array.len * self.array.itemsize
+        return self.data.getlength()
 
     def as_str(self):
-        return self.getslice(0, self.getlength(), 1, self.getlength())
+        return self.data.as_str()
+
+    def getitem(self, index):
+        return self.data.getitem(index)
+
+    def setitem(self, index, value):
+        return self.data.setitem(index, value)
+
+    def getslice(self, start, stop, step, size):
+        return self.data.getslice(start, stop, step, size)
+
+    def setslice(self, start, string):
+        self.data.setslice(start, string)
 
     def getformat(self):
-        return self.array.typecode
+        return self.fmt
 
     def getitemsize(self):
-        return self.array.itemsize
+        return self.itemsize
 
     def getndim(self):
         return 1
 
     def getshape(self):
-        return [self.array.len]
+        return [self.getlength() // self.itemsize]
 
     def getstrides(self):
         return [self.getitemsize()]
 
-    def getitem(self, index):
-        array = self.array
-        data = array._charbuf_start()
-        char = data[index]
-        array._charbuf_stop()
-        return char
+    def get_raw_address(self):
+        return self.data.get_raw_address()
 
-    def setitem(self, index, char):
-        array = self.array
-        data = array._charbuf_start()
-        data[index] = char
-        array._charbuf_stop()
-
-    def getslice(self, start, stop, step, size):
-        if size == 0:
-            return ''
-        if step == 1:
-            data = self.array._charbuf_start()
-            try:
-                return rffi.charpsize2str(rffi.ptradd(data, start), size)
-            finally:
-                self.array._charbuf_stop()
-        return Buffer.getslice(self, start, stop, step, size)
-
-    def get_raw_address(self):
-        return self.array._charbuf_start()
+    def as_binary(self):
+        return self.data
 
 
 unpack_driver = jit.JitDriver(name='unpack_array',


More information about the pypy-commit mailing list