Author: Maciej Fijalkowski <fij...@gmail.com> Branch: numpy-record-dtypes Changeset: r53779:e7b2477f1ffc Date: 2012-03-18 09:30 +0200 http://bitbucket.org/pypy/pypy/changeset/e7b2477f1ffc/
Log: implement .byteorder diff --git a/REVIEW.rst b/REVIEW.rst --- a/REVIEW.rst +++ b/REVIEW.rst @@ -1,7 +1,6 @@ REVIEW ====== -* expose endianess on dtypes * RecordType.str_format should use Builder * IntP and UIntP aren't the right size, they should be the same size of rffi.VOIDP, not as Signed/Unsigned * Instead of setup() can we please have get_alignment on the Type class. 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 @@ -21,8 +21,9 @@ class W_Dtype(Wrappable): _immutable_fields_ = ["itemtype", "num", "kind"] - def __init__(self, itemtype, num, kind, name, char, w_box_type, alternate_constructors=[], aliases=[], - fields=None, fieldnames=None): + def __init__(self, itemtype, num, kind, name, char, w_box_type, + alternate_constructors=[], aliases=[], + fields=None, fieldnames=None, native=True): self.itemtype = itemtype self.num = num self.kind = kind @@ -33,6 +34,7 @@ self.aliases = aliases self.fields = fields self.fieldnames = fieldnames + self.native = native @specialize.argtype(1) def box(self, value): @@ -62,6 +64,11 @@ def descr_get_itemsize(self, space): return space.wrap(self.itemtype.get_element_size()) + def descr_get_byteorder(self, space): + if self.native: + return space.wrap('=') + return space.wrap(nonnative_byteorder_prefix) + def descr_get_alignment(self, space): return space.wrap(self.itemtype.alignment) @@ -149,11 +156,7 @@ "dtype from dict")) def variable_dtype(space, name): - if name[0] in '<>': - # ignore byte order, not sure if it's worth it for unicode only - if name[0] != byteorder_prefix and name[1] == 'U': - raise OperationError(space.w_NotImplementedError, space.wrap( - "unimplemented non-native unicode")) + if name[0] in '<>=': name = name[1:] char = name[0] if len(name) == 1: @@ -203,7 +206,7 @@ return cache.dtypes_by_name[name] except KeyError: pass - if name[0] in 'VSU' or name[0] in '<>' and name[1] in 'VSU': + if name[0] in 'VSU' or name[0] in '<>=' and name[1] in 'VSU': return variable_dtype(space, name) elif space.isinstance_w(w_dtype, space.w_list): return dtype_from_list(space, w_dtype) @@ -231,6 +234,7 @@ kind = interp_attrproperty("kind", cls=W_Dtype), char = interp_attrproperty("char", cls=W_Dtype), type = interp_attrproperty_w("w_box_type", cls=W_Dtype), + byteorder = GetSetProperty(W_Dtype.descr_get_byteorder), itemsize = GetSetProperty(W_Dtype.descr_get_itemsize), alignment = GetSetProperty(W_Dtype.descr_get_alignment), shape = GetSetProperty(W_Dtype.descr_get_shape), @@ -446,12 +450,14 @@ can_name = dtype.kind + str(dtype.itemtype.get_element_size()) self.dtypes_by_name[can_name] = dtype self.dtypes_by_name[byteorder_prefix + can_name] = dtype + self.dtypes_by_name['=' + can_name] = dtype new_name = nonnative_byteorder_prefix + can_name itemtypename = dtype.itemtype.__class__.__name__ itemtype = getattr(types, 'NonNative' + itemtypename)() self.dtypes_by_name[new_name] = W_Dtype( itemtype, - dtype.num, dtype.kind, new_name, dtype.char, dtype.w_box_type) + dtype.num, dtype.kind, new_name, dtype.char, dtype.w_box_type, + native=False) for alias in dtype.aliases: self.dtypes_by_name[alias] = dtype self.dtypes_by_name[dtype.char] = dtype diff --git a/pypy/module/micronumpy/test/test_base.py b/pypy/module/micronumpy/test/test_base.py --- a/pypy/module/micronumpy/test/test_base.py +++ b/pypy/module/micronumpy/test/test_base.py @@ -4,7 +4,8 @@ from pypy.module.micronumpy.interp_ufuncs import (find_binop_result_dtype, find_unaryop_result_dtype) from pypy.module.micronumpy.interp_boxes import W_Float64Box -from pypy.module.micronumpy.interp_dtype import nonnative_byteorder_prefix +from pypy.module.micronumpy.interp_dtype import nonnative_byteorder_prefix,\ + byteorder_prefix from pypy.conftest import option import sys @@ -17,6 +18,7 @@ sys.modules['_numpypy'] = numpy cls.space = gettestobjspace(usemodules=['micronumpy']) cls.w_non_native_prefix = cls.space.wrap(nonnative_byteorder_prefix) + cls.w_native_prefix = cls.space.wrap(byteorder_prefix) class TestSignature(object): def test_binop_signature(self, space): 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 @@ -458,8 +458,13 @@ def test_alternate_constructs(self): from _numpypy import dtype - assert dtype('i8') == dtype('<i8')# XXX should be equal == dtype(long) - assert dtype(self.non_native_prefix + 'i8') != dtype('i8') + nnp = self.non_native_prefix + byteorder = self.native_prefix + assert dtype('i8') == dtype(byteorder + 'i8') == dtype('=i8') # XXX should be equal == dtype(long) + assert dtype(nnp + 'i8') != dtype('i8') + assert dtype(nnp + 'i8').byteorder == nnp + assert dtype('=i8').byteorder == '=' + assert dtype(byteorder + 'i8').byteorder == '=' def test_alignment(self): from _numpypy import dtype _______________________________________________ pypy-commit mailing list pypy-commit@python.org http://mail.python.org/mailman/listinfo/pypy-commit