[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