Author: Matti Picus <matti.pi...@gmail.com> Branch: Changeset: r87581:a605536d9aab Date: 2016-10-04 20:32 +0300 http://bitbucket.org/pypy/pypy/changeset/a605536d9aab/
Log: merge heads diff --git a/pypy/module/micronumpy/concrete.py b/pypy/module/micronumpy/concrete.py --- a/pypy/module/micronumpy/concrete.py +++ b/pypy/module/micronumpy/concrete.py @@ -4,6 +4,7 @@ from rpython.rlib.listsort import make_timsort_class from rpython.rlib.buffer import Buffer from rpython.rlib.debug import make_sure_not_resized +from rpython.rlib.rstring import StringBuilder from rpython.rlib.rawstorage import alloc_raw_storage, free_raw_storage, \ raw_storage_getitem, raw_storage_setitem, RAW_STORAGE from rpython.rtyper.lltypesystem import rffi, lltype, llmemory @@ -725,7 +726,9 @@ return rffi.ptradd(self.impl.storage, self.impl.start) def getformat(self): - return self.impl.dtype.char + sb = StringBuilder() + self.impl.dtype.getformat(sb) + return sb.build() def getitemsize(self): return self.impl.dtype.elsize diff --git a/pypy/module/micronumpy/descriptor.py b/pypy/module/micronumpy/descriptor.py --- a/pypy/module/micronumpy/descriptor.py +++ b/pypy/module/micronumpy/descriptor.py @@ -24,7 +24,6 @@ return space.interp_w( W_Dtype, space.call_function(space.gettypefor(W_Dtype), w_dtype)) - @jit.unroll_safe def dtype_agreement(space, w_arr_list, shape, out=None): """ agree on dtype from a list of arrays. if out is allocated, @@ -179,6 +178,38 @@ assert dtype.is_float() return dtype + def getformat(self, stringbuilder): + # adapted from _buffer_format_string in multiarray/buffer.c + # byte-order not supported yet + if self.is_record(): + #subs = sorted(self.fields.items(), key=lambda (k,v): v[0]) + subs = [] + for name in self.fields: + offset, dtyp = self.fields[name] + i = 0 + for i in range(len(subs)): + if offset < subs[i][0]: + break + else: + i = len(subs) + subs.insert(i, (offset, dtyp, name)) + start = 0 + stringbuilder.append('T{') + for s in subs: + stringbuilder.append('x' * (s[0] - start)) + start = s[0] + s[1].elsize + s[1].getformat(stringbuilder) + stringbuilder.append(':') + stringbuilder.append(s[2]) + stringbuilder.append(':') + stringbuilder.append('}') + else: + if self.byteorder == NPY.OPPBYTE: + raise oefmt(self.itemtype.space.w_NotImplementedError, + "non-native byte order not supported yet") + # even if not, NumPy adds a '=', '@', for 'i' types + stringbuilder.append(self.char) + def get_name(self): name = self.w_box_type.getname(self.itemtype.space) if name.endswith('_'): @@ -743,6 +774,9 @@ offsets[j+1] = delta + offsets[j] if i + 1 < len(offsets) and offsets[i + 1] == 0: offsets[i + 1] = offsets[i] + max(delta, subdtype.elsize) + # sanity check + if offsets[i] % maxalign: + offsets[i] = ((offsets[i] // maxalign) + 1) * maxalign elif not use_supplied_offsets: if i + 1 < len(offsets) and offsets[i + 1] == 0: offsets[i+1] = offsets[i] + subdtype.elsize diff --git a/pypy/module/micronumpy/test/test_ndarray.py b/pypy/module/micronumpy/test/test_ndarray.py --- a/pypy/module/micronumpy/test/test_ndarray.py +++ b/pypy/module/micronumpy/test/test_ndarray.py @@ -3668,6 +3668,28 @@ assert z.dtype == 'O' assert (z == x).all() + dt1 = np.dtype( + [('a', 'b'), ('b', 'i'), ('sub', np.dtype('b,i')), ('c', 'i')], + align=True) + x = np.arange(dt1.itemsize, dtype=np.int8).view(dt1) + y = memoryview(x) + if '__pypy__' in sys.builtin_module_names: + assert y.format == 'T{b:a:xxxi:b:T{b:f0:i:f1:}:sub:xxxi:c:}' + else: + assert y.format == 'T{b:a:xxxi:b:T{b:f0:=i:f1:}:sub:xxx@i:c:}' + + + dt1 = np.dtype( + [('a', 'b'), ('b', 'i'), ('sub', np.dtype('b,i')), ('c', 'i')], + align=True) + x = np.arange(dt1.itemsize, dtype=np.int8).view(dt1) + y = memoryview(x) + if '__pypy__' in sys.builtin_module_names: + assert y.format == 'T{b:a:xxxi:b:T{b:f0:i:f1:}:sub:xxxi:c:}' + else: + assert y.format == 'T{b:a:xxxi:b:T{b:f0:=i:f1:}:sub:xxx@i:c:}' + + def test_fromstring(self): import sys from numpy import fromstring, dtype _______________________________________________ pypy-commit mailing list pypy-commit@python.org https://mail.python.org/mailman/listinfo/pypy-commit