[pypy-commit] pypy buffer-interface: extend and fix the already-existing test for __array_interfac__

mattip pypy.commits at gmail.com
Thu Sep 1 11:11:11 EDT 2016


Author: Matti Picus <matti.picus at gmail.com>
Branch: buffer-interface
Changeset: r86819:8c587f75370f
Date: 2016-09-01 17:56 +0300
http://bitbucket.org/pypy/pypy/changeset/8c587f75370f/

Log:	extend and fix the already-existing test for __array_interfac__

diff --git a/pypy/module/micronumpy/ctors.py b/pypy/module/micronumpy/ctors.py
--- a/pypy/module/micronumpy/ctors.py
+++ b/pypy/module/micronumpy/ctors.py
@@ -43,7 +43,7 @@
         raise oefmt(space.w_ValueError,
                     "object __array__ method not producing an array")
 
-def try_interface_method(space, w_object):
+def try_interface_method(space, w_object, copy):
     try:
         w_interface = space.getattr(w_object, space.wrap("__array_interface__"))
         if w_interface is None:
@@ -86,7 +86,7 @@
                                    space.isinstance_w(w_data, space.w_list)):
             data_w = space.listview(w_data)
             w_data = rffi.cast(RAW_STORAGE_PTR, space.int_w(data_w[0]))
-            read_only = space.is_true(data_w[1])
+            read_only = space.is_true(data_w[1]) or copy
             offset = 0
             w_base = w_object
             if read_only:
@@ -203,7 +203,7 @@
             # use buffer interface
             w_object = _array_from_buffer_3118(space, w_object, dtype)
     if not isinstance(w_object, W_NDimArray):
-        w_array, _copy = try_interface_method(space, w_object)
+        w_array, _copy = try_interface_method(space, w_object, copy)
         if w_array is not None:
             w_object = w_array
             copy = _copy
diff --git a/pypy/module/micronumpy/test/test_ndarray.py b/pypy/module/micronumpy/test/test_ndarray.py
--- a/pypy/module/micronumpy/test/test_ndarray.py
+++ b/pypy/module/micronumpy/test/test_ndarray.py
@@ -3215,7 +3215,9 @@
         raises(TypeError, array, Dummy({'version': 3, 'typestr': 'f8', 'shape': ('a', 3)}))
 
         a = array([1, 2, 3])
-        b = array(Dummy(a.__array_interface__))
+        d = Dummy(a.__array_interface__)
+        b = array(d)
+        assert b.base is None
         b[1] = 200
         assert a[1] == 2 # upstream compatibility, is this a bug?
         interface_a = a.__array_interface__
@@ -3226,6 +3228,8 @@
         interface_b.pop('data')
         interface_a.pop('data')
         assert interface_a == interface_b
+        b = array(d, copy=False)
+        assert b.base is d
 
         b = array(Dummy({'version':3, 'shape': (50,), 'typestr': 'u1',
                          'data': 'a'*100}))


More information about the pypy-commit mailing list