Author: Ronan Lamy <[email protected]>
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
[email protected]
https://mail.python.org/mailman/listinfo/pypy-commit