summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--numpy/f2py/src/fortranobject.c4
-rw-r--r--numpy/f2py/tests/test_array_from_pyobj.py13
2 files changed, 15 insertions, 2 deletions
diff --git a/numpy/f2py/src/fortranobject.c b/numpy/f2py/src/fortranobject.c
index 3275f90ad..b9ef18701 100644
--- a/numpy/f2py/src/fortranobject.c
+++ b/numpy/f2py/src/fortranobject.c
@@ -799,7 +799,7 @@ PyArrayObject* array_from_pyobj(const int type_num,
&& ARRAY_ISCOMPATIBLE(arr,type_num)
&& F2PY_CHECK_ALIGNMENT(arr, intent)
) {
- if ((intent & F2PY_INTENT_C)?PyArray_ISCARRAY(arr):PyArray_ISFARRAY(arr)) {
+ if ((intent & F2PY_INTENT_C)?PyArray_ISCARRAY_RO(arr):PyArray_ISFARRAY_RO(arr)) {
if ((intent & F2PY_INTENT_OUT)) {
Py_INCREF(arr);
}
@@ -807,9 +807,9 @@ PyArrayObject* array_from_pyobj(const int type_num,
return arr;
}
}
-
if (intent & F2PY_INTENT_INOUT) {
strcpy(mess, "failed to initialize intent(inout) array");
+ /* Must use PyArray_IS*ARRAY because intent(inout) requires writable input */
if ((intent & F2PY_INTENT_C) && !PyArray_ISCARRAY(arr))
strcat(mess, " -- input not contiguous");
if (!(intent & F2PY_INTENT_C) && !PyArray_ISFARRAY(arr))
diff --git a/numpy/f2py/tests/test_array_from_pyobj.py b/numpy/f2py/tests/test_array_from_pyobj.py
index 0524da342..77149e4e7 100644
--- a/numpy/f2py/tests/test_array_from_pyobj.py
+++ b/numpy/f2py/tests/test_array_from_pyobj.py
@@ -233,6 +233,7 @@ class Array:
order=self.intent.is_intent('c') and 'C' or 'F')
assert_(self.pyarr.dtype == typ,
repr((self.pyarr.dtype, typ)))
+ self.pyarr.setflags(write=self.arr.flags['WRITEABLE'])
assert_(self.pyarr.flags['OWNDATA'], (obj, intent))
self.pyarr_attr = wrap.array_attrs(self.pyarr)
@@ -326,6 +327,18 @@ class TestSharedMemory:
else:
assert_(not a.has_shared_memory(), repr(t.dtype))
+ @pytest.mark.parametrize('write', ['w', 'ro'])
+ @pytest.mark.parametrize('order', ['C', 'F'])
+ @pytest.mark.parametrize('inp', ['2seq', '23seq'])
+ def test_in_nocopy(self, write, order, inp):
+ """Test if intent(in) array can be passed without copies
+ """
+ seq = getattr(self, 'num' + inp)
+ obj = np.array(seq, dtype=self.type.dtype, order=order)
+ obj.setflags(write=(write == 'w'))
+ a = self.array(obj.shape, ((order=='C' and intent.in_.c) or intent.in_), obj)
+ assert a.has_shared_memory()
+
def test_inout_2seq(self):
obj = np.array(self.num2seq, dtype=self.type.dtype)
a = self.array([len(self.num2seq)], intent.inout, obj)