Author: Matti Picus <matti.pi...@gmail.com> Branch: memoryview-attributes Changeset: r86335:1b8ccf046b59 Date: 2016-08-20 18:46 +1200 http://bitbucket.org/pypy/pypy/changeset/1b8ccf046b59/
Log: fx typo, getitem/getslice, some translation fixes diff --git a/pypy/module/cpyext/slotdefs.py b/pypy/module/cpyext/slotdefs.py --- a/pypy/module/cpyext/slotdefs.py +++ b/pypy/module/cpyext/slotdefs.py @@ -301,32 +301,29 @@ # Similar to Py_buffer _immutable_ = True - def __init__(self, ptr, size, w_obj, pybuf=None): + def __init__(self, ptr, size, w_obj, format='B', shape=None, + strides=None, ndim=1, itemsize=1, readonly=True): self.ptr = ptr self.size = size self.w_obj = w_obj # kept alive - if pybuf is None: - self.format = 'B' + self.format = format + if not shape: self.shape = [size] + if not strides: self.strides = [1] - self.ndim = 1 - self.itemsize = 1 - self.readonly = True - else: - self.format = rffi.charp2str(pybuf.c_format) - self.ndim = pybuf.c_ndim - self.shape = [pybuf.c_shape[i] for i in range(self.ndim)] - self.strides = [pybuf.c_strides[i] for i in range(self.ndim)] - self.itemsize = pybuf.c_itemsize - self.readonly = pybuf.c_readonly + self.ndim = ndim + self.itemsize = itemsize + self.readonly = readonly def getlength(self): return self.size def getitem(self, index): + if self.itemsize == 1: + return self.ptr[index] start = index * self.itemsize stop = (index + 1) * self.itemsize - return ''.join([self.ptr[i] for i in range(start, stop)]) + return self.getslice(start, stop, 1, stop - start) def get_raw_address(self): return rffi.cast(rffi.CCHARP, self.ptr) @@ -337,6 +334,8 @@ def getshape(self): return self.shape + def getslice(self, start, stop, step, size): + return ''.join([self.ptr[i] for i in range(start, stop, step)]) def wrap_getreadbuffer(space, w_self, w_args, func): func_target = rffi.cast(readbufferproc, func) @@ -358,7 +357,14 @@ space.fromcache(State).check_and_raise_exception(always=True) ptr = pybuf.c_buf size = pybuf.c_len - return space.newbuffer(CPyBuffer(ptr, size, w_self, pybuf)) + ndim = pybuf.c_ndim + shape = [pybuf.c_shape[i] for i in range(ndim)] + strides = [pybuf.c_strides[i] for i in range(ndim)] + format = rffi.charp2str(pybuf.c_format) + return space.newbuffer(CPyBuffer(ptr, size, w_self, format=format, + ndim=ndim, shape=shape, strides=strides, + itemsize=pybuf.c_itemsize, + readonly=pybuf.c_readonly)) def get_richcmp_func(OP_CONST): def inner(space, w_self, w_args, func): @@ -921,9 +927,9 @@ return 2 if slotdef.slot_name.startswith('tp_as_sequence'): return 3 - if slodef.slot_name == 'tp_as_buffer.c_bf_getbuffer': + if slotdef.slot_name == 'tp_as_buffer.c_bf_getbuffer': return 100 - if slodef.slot_name == 'tp_as_buffer.c_bf_getreadbuffer': + if slotdef.slot_name == 'tp_as_buffer.c_bf_getreadbuffer': return 101 return 0 slotdefs = sorted(slotdefs, key=slotdef_sort_key) diff --git a/pypy/module/cpyext/test/test_memoryobject.py b/pypy/module/cpyext/test/test_memoryobject.py --- a/pypy/module/cpyext/test/test_memoryobject.py +++ b/pypy/module/cpyext/test/test_memoryobject.py @@ -13,7 +13,7 @@ assert api.PyObject_CheckBuffer(w_hello) w_view = api.PyMemoryView_FromObject(w_hello) w_char = space.call_method(w_view, '__getitem__', space.wrap(0)) - assert w_char == space.wrap('h') + assert space.eq_w(w_char, space.wrap('h')) w_bytes = space.call_method(w_view, "tobytes") assert space.unwrap(w_bytes) == "hello" _______________________________________________ pypy-commit mailing list pypy-commit@python.org https://mail.python.org/mailman/listinfo/pypy-commit