Author: Timo Paulssen <timona...@perpetuum-immobile.de> Branch: numpy-data-buffer Changeset: r47775:04889b07a351 Date: 2011-10-03 05:29 +0200 http://bitbucket.org/pypy/pypy/changeset/04889b07a351/
Log: implement buffers of slice-views. diff --git a/pypy/module/_numpy/interp_buffer.py b/pypy/module/_numpy/interp_buffer.py --- a/pypy/module/_numpy/interp_buffer.py +++ b/pypy/module/_numpy/interp_buffer.py @@ -16,5 +16,12 @@ raise IndexError("Index out of bounds (0<=index<%d)" % self.getlength()) storage = self.array.get_concrete().get_root_storage() char_data = rffi.cast(CHAR_TP, storage) - return char_data[index] + return char_data[self.calc_index(index)] + def calc_index(self, index): + return index + +class NumpyViewBuffer(NumpyBuffer): + def calc_index(self, index): + return self.array.calc_index(index) * self.array.find_dtype().num_bytes + diff --git a/pypy/module/_numpy/interp_numarray.py b/pypy/module/_numpy/interp_numarray.py --- a/pypy/module/_numpy/interp_numarray.py +++ b/pypy/module/_numpy/interp_numarray.py @@ -7,7 +7,7 @@ from pypy.rpython.lltypesystem import lltype from pypy.tool.sourcetools import func_with_new_name -from pypy.module._numpy.interp_buffer import NumpyBuffer +from pypy.module._numpy.interp_buffer import NumpyBuffer, NumpyViewBuffer numpy_driver = jit.JitDriver(greens = ['signature'], reds = ['result_size', 'i', 'self', 'result']) @@ -17,6 +17,7 @@ class BaseArray(Wrappable): _attrs_ = ["invalidates", "signature"] + BufferClass = NumpyBuffer def __init__(self): self.invalidates = [] @@ -296,7 +297,7 @@ def descr_get_data(self, space): if self._buffer is None: - self._buffer = NumpyBuffer(self) + self._buffer = self.BufferClass(self) return space.wrap(self._buffer) def convert_to_array(space, w_obj): @@ -450,11 +451,15 @@ Class for representing views of arrays, they will reflect changes of parent arrays. Example: slices """ + + BufferClass = NumpyViewBuffer + def __init__(self, parent, signature): BaseArray.__init__(self) self.signature = signature self.parent = parent self.invalidates = parent.invalidates + self._buffer = None def get_concrete(self): # in fact, ViewArray never gets "concrete" as it never stores data. diff --git a/pypy/module/_numpy/test/test_buffer.py b/pypy/module/_numpy/test/test_buffer.py --- a/pypy/module/_numpy/test/test_buffer.py +++ b/pypy/module/_numpy/test/test_buffer.py @@ -23,7 +23,6 @@ assert buf[0] == "\5" def test_slice_view(self): - skip("buffers on slicing views doesn't work yet") from _numpy import array from _numpy import dtype ar = array(range(5), dtype=dtype("int8")) _______________________________________________ pypy-commit mailing list pypy-commit@python.org http://mail.python.org/mailman/listinfo/pypy-commit