Author: Brian Kearns <[email protected]>
Branch: 
Changeset: r69348:528cf66eae75
Date: 2014-02-24 02:32 -0500
http://bitbucket.org/pypy/pypy/changeset/528cf66eae75/

Log:    provide dtype.isbuiltin

diff --git a/pypy/module/micronumpy/arrayimpl/sort.py 
b/pypy/module/micronumpy/arrayimpl/sort.py
--- a/pypy/module/micronumpy/arrayimpl/sort.py
+++ b/pypy/module/micronumpy/arrayimpl/sort.py
@@ -12,7 +12,7 @@
 from rpython.rlib.objectmodel import specialize
 from pypy.interpreter.error import OperationError, oefmt
 from pypy.module.micronumpy.base import W_NDimArray
-from pypy.module.micronumpy import interp_dtype, types
+from pypy.module.micronumpy import interp_dtype, types, constants as NPY
 from pypy.module.micronumpy.iter import AxisIterator
 
 INT_SIZE = rffi.sizeof(lltype.Signed)
@@ -310,9 +310,9 @@
 def sort_array(arr, space, w_axis, w_order):
     cache = space.fromcache(SortCache) # that populates SortClasses
     itemtype = arr.dtype.itemtype
-    if not arr.dtype.is_native():
-        raise OperationError(space.w_NotImplementedError,
-           space.wrap("sorting of non-native btyeorder not supported yet"))
+    if arr.dtype.byteorder == NPY.OPPBYTE:
+        raise oefmt(space.w_NotImplementedError,
+                    "sorting of non-native byteorder not supported yet")
     for tp in all_types:
         if isinstance(itemtype, tp[0]):
             return cache._lookup(tp)(arr, space, w_axis,
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
@@ -45,7 +45,7 @@
     ]
 
     def __init__(self, itemtype, num, kind, name, char, w_box_type,
-                 float_type=None, byteorder=NPY.NATIVE, names=[], fields={},
+                 float_type=None, byteorder=None, names=[], fields={},
                  size=1, shape=[], subdtype=None,
                  alternate_constructors=[], aliases=[]):
         self.itemtype = itemtype
@@ -55,6 +55,8 @@
         self.char = char
         self.w_box_type = w_box_type
         self.float_type = float_type
+        if byteorder is None:
+            byteorder = NPY.IGNORE if self.num == NPY.STRING else NPY.NATIVE
         self.byteorder = byteorder
         self.names = names
         self.fields = fields
@@ -124,7 +126,10 @@
     def get_float_dtype(self, space):
         assert self.kind == NPY.COMPLEXLTR
         assert self.float_type is not None
-        return get_dtype_cache(space).dtypes_by_name[self.byteorder + 
self.float_type]
+        dtype = get_dtype_cache(space).dtypes_by_name[self.float_type]
+        if self.byteorder == NPY.OPPBYTE:
+            dtype = dtype.descr_newbyteorder(space)
+        return dtype
 
     def descr_str(self, space):
         if self.fields:
@@ -158,6 +163,11 @@
     def descr_get_alignment(self, space):
         return space.wrap(self.itemtype.alignment)
 
+    def descr_get_isbuiltin(self, space):
+        if self.fields is None:
+            return space.wrap(1)
+        return space.wrap(0)
+
     def descr_get_subdtype(self, space):
         if self.subdtype is None:
             return space.w_None
@@ -405,7 +415,8 @@
                 endian = newendian
         itemtype = self.itemtype.__class__(endian in (NPY.NATIVE, NPY.NATBYTE))
         return W_Dtype(itemtype, self.num, self.kind, self.name, self.char,
-                       self.w_box_type, byteorder=endian, size=self.size)
+                       self.w_box_type, self.float_type, byteorder=endian,
+                       size=self.size)
 
 
 @specialize.arg(2)
@@ -492,10 +503,15 @@
         name = space.str_w(w_dtype)
         if ',' in name:
             return dtype_from_spec(space, w_dtype)
+        cname = name[1:] if name[0] == NPY.OPPBYTE else name
         try:
-            return cache.dtypes_by_name[name]
+            dtype = cache.dtypes_by_name[cname]
         except KeyError:
             pass
+        else:
+            if name[0] == NPY.OPPBYTE:
+                dtype = dtype.descr_newbyteorder(space)
+            return dtype
         if name[0] in 'VSUc' or name[0] in '<>=|' and name[1] in 'VSUc':
             return variable_dtype(space, name)
         raise oefmt(space.w_TypeError, 'data type "%s" not understood', name)
@@ -544,6 +560,7 @@
     byteorder = interp_attrproperty("byteorder", cls=W_Dtype),
     itemsize = GetSetProperty(W_Dtype.descr_get_itemsize),
     alignment = GetSetProperty(W_Dtype.descr_get_alignment),
