[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