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

Reply via email to