+    isbuiltin = GetSetProperty(W_Dtype.descr_get_isbuiltin),
 
     subdtype = GetSetProperty(W_Dtype.descr_get_subdtype),
     str = GetSetProperty(W_Dtype.descr_get_str),
@@ -874,6 +891,7 @@
         # we reverse, so the stuff with lower numbers override stuff with
         # higher numbers
         for dtype in reversed(self.builtin_dtypes):
+            dtype.fields = None  # mark these as builtin
             self.dtypes_by_num[dtype.num] = dtype
             self.dtypes_by_name[dtype.name] = dtype
             for can_name in [dtype.kind + str(dtype.get_size()),
@@ -882,16 +900,8 @@
                 self.dtypes_by_name[NPY.NATBYTE + can_name] = dtype
                 self.dtypes_by_name[NPY.NATIVE + can_name] = dtype
                 self.dtypes_by_name[NPY.IGNORE + can_name] = dtype
-                new_name = NPY.OPPBYTE + can_name
-                itemtype = type(dtype.itemtype)(False)
-                self.dtypes_by_name[new_name] = W_Dtype(
-                    itemtype, dtype.num, dtype.kind, new_name, dtype.char,
-                    dtype.w_box_type, byteorder=NPY.OPPBYTE,
-                    float_type=dtype.float_type)
             for alias in dtype.aliases:
                 self.dtypes_by_name[alias] = dtype
-        for dtype in self.dtypes_by_name.values():
-            dtype.fields = None  # mark these as builtin
 
         typeinfo_full = {
             'LONGLONG': self.w_int64dtype,
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
@@ -40,6 +40,7 @@
 
     def test_dtype_basic(self):
         from numpypy import dtype
+        import sys
 
         d = dtype('?')
         assert d.num == 0
@@ -47,6 +48,8 @@
         assert dtype(d) is d
         assert dtype('bool') is d
         assert dtype('|b1') is d
+        b = '>' if sys.byteorder == 'little' else '<'
+        assert dtype(b + 'i4') is not dtype(b + 'i4')
         assert repr(type(d)) == "<type 'numpy.dtype'>"
         exc = raises(ValueError, "d.names = []")
         assert exc.value[0] == "there are no fields defined"
@@ -157,6 +160,26 @@
         a = array(range(5), long)
         assert a.dtype is dtype(long)
 
+    def test_isbuiltin(self):
+        import numpy as np
+        import sys
+        assert np.dtype('?').isbuiltin == 1
+        assert np.dtype(int).newbyteorder().isbuiltin == 0
+        assert np.dtype(np.dtype(int)).isbuiltin == 1
+        assert np.dtype('=i4').isbuiltin == 1
+        b = '>' if sys.byteorder == 'little' else '<'
+        assert np.dtype(b + 'i4').isbuiltin == 0
+        assert np.dtype(b + 'i4').newbyteorder().isbuiltin == 0
+        b = '<' if sys.byteorder == 'little' else '>'
+        assert np.dtype(b + 'i4').isbuiltin == 1
+        assert np.dtype(b + 'i4').newbyteorder().isbuiltin == 0
+        assert np.dtype((int, 2)).isbuiltin == 0
+        assert np.dtype([('', int), ('', float)]).isbuiltin == 0
+        assert np.dtype('void').isbuiltin == 1
+        assert np.dtype(str).isbuiltin == 1
+        assert np.dtype('S0').isbuiltin == 1
+        assert np.dtype('S5').isbuiltin == 0
+
     def test_repr_str(self):
         from numpypy import dtype
 
@@ -837,6 +860,11 @@
         assert dtype(nnp + 'i8').byteorder == nnp
         assert dtype('=i8').byteorder == '='
         assert dtype(byteorder + 'i8').byteorder == '='
+        assert dtype(str).byteorder == '|'
+        assert dtype('S5').byteorder == '|'
+        assert dtype('>S5').byteorder == '|'
+        assert dtype('<S5').byteorder == '|'
+        assert dtype('<S5').newbyteorder('=').byteorder == '|'
 
     def test_dtype_str(self):
         from numpypy import dtype
@@ -860,6 +888,7 @@
         assert dtype('string').str == '|S0'
         assert dtype('unicode').str == byteorder + 'U0'
         assert dtype(('string', 7)).str == '|S7'
+        assert dtype('=S5').str == '|S5'
         assert dtype(('unicode', 7)).str == '<U7'
         assert dtype([('', 'f8')]).str == "|V8"
         assert dtype(('f8', 2)).str == "|V16"
_______________________________________________
pypy-commit mailing list
[email protected]
https://mail.python.org/mailman/listinfo/pypy-commit

Reply via email to