[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