[pypy-commit] pypy fix-result-types: precompute string length for integer itemtypes

rlamy noreply at buildbot.pypy.org
Wed May 20 03:34:29 CEST 2015


Author: Ronan Lamy <ronan.lamy at gmail.com>
Branch: fix-result-types
Changeset: r77417:16dc3de9c668
Date: 2015-05-20 02:34 +0100
http://bitbucket.org/pypy/pypy/changeset/16dc3de9c668/

Log:	precompute string length for integer itemtypes

diff --git a/pypy/module/micronumpy/descriptor.py b/pypy/module/micronumpy/descriptor.py
--- a/pypy/module/micronumpy/descriptor.py
+++ b/pypy/module/micronumpy/descriptor.py
@@ -40,7 +40,6 @@
     return out
 
 
-_REQ_STRLEN = [0, 3, 5, 10, 10, 20, 20, 20, 20]  # data for can_cast_to()
 
 @finishsigs
 class W_Dtype(W_Root):
@@ -115,20 +114,8 @@
                     char_size = 4
                 if other.elsize == 0:
                     return True
-                if self.is_bool():
-                    return other.elsize >= 5 * char_size
-                elif self.is_unsigned():
-                    if self.elsize > 8 or self.elsize < 0:
-                        return False
-                    else:
-                        return (other.elsize >=
-                                _REQ_STRLEN[self.elsize] * char_size)
-                elif self.is_signed():
-                    if self.elsize > 8 or self.elsize < 0:
-                        return False
-                    else:
-                        return (other.elsize >=
-                                (_REQ_STRLEN[self.elsize] + 1) * char_size)
+                if self.is_int():
+                    return other.elsize >= self.itemtype.strlen * char_size
         return result
 
     def coerce(self, space, w_item):
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
@@ -134,6 +134,7 @@
 
 class BaseType(object):
     _immutable_fields_ = ['native', 'space']
+    strlen = 0  # chars needed to print any possible value of the type
 
     def __init__(self, space, native=True):
         assert isinstance(space, ObjSpace)
@@ -354,6 +355,7 @@
     char = NPY.BOOLLTR
     BoxType = boxes.W_BoolBox
     format_code = "?"
+    strlen = 5  # "False"
 
     _True = BoxType(True)
     _False = BoxType(False)
@@ -2473,6 +2475,7 @@
 all_complex_types = []
 complex_types = []
 
+_REQ_STRLEN = [0, 3, 5, 10, 10, 20, 20, 20, 20]  # data for can_cast_to()
 def _setup():
     # compute alignment
     for tp in globals().values():
@@ -2484,6 +2487,10 @@
             if issubclass(tp, Integer):
                 all_int_types.append((tp, 'int'))
                 int_types.append(tp)
+                elsize = tp(ObjSpace()).get_element_size()
+                tp.strlen = _REQ_STRLEN[elsize]
+                if tp.kind == NPY.SIGNEDLTR:
+                    tp.strlen += 1
             if issubclass(tp, ComplexFloating):
                 all_complex_types.append((tp, 'complex'))
                 complex_types.append(tp)


More information about the pypy-commit mailing list