[pypy-svn] r46230 - in pypy/dist/pypy/rpython/numpy: . test
simonb at codespeak.net
simonb at codespeak.net
Fri Aug 31 22:41:47 CEST 2007
Author: simonb
Date: Fri Aug 31 22:41:45 2007
New Revision: 46230
Modified:
pypy/dist/pypy/rpython/numpy/rarray.py
pypy/dist/pypy/rpython/numpy/test/test_array.py
Log:
add a dataptr attribute that points inside a GcArray
Modified: pypy/dist/pypy/rpython/numpy/rarray.py
==============================================================================
--- pypy/dist/pypy/rpython/numpy/rarray.py (original)
+++ pypy/dist/pypy/rpython/numpy/rarray.py Fri Aug 31 22:41:45 2007
@@ -30,6 +30,7 @@
array.strides[i] = itemsize
itemsize *= size
array.data = malloc(ARRAY.data.TO, itemsize)
+ array.dataptr = direct_arrayitems(array.data)
return array
return ll_build_from_shape
@@ -44,7 +45,8 @@
return shape
return ll_get_shape
-NPY_INTP = Signed # index type (see Py_intptr_t)
+NPY_INTP = Signed # XX index type (see Py_intptr_t)
+
def ARRAY_ITER(ARRAY, INDEXARRAY):
ITER = Ptr(
GcStruct("array_iter",
@@ -57,7 +59,7 @@
("backstrides", INDEXARRAY),
#("factors", INDEXARRAY),
("ao", ARRAY),
- ("dataptr", Ptr(FixedSizeArray(ARRAY.TO.data.TO.OF, 1))), # pointer to current item
+ ("dataptr", ARRAY.TO.dataptr), # pointer to current item
#("contiguous", Bool),
))
return ITER
@@ -75,12 +77,13 @@
def ll_iter_reset(it):
it.index = 0
- it.dataptr = direct_arrayitems(it.ao.data)
+ it.dataptr = it.ao.dataptr
for i in unroll_ndim:
it.coordinates[i] = 0
ll_iter_reset._always_inline_ = True
def ll_iter_new(ITER, ao, iter_reset=ll_iter_reset):
+ assert ao.dataptr
it = malloc(ITER)
it.ao = ao
it.nd_m1 = ndim - 1
@@ -165,8 +168,10 @@
self.INDEXARRAY = FixedSizeArray(NPY_INTP, self.ndim)
self.itemsize = sizeof(self.ITEM)
FORWARD = GcForwardReference()
+ DATA_PTR = Ptr(FixedSizeArray(self.ITEM, 1))
STRUCT = GcStruct("array",
("data", Ptr(ITEMARRAY)), # pointer to raw data buffer
+ ("dataptr", DATA_PTR), # pointer to first element
("ndim", Signed), # number of dimensions
("shape", self.INDEXARRAY), # size in each dimension
("strides", self.INDEXARRAY), # elements to jump to get to the
@@ -326,31 +331,34 @@
array = malloc(ARRAY)
array.ndim = ndim
array.base = nullptr(ARRAY)
+ array.data = nullptr(ARRAY.data.TO)
+ array.dataptr = nullptr(ARRAY.dataptr.TO)
return array
def ll_build_from_list(ARRAY, lst):
size = lst.ll_length()
array = ll_allocate(ARRAY, 1)
- for i in range(array.ndim):
- array.shape[i] = size
- array.strides[i] = 1
- data = array.data = malloc(ARRAY.data.TO, size)
+ array.shape[0] = size
+ array.strides[0] = 1
+ array.data = malloc(ARRAY.data.TO, size)
i = 0
while i < size:
- data[i] = lst.ll_getitem_fast(i)
+ array.data[i] = lst.ll_getitem_fast(i)
i += 1
+ array.dataptr = direct_arrayitems(array.data)
return array
-def ll_build_alias(ARRAY, array):
- new_array = ll_allocate(ARRAY, array.ndim)
- new_array.data = array.data # alias data
- new_array.base = array
- if array.base:
- new_array.base = array.base
- for i in range(array.ndim):
- new_array.shape[i] = array.shape[i]
- new_array.strides[i] = array.strides[i]
- return new_array
+def ll_build_alias(ARRAY, ao):
+ array = ll_allocate(ARRAY, ao.ndim)
+ array.data = ao.data # alias data
+ array.base = ao
+ if ao.base:
+ array.base = ao.base
+ for i in range(ao.ndim):
+ array.shape[i] = ao.shape[i]
+ array.strides[i] = ao.strides[i]
+ array.dataptr = ao.dataptr
+ return array
def ll_setitem1(l, index, item):
l.data[index] = item
@@ -368,6 +376,7 @@
while i < size:
array.data[i] = a1.data[i] + a2.data[i]
i += 1
+ array.dataptr = direct_arrayitems(array.data)
return array
def ll_transpose(ARRAY, a1):
Modified: pypy/dist/pypy/rpython/numpy/test/test_array.py
==============================================================================
--- pypy/dist/pypy/rpython/numpy/test/test_array.py (original)
+++ pypy/dist/pypy/rpython/numpy/test/test_array.py Fri Aug 31 22:41:45 2007
@@ -250,6 +250,8 @@
return a
res = interpret(f, [])
+ # Note that the real numpy defines strides to be a byte-count
+ # but we return an element count ATM.
assert res.strides[0] == 20
assert res.strides[1] == 5
assert res.strides[2] == 1
More information about the Pypy-commit
mailing list