Author: Brian Kearns <[email protected]>
Branch: 
Changeset: r67664:0bb6ef2d4ba8
Date: 2013-10-28 16:17 -0400
http://bitbucket.org/pypy/pypy/changeset/0bb6ef2d4ba8/

Log:    clean up interp_dtype, store byteorder rather than native flag so we
        can differentiate between dtype(native) and dtype(natbyte)

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
@@ -309,7 +309,7 @@
 def sort_array(arr, space, w_axis, w_order):
     cache = space.fromcache(SortCache) # that populates SortClasses
     itemtype = arr.dtype.itemtype
-    if not arr.dtype.native:
+    if not arr.dtype.is_native():
         raise OperationError(space.w_NotImplementedError,
            space.wrap("sorting of non-native btyeorder not supported yet"))
     for tp in all_types:
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
@@ -11,11 +11,11 @@
 from rpython.rlib import jit
 
 if sys.byteorder == 'little':
-    byteorder_prefix = '<'
-    nonnative_byteorder_prefix = '>'
+    NATBYTE = '<'
+    OPPBYTE = '>'
 else:
-    byteorder_prefix = '>'
-    nonnative_byteorder_prefix = '<'
+    NATBYTE = '>'
+    OPPBYTE = '<'
 
 UNSIGNEDLTR = "u"
 SIGNEDLTR = "i"
@@ -50,23 +50,23 @@
     return out
 
 class W_Dtype(W_Root):
-    _immutable_fields_ = ["itemtype", "num", "kind", "shape"]
+    _immutable_fields_ = ["itemtype?", "num", "kind", "name?", "char", 
"w_box_type", "byteorder"]
 
-    def __init__(self, itemtype, num, kind, name, char, w_box_type,
+    def __init__(self, itemtype, num, kind, name, char, w_box_type, 
byteorder='=',
                  alternate_constructors=[], aliases=[], float_type=None,
-                 fields=None, fieldnames=None, native=True, shape=[], 
subdtype=None):
+                 fields=None, fieldnames=None, shape=[], subdtype=None):
         self.itemtype = itemtype
         self.num = num
         self.kind = kind
         self.name = name
         self.char = char
         self.w_box_type = w_box_type
+        self.byteorder = byteorder
         self.alternate_constructors = alternate_constructors
         self.aliases = aliases
         self.float_type = float_type
         self.fields = fields
         self.fieldnames = fieldnames
-        self.native = native
         self.shape = list(shape)
         self.subdtype = subdtype
         if not subdtype:
@@ -74,6 +74,11 @@
         else:
             self.base = subdtype.base
 
+    def __repr__(self):
+        if self.fields is not None:
+            return '<DType %r>' % self.fields
+        return '<DType %r>' % self.itemtype
+
     @specialize.argtype(1)
     def box(self, value):
         return self.itemtype.box(value)
@@ -101,6 +106,40 @@
     def fill(self, storage, box, start, stop):
         self.itemtype.fill(storage, self.get_size(), box, start, stop, 0)
 
+    def is_int_type(self):
+        return (self.kind == SIGNEDLTR or self.kind == UNSIGNEDLTR or
+                self.kind == BOOLLTR)
+
+    def is_signed(self):
+        return self.kind == SIGNEDLTR
+
+    def is_complex_type(self):
+        return self.kind == COMPLEXLTR
+
+    def is_float_type(self):
+        return (self.kind == FLOATINGLTR or self.float_type is not None)
+
+    def is_bool_type(self):
+        return self.kind == BOOLLTR
+
+    def is_record_type(self):
+        return self.fields is not None
+
+    def is_str_type(self):
+        return self.num == 18
+
+    def is_str_or_unicode(self):
+        return (self.num == 18 or self.num == 19)
+
+    def is_flexible_type(self):
+        return (self.is_str_or_unicode() or self.is_record_type())
+
+    def is_native(self):
+        return self.byteorder in ('=', NATBYTE)
+
+    def get_size(self):
+        return self.itemtype.get_element_size()
+
     def get_name(self):
         if self.char == 'S':
             return '|S' + str(self.get_size())
@@ -115,37 +154,31 @@
     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)
+
+    def descr_get_subdtype(self, space):
+        return space.newtuple([space.wrap(self.subdtype), 
self.descr_get_shape(space)])
 
     def descr_get_str(self, space):
         size = self.get_size()
         basic = self.kind
         if basic == UNICODELTR:
             size >>= 2
