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