[pypy-commit] pypy numpy-record-dtypes: make record dtypes work
fijal
noreply at buildbot.pypy.org
Tue Feb 14 14:45:37 CET 2012
Author: Maciej Fijalkowski <fijall at gmail.com>
Branch: numpy-record-dtypes
Changeset: r52448:3c80e27e4f2e
Date: 2012-02-14 15:45 +0200
http://bitbucket.org/pypy/pypy/changeset/3c80e27e4f2e/
Log: make record dtypes work
diff --git a/pypy/module/micronumpy/interp_boxes.py b/pypy/module/micronumpy/interp_boxes.py
--- a/pypy/module/micronumpy/interp_boxes.py
+++ b/pypy/module/micronumpy/interp_boxes.py
@@ -184,10 +184,8 @@
except KeyError:
raise OperationError(space.w_IndexError,
space.wrap("Field %s does not exist" % item))
- self.arr.dtype.itemtype.get_element_size()
- return dtype.itemtype.read(self.arr,
- dtype.itemtype.get_element_size(), self.i,
- ofs)
+ width = self.arr.dtype.itemtype.get_element_size()
+ return dtype.itemtype.read(self.arr, width, self.i, ofs)
@unwrap_spec(item=str)
def descr_setitem(self, space, item, w_value):
@@ -196,8 +194,8 @@
except KeyError:
raise OperationError(space.w_IndexError,
space.wrap("Field %s does not exist" % item))
- dtype.itemtype.store(self.arr,
- dtype.itemtype.get_element_size(), 0, ofs,
+ width = self.arr.dtype.itemtype.get_element_size()
+ dtype.itemtype.store(self.arr, width, self.i, ofs,
dtype.coerce(space, w_value))
class W_CharacterBox(W_FlexibleBox):
diff --git a/pypy/module/micronumpy/interp_dtype.py b/pypy/module/micronumpy/interp_dtype.py
--- a/pypy/module/micronumpy/interp_dtype.py
+++ b/pypy/module/micronumpy/interp_dtype.py
@@ -112,6 +112,11 @@
def is_bool_type(self):
return self.kind == BOOLLTR
+ def __repr__(self):
+ if self.fields is not None:
+ return '<DType %r>' % self.fields
+ return '<DType %r>' % self.itemtype
+
def dtype_from_list(space, w_lst):
lst_w = space.listview(w_lst)
fields = {}
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
@@ -1806,3 +1806,7 @@
assert a[0]['x'] == 13
a[1] = (1, 2)
assert a[1]['y'] == 2
+ b = zeros(2, dtype=[('x', int), ('y', float)])
+ b[1] = a[1]
+ assert a[1]['y'] == 2
+
diff --git a/pypy/module/micronumpy/types.py b/pypy/module/micronumpy/types.py
--- a/pypy/module/micronumpy/types.py
+++ b/pypy/module/micronumpy/types.py
@@ -76,6 +76,9 @@
zero=True, flavor="raw",
track_allocation=False, add_memory_pressure=True)
+ def __repr__(self):
+ return self.__class__.__name__
+
class Primitive(object):
_mixin_ = True
@@ -644,6 +647,8 @@
@jit.unroll_safe
def coerce(self, space, dtype, w_item):
+ if isinstance(w_item, interp_boxes.W_VoidBox):
+ return w_item
from pypy.module.micronumpy.interp_numarray import W_NDimArray
# we treat every sequence as sequence, no special support
# for arrays
@@ -663,15 +668,13 @@
w_item = items_w[i]
w_box = itemtype.coerce(space, subdtype, w_item)
width = itemtype.get_element_size()
- import pdb
- pdb.set_trace()
itemtype.store(arr, width, 0, ofs, w_box)
return interp_boxes.W_VoidBox(arr, 0)
@jit.unroll_safe
def store(self, arr, width, i, ofs, box):
for k in range(width):
- arr[k + i] = box.arr.storage[k + box.i]
+ arr[k + i * width] = box.arr.storage[k + box.i * width]
for tp in [Int32, Int64]:
if tp.T == lltype.Signed:
More information about the pypy-commit
mailing list