Author: Richard Plangger <planri...@gmail.com> Branch: py3.5 Changeset: r89545:92c913693d64 Date: 2017-01-13 17:20 +0100 http://bitbucket.org/pypy/pypy/changeset/92c913693d64/
Log: duplicate code, translation issue diff --git a/pypy/module/cpyext/memoryobject.py b/pypy/module/cpyext/memoryobject.py --- a/pypy/module/cpyext/memoryobject.py +++ b/pypy/module/cpyext/memoryobject.py @@ -8,7 +8,7 @@ from rpython.rtyper.lltypesystem import lltype, rffi from rpython.rlib.rarithmetic import widen from pypy.interpreter.error import oefmt -from pypy.objspace.std.memoryobject import W_MemoryView, _pybuffer_iscontiguous +from pypy.objspace.std.memoryobject import W_MemoryView from pypy.module.cpyext.object import _dealloc from pypy.module.cpyext.import_ import PyImport_Import @@ -164,8 +164,41 @@ view.c_internal = lltype.nullptr(rffi.VOIDP.TO) return 0 -# If you are looking for _IsFortran/CContiguous look in -# pypy/module/cpyext/memoryobject.py +def _IsFortranContiguous(view): + ndim = widen(view.c_ndim) + if ndim == 0: + return 1 + if not view.c_strides: + return ndim == 1 + sd = view.c_itemsize + if ndim == 1: + return view.c_shape[0] == 1 or sd == view.c_strides[0] + for i in range(view.c_ndim): + dim = view.c_shape[i] + if dim == 0: + return 1 + if view.c_strides[i] != sd: + return 0 + sd *= dim + return 1 + +def _IsCContiguous(view): + ndim = widen(view.c_ndim) + if ndim == 0: + return 1 + if not view.c_strides: + return ndim == 1 + sd = view.c_itemsize + if ndim == 1: + return view.c_shape[0] == 1 or sd == view.c_strides[0] + for i in range(ndim - 1, -1, -1): + dim = view.c_shape[i] + if dim == 0: + return 1 + if view.c_strides[i] != sd: + return 0 + sd *= dim + return 1 @cpython_api([Py_bufferP, lltype.Char], rffi.INT_real, error=CANNOT_FAIL) def PyBuffer_IsContiguous(space, view, fort): @@ -175,12 +208,15 @@ # traverse the strides, checking for consistent stride increases from # right-to-left (c) or left-to-right (fortran). Copied from cpython - # plan_rich: I wanted to reuse this check in pypy/objspace/std/... - # memoryview.py, thus I have rewritten it, maybe it is time to - # find a way to share this code? - return _pybuffer_iscontiguous(view.c_suboffsets, - widen(view.c_ndim), view.c_shape, view.c_strides, - view.c_itemsize, fort) + if view.c_suboffsets: + return 0 + if (fort == 'C'): + return _IsCContiguous(view) + elif (fort == 'F'): + return _IsFortranContiguous(view) + elif (fort == 'A'): + return (_IsCContiguous(view) or _IsFortranContiguous(view)) + return 0 @cpython_api([PyObject], PyObject, result_is_ll=True) def PyMemoryView_FromObject(space, w_obj): 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 @@ -582,10 +582,10 @@ shape = self.getshape() strides = self.getstrides() itemsize = self.getitemsize() - if _pybuffer_iscontiguous(None, ndim, shape, strides, + if PyBuffer_isContiguous(None, ndim, shape, strides, itemsize, 'C'): flags |= MEMORYVIEW_C - if _pybuffer_iscontiguous(None, ndim, shape, strides, + if PyBuffer_isContiguous(None, ndim, shape, strides, itemsize, 'F'): flags |= MEMORYVIEW_C @@ -762,8 +762,7 @@ sd *= dim return 1 -@always_inline -def _pybuffer_iscontiguous(suboffsets, ndim, shape, strides, itemsize, fort): +def PyBuffer_isContiguous(suboffsets, ndim, shape, strides, itemsize, fort): if suboffsets: return 0 if (fort == 'C'): _______________________________________________ pypy-commit mailing list pypy-commit@python.org https://mail.python.org/mailman/listinfo/pypy-commit