Author: Romain Guillebert <[email protected]>
Branch: numpy-pickle
Changeset: r63948:bf43d52d5d8b
Date: 2013-05-09 22:07 +0200
http://bitbucket.org/pypy/pypy/changeset/bf43d52d5d8b/

Log:    Implement pickling for record dtypes

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
@@ -137,18 +137,22 @@
         if w_fields == space.w_None:
             self.fields = None
         else:
-            iter = space.iter(w_fields)
-            while True:
-                try:
-                    key = space.next(iter)
-                    value = space.getitem(w_fields, key)
-                    dtype = space.getitem(value, space.wrap(0))
-                    assert isinstance(dtype, W_Dtype)
-                    self.fields[space.str_w(space.next(iter))] = 
space.int_w(space.getitem(value, space.wrap(1))), dtype
-                except OperationError, e:
-                    if not e.match(space, space.w_StopIteration):
-                        raise
-                    break
+            ofs_and_items = []
+            size = 0
+            for key in space.listview(w_fields):
+                value = space.getitem(w_fields, key)
+
+                dtype = space.getitem(value, space.wrap(0))
+                assert isinstance(dtype, W_Dtype)
+
+                offset = space.int_w(space.getitem(value, space.wrap(1)))
+                self.fields[space.str_w(key)] = offset, dtype
+
+                ofs_and_items.append((offset, dtype.itemtype))
+                size += dtype.itemtype.get_element_size()
+
+            self.itemtype = types.RecordType(ofs_and_items, size)
+            self.name = "void" + str(8 * self.itemtype.get_element_size())
 
     def descr_get_names(self, space):
         if self.fieldnames is None:
@@ -249,11 +253,12 @@
 
         self.native = space.str_w(space.getitem(w_data, space.wrap(1))) == 
byteorder_prefix
 
-        fieldnames = space.getitem(w_data, space.wrap(2))
+        fieldnames = space.getitem(w_data, space.wrap(3))
         self.set_names(space, fieldnames)
 
-        fields = space.getitem(w_data, space.wrap(3))
+        fields = space.getitem(w_data, space.wrap(4))
         self.set_fields(space, fields)
+        print self.itemtype
 
 class W_ComplexDtype(W_Dtype):
     def __init__(self, itemtype, num, kind, name, char, w_box_type,
@@ -313,8 +318,7 @@
         num = 20
         basename = 'void'
         w_box_type = space.gettypefor(interp_boxes.W_VoidBox)
-        raise OperationError(space.w_NotImplementedError, space.wrap(
-            "pure void dtype"))
+        return dtype_from_list(space, space.newlist([]))
     else:
         assert char == 'U'
         basename = 'unicode'
diff --git a/pypy/module/micronumpy/test/test_dtypes.py 
b/pypy/module/micronumpy/test/test_dtypes.py
--- a/pypy/module/micronumpy/test/test_dtypes.py
+++ b/pypy/module/micronumpy/test/test_dtypes.py
@@ -281,9 +281,13 @@
     def test_pickle_record(self):
         from numpypy import array, dtype
         from cPickle import loads, dumps
-        skip("TODO")
-        a = array(([0, 0], [0, 0]), dtype=[('x', '<i8', (2,)), ('y', '<i4', 
(2,))])
-        assert loads(dumps(a.dtype)) == a.dtype
+
+        d = dtype([("x", "int32"), ("y", "int32"), ("z", "int32"), ("value", 
float)])
+        assert d.__reduce__() == (dtype, ('V20', 0, 1), (3, '<', None, ('x', 
'y', 'z', 'value'), {'y': (dtype('int32'), 4), 'x': (dtype('int32'), 0), 'z': 
(dtype('int32'), 8), 'value': (dtype('float64'), 12)}, 20, 1, 0))
+
+        new_d = loads(dumps(d))
+
+        assert new_d.__reduce__() == d.__reduce__()
 
 class AppTestTypes(BaseAppTestDtypes):
     def test_abstract_types(self):
_______________________________________________
pypy-commit mailing list
[email protected]
http://mail.python.org/mailman/listinfo/pypy-commit

Reply via email to