-            endian = byteorder_prefix
+            endian = NATBYTE
         elif size <= 1:
             endian = '|'  # ignore
-        elif self.native:
-            endian = byteorder_prefix
         else:
-            endian = nonnative_byteorder_prefix
-
+            endian = self.byteorder
+            if endian == '=':
+                endian = NATBYTE
         return space.wrap("%s%s%s" % (endian, basic, size))
 
-    def descr_get_alignment(self, space):
-        return space.wrap(self.itemtype.alignment)
-
-    def descr_get_isnative(self, space):
-        return space.wrap(self.native)
-
     def descr_get_base(self, space):
         return space.wrap(self.base)
 
-    def descr_get_subdtype(self, space):
-        return space.newtuple([space.wrap(self.subdtype), 
self.descr_get_shape(space)])
+    def descr_get_isnative(self, space):
+        return space.wrap(self.is_native())
 
     def descr_get_shape(self, space):
         w_shape = [space.wrap(dim) for dim in self.shape]
@@ -224,42 +257,6 @@
         except KeyError:
             raise OperationError(space.w_KeyError, space.wrap("Field named %s 
not found" % item))
 
-    def is_int_type(self):
-        return (self.kind == SIGNEDLTR or self.kind == UNSIGNEDLTR or
-                self.kind == BOOLLTR)
-
-    def is_signed(self):
-        return self.kind == SIGNEDLTR
-
-    def is_complex_type(self):
-        return self.kind == COMPLEXLTR
-
-    def is_float_type(self):
-        return (self.kind == FLOATINGLTR or self.float_type is not None)
-
-    def is_bool_type(self):
-        return self.kind == BOOLLTR
-
-    def is_record_type(self):
-        return self.fields is not None
-
-    def is_str_type(self):
-        return self.num == 18
-
-    def is_str_or_unicode(self):
-        return (self.num == 18 or self.num == 19)
-
-    def is_flexible_type(self):
-        return (self.is_str_or_unicode() or self.is_record_type())
-
-    def __repr__(self):
-        if self.fields is not None:
-            return '<DType %r>' % self.fields
-        return '<DType %r>' % self.itemtype
-
-    def get_size(self):
-        return self.itemtype.get_element_size()
-
     def descr_reduce(self, space):
         w_class = space.type(self)
 
@@ -271,7 +268,7 @@
         names = self.descr_get_names(space)
         values = self.descr_get_fields(space)
         if self.fields:
-            order = space.wrap('|')
+            endian = '|'
             #TODO: Implement this when subarrays are implemented
             subdescr = space.w_None
             size = 0
@@ -283,21 +280,25 @@
             #TODO: Change this when alignment is implemented
             alignment = space.wrap(1)
         else:
-            order = space.wrap(byteorder_prefix if self.native else 
nonnative_byteorder_prefix)
+            endian = self.byteorder
+            if endian == '=':
+                endian = NATBYTE
             subdescr = space.w_None
             w_size = space.wrap(-1)
             alignment = space.wrap(-1)
         flags = space.wrap(0)
 
-        data = space.newtuple([version, order, subdescr, names, values, 
w_size, alignment, flags])
-
+        data = space.newtuple([version, space.wrap(endian), subdescr, names, 
values, w_size, alignment, flags])
         return space.newtuple([w_class, builder_args, data])
 
     def descr_setstate(self, space, w_data):
         if space.int_w(space.getitem(w_data, space.wrap(0))) != 3:
             raise OperationError(space.w_NotImplementedError, 
space.wrap("Pickling protocol version not supported"))
 
-        self.native = space.str_w(space.getitem(w_data, space.wrap(1))) == 
byteorder_prefix
+        endian = space.str_w(space.getitem(w_data, space.wrap(1)))
+        if endian == NATBYTE:
+            endian = '='
+        self.byteorder = endian
 
         fieldnames = space.getitem(w_data, space.wrap(3))
         self.set_names(space, fieldnames)
@@ -403,21 +404,22 @@
     __reduce__ = interp2app(W_Dtype.descr_reduce),
     __setstate__ = interp2app(W_Dtype.descr_setstate),
 
-    num = interp_attrproperty("num", cls=W_Dtype),
+    type = interp_attrproperty_w("w_box_type", cls=W_Dtype),
     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),
-    str = GetSetProperty(W_Dtype.descr_get_str),
+    num = interp_attrproperty("num", cls=W_Dtype),
+    byteorder = interp_attrproperty("byteorder", cls=W_Dtype),
     itemsize = GetSetProperty(W_Dtype.descr_get_itemsize),
     alignment = GetSetProperty(W_Dtype.descr_get_alignment),
+
+    subdtype = GetSetProperty(W_Dtype.descr_get_subdtype),
+    str = GetSetProperty(W_Dtype.descr_get_str),
+    name = interp_attrproperty("name", cls=W_Dtype),
+    base = GetSetProperty(W_Dtype.descr_get_base),
+    shape = GetSetProperty(W_Dtype.descr_get_shape),
     isnative = GetSetProperty(W_Dtype.descr_get_isnative),
-    shape = GetSetProperty(W_Dtype.descr_get_shape),
-    name = interp_attrproperty('name', cls=W_Dtype),
     fields = GetSetProperty(W_Dtype.descr_get_fields),
     names = GetSetProperty(W_Dtype.descr_get_names),
-    subdtype = GetSetProperty(W_Dtype.descr_get_subdtype),
-    base = GetSetProperty(W_Dtype.descr_get_base),
 )
 W_Dtype.typedef.acceptable_as_base_class = False
 
