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