[pypy-commit] pypy ndarray-buffer: first passing test: only buffers which implement get_raw_address are supported of course, because the others can be movable
antocuni
noreply at buildbot.pypy.org
Tue Nov 19 14:51:12 CET 2013
Author: Antonio Cuni <anto.cuni at gmail.com>
Branch: ndarray-buffer
Changeset: r68240:b9d813cc6c0a
Date: 2013-11-19 12:21 +0100
http://bitbucket.org/pypy/pypy/changeset/b9d813cc6c0a/
Log: first passing test: only buffers which implement get_raw_address are
supported of course, because the others can be movable
diff --git a/pypy/module/micronumpy/interp_numarray.py b/pypy/module/micronumpy/interp_numarray.py
--- a/pypy/module/micronumpy/interp_numarray.py
+++ b/pypy/module/micronumpy/interp_numarray.py
@@ -1,3 +1,5 @@
+from rpython.rtyper.lltypesystem import rffi
+from rpython.rlib.rawstorage import RAW_STORAGE_PTR
from pypy.interpreter.error import operationerrfmt, OperationError
from pypy.interpreter.typedef import TypeDef, GetSetProperty, make_weakref_descr
from pypy.interpreter.gateway import interp2app, unwrap_spec, applevel, \
@@ -1065,13 +1067,27 @@
offset=0, w_strides=None, order='C'):
from pypy.module.micronumpy.arrayimpl.concrete import ConcreteArray
from pypy.module.micronumpy.support import calc_strides
- if (offset != 0 or not space.is_none(w_strides) or
- not space.is_none(w_buffer)):
+ if (offset != 0 or not space.is_none(w_strides)):
raise OperationError(space.w_NotImplementedError,
space.wrap("unsupported param"))
+
dtype = space.interp_w(interp_dtype.W_Dtype,
space.call_function(space.gettypefor(interp_dtype.W_Dtype), w_dtype))
shape = _find_shape(space, w_shape, dtype)
+
+ if not space.is_none(w_buffer):
+ buf = space.buffer_w(w_buffer)
+ try:
+ raw_ptr = buf.get_raw_address()
+ except ValueError:
+ raise OperationError(space.w_TypeError, space.wrap(
+ "Only raw buffers are supported"))
+ if not shape:
+ raise OperationError(space.w_TypeError, space.wrap(
+ "numpy scalars from buffers not supported yet"))
+ storage = rffi.cast(RAW_STORAGE_PTR, raw_ptr)
+ return W_NDimArray.from_shape_and_storage(space, shape, storage, dtype)
+
if not shape:
return W_NDimArray.new_scalar(space, dtype)
if space.is_w(w_subtype, space.gettypefor(W_NDimArray)):
@@ -1091,8 +1107,6 @@
Create an array from an existing buffer, given its address as int.
PyPy-only implementation detail.
"""
- from rpython.rtyper.lltypesystem import rffi
- from rpython.rlib.rawstorage import RAW_STORAGE_PTR
storage = rffi.cast(RAW_STORAGE_PTR, addr)
dtype = space.interp_w(interp_dtype.W_Dtype,
space.call_function(space.gettypefor(interp_dtype.W_Dtype),
diff --git a/pypy/module/micronumpy/test/test_numarray.py b/pypy/module/micronumpy/test/test_numarray.py
--- a/pypy/module/micronumpy/test/test_numarray.py
+++ b/pypy/module/micronumpy/test/test_numarray.py
@@ -218,7 +218,7 @@
assert get(1, 1) == 3
class AppTestNumArray(BaseNumpyAppTest):
- spaceconfig = dict(usemodules=["micronumpy", "struct", "binascii"])
+ spaceconfig = dict(usemodules=["micronumpy", "struct", "binascii", "array"])
def w_CustomIndexObject(self, index):
class CustomIndexObject(object):
def __init__(self, index):
@@ -2087,6 +2087,17 @@
a = np.ndarray([1], dtype=bool)
assert a[0] == True
+ def test_ndarray_from_buffer(self):
+ import numpypy as np
+ import array
+ buf = array.array('c', ['\x00']*2*3)
+ a = np.ndarray((3,), buffer=buf, dtype='i2')
+ a[0] = ord('b')
+ a[1] = ord('a')
+ a[2] = ord('r')
+ assert list(buf) == ['b', '\x00', 'a', '\x00', 'r', '\x00']
+
+
class AppTestMultiDim(BaseNumpyAppTest):
def test_init(self):
import numpypy
More information about the pypy-commit
mailing list