@@ -739,24 +741,24 @@
             self.dtypes_by_name[dtype.name] = dtype
             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[NATBYTE + can_name] = dtype
             self.dtypes_by_name['=' + can_name] = dtype
-            new_name = nonnative_byteorder_prefix + can_name
+            new_name = OPPBYTE + 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,
-                native=False)
+                byteorder=OPPBYTE)
             if dtype.kind != dtype.char:
                 can_name = dtype.char
-                self.dtypes_by_name[byteorder_prefix + can_name] = dtype
+                self.dtypes_by_name[NATBYTE + can_name] = dtype
                 self.dtypes_by_name['=' + can_name] = dtype
-                new_name = nonnative_byteorder_prefix + can_name
+                new_name = OPPBYTE + can_name
                 self.dtypes_by_name[new_name] = W_Dtype(
                     itemtype,
                     dtype.num, dtype.kind, new_name, dtype.char, 
dtype.w_box_type,
-                    native=False)
+                    byteorder=OPPBYTE)
 
             for alias in dtype.aliases:
                 self.dtypes_by_name[alias] = dtype
diff --git a/pypy/module/micronumpy/interp_numarray.py 
b/pypy/module/micronumpy/interp_numarray.py
--- a/pypy/module/micronumpy/interp_numarray.py
+++ b/pypy/module/micronumpy/interp_numarray.py
@@ -472,7 +472,7 @@
         if self.is_scalar():
             return space.wrap(0)
         s = self.get_dtype().name
-        if not self.get_dtype().native:
+        if not self.get_dtype().is_native():
             s = s[1:]
         dtype = interp_dtype.get_dtype_cache(space).dtypes_by_name[s]
         contig = self.implementation.astype(space, 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
@@ -1,8 +1,7 @@
 from pypy.module.micronumpy.interp_dtype import get_dtype_cache
 from pypy.module.micronumpy.interp_ufuncs import (find_binop_result_dtype,
         find_unaryop_result_dtype)
-from pypy.module.micronumpy.interp_dtype import nonnative_byteorder_prefix,\
-     byteorder_prefix
+from pypy.module.micronumpy.interp_dtype import NATBYTE, OPPBYTE
 from pypy.conftest import option
 import sys
 
@@ -18,8 +17,8 @@
                 sys.modules['numpypy'] = numpy
                 isNumpy = True
         cls.w_isNumpy = cls.space.wrap(isNumpy)
-        cls.w_non_native_prefix = cls.space.wrap(nonnative_byteorder_prefix)
-        cls.w_native_prefix = cls.space.wrap(byteorder_prefix)
+        cls.w_non_native_prefix = cls.space.wrap(OPPBYTE)
+        cls.w_native_prefix = cls.space.wrap(NATBYTE)
 
 class TestUfuncCoerscion(object):
     def test_binops(self, space):
_______________________________________________
pypy-commit mailing list
[email protected]
https://mail.python.org/mailman/listinfo/pypy-commit

Reply via email to