Author: Alex Gaynor <alex.gay...@gmail.com> Branch: numpy-record-type-pure-python Changeset: r52869:e716ec8de597 Date: 2012-02-24 13:41 -0500 http://bitbucket.org/pypy/pypy/changeset/e716ec8de597/
Log: handle string 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 @@ -138,6 +138,9 @@ else: raise OperationError(space.w_TypeError, space.wrap("data type not understood")) +def dtype_from_list(space, items_w): + pass + def is_byteorder(ch): return ch == ">" or ch == "<" or ch == "|" or ch == "=" @@ -188,6 +191,7 @@ typestr = space.str_w(w_obj) w_base_dtype = None + elsize = -1 if not typestr: raise invalid_dtype(space, w_obj) @@ -230,12 +234,21 @@ if (dtype.kind == kind and dtype.itemtype.get_element_size() == elsize): w_base_dtype = dtype + elsize = -1 break else: raise invalid_dtype(space, w_obj) if w_base_dtype is not None: - if elsize is not None: + if elsize != -1: + itemtype = w_base_dtype.itemtype.array(elsize) + w_base_dtype = W_Dtype( + itemtype, w_base_dtype.num, w_base_dtype.kind, + w_base_dtype.name + str(itemtype.get_element_size() * 8), + w_base_dtype.char, w_base_dtype.w_box_type, + byteorder=w_base_dtype.byteorder, + builtin_type=w_base_dtype.builtin_type + ) if endian != "=" and endian != nonnative_byteorder_prefix: endian = "=" if (endian != "=" and w_base_dtype.byteorder != "|" and 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 @@ -128,7 +128,7 @@ width, storage, i, offset, value) else: libffi.array_setitem_T(self.T, width, storage, i, offset, value) - + def store(self, arr, width, i, offset, box): self._write(arr.storage, width, i, offset, self.unbox(box)) @@ -229,7 +229,7 @@ class NonNativePrimitive(Primitive): _mixin_ = True - + def _read(self, storage, width, i, offset): return byteswap(Primitive._read(self, storage, width, i, offset)) @@ -448,7 +448,7 @@ class NonNativeInt64(BaseType, NonNativeInteger): T = rffi.LONGLONG BoxType = interp_boxes.W_Int64Box - format_code = "q" + format_code = "q" def _uint64_coerce(self, space, w_item): try: @@ -611,7 +611,7 @@ class NonNativeFloat32(BaseType, NonNativeFloat): T = rffi.FLOAT BoxType = interp_boxes.W_Float32Box - format_code = "f" + format_code = "f" class Float64(BaseType, Float): T = rffi.DOUBLE @@ -633,13 +633,16 @@ class BaseStringType(object): _mixin_ = True - + def __init__(self, size=0): self.size = size def get_element_size(self): return self.size * rffi.sizeof(self.T) + def array(self, size): + return type(self)(size) + class StringType(BaseType, BaseStringType): T = lltype.Char @@ -656,12 +659,12 @@ class RecordType(CompositeType): T = lltype.Char - + def read(self, arr, width, i, offset): return interp_boxes.W_VoidBox(arr, i) @jit.unroll_safe - def coerce(self, space, dtype, w_item): + def coerce(self, space, dtype, w_item): from pypy.module.micronumpy.interp_numarray import W_NDimArray if isinstance(w_item, interp_boxes.W_VoidBox): _______________________________________________ pypy-commit mailing list pypy-commit@python.org http://mail.python.org/mailman/listinfo/pypy-commit