[pypy-svn] pypy default: Add some decorators about some constructor functions
arigo
commits-noreply at bitbucket.org
Fri Apr 15 11:14:05 CEST 2011
Author: Armin Rigo <arigo at tunes.org>
Branch:
Changeset: r43379:bfa61b4d5577
Date: 2011-04-15 10:34 +0200
http://bitbucket.org/pypy/pypy/changeset/bfa61b4d5577/
Log: Add some decorators about some constructor functions being pure. It
should avoid seeing in the jit traces lines like
call(ConstClass(fromint), 1).
diff --git a/pypy/rlib/rbigint.py b/pypy/rlib/rbigint.py
--- a/pypy/rlib/rbigint.py
+++ b/pypy/rlib/rbigint.py
@@ -3,7 +3,8 @@
from pypy.rlib.rarithmetic import most_neg_value_of_same_type
from pypy.rlib.rfloat import isinf, isnan
from pypy.rlib.debug import make_sure_not_resized, check_regular_int
-from pypy.rlib.objectmodel import we_are_translated
+from pypy.rlib.objectmodel import we_are_translated, specialize
+from pypy.rlib import jit
from pypy.rpython.lltypesystem import lltype, rffi
from pypy.rpython import extregistry
@@ -122,7 +123,11 @@
def numdigits(self):
return len(self._digits)
+ @staticmethod
+ @jit.purefunction
def fromint(intval):
+ # This function is marked as pure, so you must not call it and
+ # then modify the result.
check_regular_int(intval)
if intval < 0:
sign = -1
@@ -149,20 +154,25 @@
t >>= SHIFT
p += 1
return v
- fromint = staticmethod(fromint)
+ @staticmethod
+ @jit.purefunction
def frombool(b):
+ # This function is marked as pure, so you must not call it and
+ # then modify the result.
if b:
return rbigint([ONEDIGIT], 1)
return rbigint()
- frombool = staticmethod(frombool)
+ @staticmethod
def fromlong(l):
+ "NOT_RPYTHON"
return rbigint(*args_from_long(l))
- fromlong = staticmethod(fromlong)
+ @staticmethod
def fromfloat(dval):
""" Create a new bigint object from a float """
+ # This function is not marked as pure because it can raise
sign = 1
if isinf(dval) or isnan(dval):
raise OverflowError
@@ -183,16 +193,21 @@
frac -= float(bits)
frac = math.ldexp(frac, SHIFT)
return v
- fromfloat = staticmethod(fromfloat)
+ @staticmethod
+ @jit.purefunction
+ @specialize.argtype(0)
def fromrarith_int(i):
+ # This function is marked as pure, so you must not call it and
+ # then modify the result.
return rbigint(*args_from_rarith_int(i))
- fromrarith_int._annspecialcase_ = "specialize:argtype(0)"
- fromrarith_int = staticmethod(fromrarith_int)
+ @staticmethod
+ @jit.purefunction
def fromdecimalstr(s):
+ # This function is marked as pure, so you must not call it and
+ # then modify the result.
return _decimalstr_to_bigint(s)
- fromdecimalstr = staticmethod(fromdecimalstr)
def toint(self):
"""
@@ -1841,7 +1856,7 @@
elif s[p] == '+':
p += 1
- a = rbigint.fromint(0)
+ a = rbigint()
tens = 1
dig = 0
ord0 = ord('0')
@@ -1859,7 +1874,7 @@
def parse_digit_string(parser):
# helper for objspace.std.strutil
- a = rbigint.fromint(0)
+ a = rbigint()
base = parser.base
digitmax = BASE_MAX[base]
tens, dig = 1, 0
More information about the Pypy-commit
mailing list