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