Author: Richard Plangger <planri...@gmail.com> Branch: py3.5-ssl Changeset: r88830:bd39209dafe3 Date: 2016-12-02 17:51 +0100 http://bitbucket.org/pypy/pypy/changeset/bd39209dafe3/
Log: fixed slicelength and parameter to decode_index4, renamed some methods, [::-1] for multi dim. memoryview works diff --git a/pypy/module/struct/formatiterator.py b/pypy/module/struct/formatiterator.py --- a/pypy/module/struct/formatiterator.py +++ b/pypy/module/struct/formatiterator.py @@ -159,13 +159,12 @@ def skip(self, count): # assumption: UnpackFormatIterator only iterates over - # flat structures (continous memory) either, forward (index - # is increasing) or reverse + # flat structures (continous memory) either: forward (index + # grows) or reverse if self.strides: assert len(self.strides) == 1 - end = self.pos + count * self.strides[0] - else: - end = self.pos + count + count = self.strides[0] + end = self.pos + count if end > self.length: raise StructError("unpack str size too short for format") self.pos = end diff --git a/pypy/objspace/std/memoryobject.py b/pypy/objspace/std/memoryobject.py --- a/pypy/objspace/std/memoryobject.py +++ b/pypy/objspace/std/memoryobject.py @@ -199,7 +199,6 @@ items = [None] * dimshape for i in range(dimshape): - import pdb; pdb.set_trace() buf = SubBuffer(buf, start, stride) item = self._tolist_rec(space, buf, start, idim+1, fmt) items[i] = item @@ -267,7 +266,8 @@ if space.isinstance_w(w_index, space.w_tuple): return self._getitem_tuple_indexed(space, w_index) - start, stop, step, size = space.decode_index4(w_index, self.getlength()) + shape = self.getshape() + start, stop, step, slicelength = space.decode_index4(w_index, shape[0]) # ^^^ for a non-slice index, this returns (index, 0, 0, 1) if step == 0: # index only itemsize = self.getitemsize() @@ -289,28 +289,27 @@ return fmtiter.result_w[0] elif step == 1: mv = W_MemoryView.copy(self) - mv.slice(start, step, size) + mv.init_slice(start, stop, step, slicelength, 0) mv._init_flags() return mv else: mv = W_MemoryView.copy(self) - mv.slice(start, step, size) - mv.length = mv.bytecount_from_shape() + mv.init_slice(start, stop, step, slicelength, 0) + mv.init_len() mv._init_flags() return mv - def slice(self, start, step, size): + def init_slice(self, start, stop, step, slicelength, dim): # modifies the buffer, shape and stride to allow step to be > 1 # TODO subbuffer - strides = self.getstrides()[:] - shape = self.getshape()[:] - itemsize = self.getitemsize() - dim = 0 - self.buf = SubBuffer(self.buf, strides[dim] * start, itemsize) - shape[dim] = size + self.strides = strides = self.getstrides()[:] + self.shape = shape = self.getshape()[:] + self.buf = SubBuffer(self.buf, strides[dim] * start, slicelength) + shape[dim] = slicelength strides[dim] = strides[dim] * step - self.strides = strides - self.shape = shape + + def init_len(self): + self.length = self.bytecount_from_shape() def bytecount_from_shape(self): dim = self.getndim() @@ -629,8 +628,6 @@ return None def _cast_to_ND(self, space, shape, ndim): - buf = self.buf - self.ndim = ndim length = self.itemsize if ndim == 0: diff --git a/pypy/objspace/std/test/test_memoryobject.py b/pypy/objspace/std/test/test_memoryobject.py --- a/pypy/objspace/std/test/test_memoryobject.py +++ b/pypy/objspace/std/test/test_memoryobject.py @@ -437,6 +437,6 @@ view = memoryview(bytes) bview = view.cast('b') rview = bview.cast(fmt, shape=(2,3)) + raises(NotImplementedError, list, reversed(rview)) assert rview.tolist() == [[1,2,3],[9,7,5]] - assert rview[::-1].tolist() == [[3,2,1], [5,7,9]] - raises(NotImplementedError, list, reversed(rview)) + assert rview[::-1].tolist() == [[9,7,5], [1,2,3]] _______________________________________________ pypy-commit mailing list pypy-commit@python.org https://mail.python.org/mailman/listinfo/pypy-commit