[pypy-commit] pypy str-dtype-improvement: intrusively fix record field matching

mattip noreply at buildbot.pypy.org
Sun Mar 17 19:24:01 CET 2013


Author: Matti Picus <matti.picus at gmail.com>
Branch: str-dtype-improvement
Changeset: r62390:f793000f4f09
Date: 2013-03-17 18:52 +0200
http://bitbucket.org/pypy/pypy/changeset/f793000f4f09/

Log:	intrusively fix record field matching

diff --git a/pypy/module/micronumpy/interp_arrayops.py b/pypy/module/micronumpy/interp_arrayops.py
--- a/pypy/module/micronumpy/interp_arrayops.py
+++ b/pypy/module/micronumpy/interp_arrayops.py
@@ -116,6 +116,17 @@
                     "all the input arrays must have same number of dimensions"))
             elif i == _axis:
                 shape[i] += axis_size
+        a_dt = arr.get_dtype()
+        if dtype.is_record_type() and a_dt.is_record_type():
+            #Record types must match
+            for f in dtype.fields:
+                if f not in a_dt.fields or \
+                             dtype.fields[f] != a_dt.fields[f]:
+                    raise OperationError(space.w_TypeError, 
+                               space.wrap("record type mismatch"))
+        elif dtype.is_record_type() or a_dt.is_record_type():
+            raise OperationError(space.w_TypeError, 
+                        space.wrap("invalid type promotion"))
         dtype = interp_ufuncs.find_binop_result_dtype(space, dtype,
                                                       arr.get_dtype())
         if _axis < 0 or len(arr.get_shape()) <= _axis:
diff --git a/pypy/module/micronumpy/interp_boxes.py b/pypy/module/micronumpy/interp_boxes.py
--- a/pypy/module/micronumpy/interp_boxes.py
+++ b/pypy/module/micronumpy/interp_boxes.py
@@ -278,7 +278,7 @@
                              dtype.coerce(space, w_value))
 
     def convert_to(self, dtype):
-        # TODO actually perform the conversion, this requires a space arg
+        # if we reach here, the record fields are guarenteed to match.
         return self
 
 class W_CharacterBox(W_FlexibleBox):
diff --git a/pypy/module/micronumpy/interp_ufuncs.py b/pypy/module/micronumpy/interp_ufuncs.py
--- a/pypy/module/micronumpy/interp_ufuncs.py
+++ b/pypy/module/micronumpy/interp_ufuncs.py
@@ -438,7 +438,6 @@
         # For those operations that get here (concatenate, stack),
         # flexible types take precedence over numeric type
         if dt2.is_record_type():
-            #TODO record types require an exact match
             return dt2
         if dt1.is_str_or_unicode():
             if dt2.num == 18:


More information about the pypy-commit mailing list