Author: Ronan Lamy <ronan.l...@gmail.com>
Branch: buffer-cleanup
Changeset: r89939:82e6578296c4
Date: 2017-02-05 16:15 +0000
http://bitbucket.org/pypy/pypy/changeset/82e6578296c4/

Log:    Add getformat() and getitemsize() to RawFFIBuffer

diff --git a/pypy/module/_rawffi/array.py b/pypy/module/_rawffi/array.py
--- a/pypy/module/_rawffi/array.py
+++ b/pypy/module/_rawffi/array.py
@@ -91,6 +91,8 @@
         W_DataInstance.__init__(self, space, memsize, address)
         self.length = length
         self.shape = shape
+        self.fmt = shape.itemcode
+        self.itemsize = shape.size
 
     def descr_repr(self, space):
         addr = rffi.cast(lltype.Unsigned, self.ll_buffer)
@@ -105,8 +107,7 @@
             raise segfault_exception(space, "setting element of freed array")
         if num >= self.length or num < 0:
             raise OperationError(space.w_IndexError, space.w_None)
-        unwrap_value(space, write_ptr, self.ll_buffer, num,
-                     self.shape.itemcode, w_value)
+        unwrap_value(space, write_ptr, self.ll_buffer, num, self.fmt, w_value)
 
     def descr_setitem(self, space, w_index, w_value):
         try:
@@ -123,8 +124,7 @@
             raise segfault_exception(space, "accessing elements of freed 
array")
         if num >= self.length or num < 0:
             raise OperationError(space.w_IndexError, space.w_None)
-        return wrap_value(space, read_ptr, self.ll_buffer, num,
-                          self.shape.itemcode)
+        return wrap_value(space, read_ptr, self.ll_buffer, num, self.fmt)
 
     def descr_getitem(self, space, w_index):
         try:
@@ -141,19 +141,16 @@
 
     @unwrap_spec(num=int)
     def descr_itemaddress(self, space, num):
-        itemsize = self.shape.size
-        ptr = rffi.ptradd(self.ll_buffer, itemsize * num)
+        ptr = rffi.ptradd(self.ll_buffer, self.itemsize * num)
         return space.wrap(rffi.cast(lltype.Unsigned, ptr))
 
     def getrawsize(self):
-        itemsize = self.shape.size
-        return itemsize * self.length
+        return self.itemsize * self.length
 
     def decodeslice(self, space, w_slice):
         if not space.isinstance_w(w_slice, space.w_slice):
             raise oefmt(space.w_TypeError, "index must be int or slice")
-        letter = self.shape.itemcode
-        if letter != 'c':
+        if self.fmt != 'c':
             raise oefmt(space.w_TypeError, "only 'c' arrays support slicing")
         w_start = space.getattr(w_slice, space.wrap('start'))
         w_stop = space.getattr(w_slice, space.wrap('stop'))
@@ -193,7 +190,8 @@
             ll_buffer[start + i] = value[i]
 
     def buffer_w_ex(self, space, flags):
-        return self.buffer_w(space, flags), self.shape.itemcode, 
self.shape.size
+        buf = self.buffer_w(space, flags)
+        return buf, buf.getformat(), buf.getitemsize()
 
 
 W_ArrayInstance.typedef = TypeDef(
diff --git a/pypy/module/_rawffi/buffer.py b/pypy/module/_rawffi/buffer.py
--- a/pypy/module/_rawffi/buffer.py
+++ b/pypy/module/_rawffi/buffer.py
@@ -14,6 +14,12 @@
     def getlength(self):
         return self.datainstance.getrawsize()
 
+    def getformat(self):
+        return self.datainstance.fmt
+
+    def getitemsize(self):
+        return self.datainstance.itemsize
+
     def getitem(self, index):
         ll_buffer = self.datainstance.ll_buffer
         return ll_buffer[index]
diff --git a/pypy/module/_rawffi/interp_rawffi.py 
b/pypy/module/_rawffi/interp_rawffi.py
--- a/pypy/module/_rawffi/interp_rawffi.py
+++ b/pypy/module/_rawffi/interp_rawffi.py
@@ -337,6 +337,8 @@
 
 
 class W_DataInstance(W_Root):
+    fmt = 'B'
+    itemsize = 1
     def __init__(self, space, size, address=r_uint(0)):
         if address:
             self.ll_buffer = rffi.cast(rffi.VOIDP, address)
_______________________________________________
pypy-commit mailing list
pypy-commit@python.org
https://mail.python.org/mailman/listinfo/pypy-commit

Reply via email to