Author: Maciej Fijalkowski <fij...@gmail.com>
Branch: elidable-canfold-exception
Changeset: r70046:83468ba5580d
Date: 2014-03-18 09:48 +0200
http://bitbucket.org/pypy/pypy/changeset/83468ba5580d/

Log:    Start a branch to constant-fold some errors in @elidable. Begin with
        changing all @elidable to @elidable()

diff --git a/pypy/interpreter/signature.py b/pypy/interpreter/signature.py
--- a/pypy/interpreter/signature.py
+++ b/pypy/interpreter/signature.py
@@ -10,7 +10,7 @@
         self.varargname = varargname
         self.kwargname = kwargname
 
-    @jit.elidable
+    @jit.elidable()
     def find_argname(self, name):
         try:
             return self.argnames.index(name)
@@ -69,4 +69,4 @@
             return self.varargname
         if i == 2:
             return self.kwargname
-        raise IndexError
\ No newline at end of file
+        raise IndexError
diff --git a/pypy/module/_cffi_backend/ctypestruct.py 
b/pypy/module/_cffi_backend/ctypestruct.py
--- a/pypy/module/_cffi_backend/ctypestruct.py
+++ b/pypy/module/_cffi_backend/ctypestruct.py
@@ -135,7 +135,7 @@
                 msg = "list or tuple or dict"
             raise self._convert_error(msg, w_ob)
 
-    @jit.elidable
+    @jit.elidable()
     def _getcfield_const(self, attr):
         return self.fields_dict[attr]
 
diff --git a/pypy/module/_codecs/interp_codecs.py 
b/pypy/module/_codecs/interp_codecs.py
--- a/pypy/module/_codecs/interp_codecs.py
+++ b/pypy/module/_codecs/interp_codecs.py
@@ -100,7 +100,7 @@
     def get_codec_from_cache(self, key):
         return self._get_codec_with_version(key, self.version)
 
-    @jit.elidable
+    @jit.elidable()
     def _get_codec_with_version(self, key, version):
         return self.codec_search_cache.get(key, None)
 
diff --git a/pypy/module/_lsprof/interp_lsprof.py 
b/pypy/module/_lsprof/interp_lsprof.py
--- a/pypy/module/_lsprof/interp_lsprof.py
+++ b/pypy/module/_lsprof/interp_lsprof.py
@@ -150,7 +150,7 @@
                             factor * float(self.ll_it), w_sublist)
         return space.wrap(w_se)
 
-    @jit.elidable
+    @jit.elidable()
     def _get_or_make_subentry(self, entry, make=True):
         try:
             return self.calls[entry]
@@ -302,7 +302,7 @@
         c_setup_profiling()
         space.getexecutioncontext().setllprofile(lsprof_call, space.wrap(self))
 
-    @jit.elidable
+    @jit.elidable()
     def _get_or_make_entry(self, f_code, make=True):
         try:
             return self.data[f_code]
@@ -313,7 +313,7 @@
                 return entry
             raise
 
-    @jit.elidable
+    @jit.elidable()
     def _get_or_make_builtin_entry(self, key, make=True):
         try:
             return self.builtin_data[key]
diff --git a/pypy/module/_rawffi/alt/interp_ffitype.py 
b/pypy/module/_rawffi/alt/interp_ffitype.py
--- a/pypy/module/_rawffi/alt/interp_ffitype.py
+++ b/pypy/module/_rawffi/alt/interp_ffitype.py
@@ -17,7 +17,7 @@
         self.w_pointer_to = w_pointer_to
         self.set_ffitype(ffitype)
 
-    @jit.elidable
+    @jit.elidable()
     def get_ffitype(self):
         if not self._ffitype:
             raise ValueError("Operation not permitted on an incomplete type")
diff --git a/pypy/module/cppyy/capi/loadable_capi.py 
b/pypy/module/cppyy/capi/loadable_capi.py
--- a/pypy/module/cppyy/capi/loadable_capi.py
+++ b/pypy/module/cppyy/capi/loadable_capi.py
@@ -342,10 +342,10 @@
     return _cdata_to_ptr(space, call_capi(space, 'allocate_function_args', 
[_Arg(l=size)]))
 def c_deallocate_function_args(space, cargs):
     call_capi(space, 'deallocate_function_args', [_Arg(vp=cargs)])
-@jit.elidable
+@jit.elidable()
 def c_function_arg_sizeof(space):
     return _cdata_to_size_t(space, call_capi(space, 'function_arg_sizeof', []))
-@jit.elidable
+@jit.elidable()
 def c_function_arg_typeoffset(space):
     return _cdata_to_size_t(space, call_capi(space, 'function_arg_typeoffset', 
[]))
 
diff --git a/pypy/module/imp/importing.py b/pypy/module/imp/importing.py
--- a/pypy/module/imp/importing.py
+++ b/pypy/module/imp/importing.py
@@ -121,7 +121,7 @@
 def check_sys_modules_w(space, modulename):
     return space.finditem_str(space.sys.get('modules'), modulename)
 
-@jit.elidable
+@jit.elidable()
 def _get_dot_position(str, n):
     # return the index in str of the '.' such that there are n '.'-separated
     # strings after it
diff --git a/pypy/objspace/std/mapdict.py b/pypy/objspace/std/mapdict.py
--- a/pypy/objspace/std/mapdict.py
+++ b/pypy/objspace/std/mapdict.py
@@ -43,7 +43,7 @@
         else:
             return obj._mapdict_read_storage(attr.storageindex)
 
-    @jit.elidable
+    @jit.elidable()
     def _pure_mapdict_read_storage(self, obj, storageindex):
         return obj._mapdict_read_storage(storageindex)
 
@@ -68,7 +68,7 @@
         else:
             return self._find_map_attr_indirection(selector)
 
-    @jit.elidable
+    @jit.elidable()
     def _find_map_attr_jit_pure(self, name, index):
         return self._find_map_attr_indirection((name, index))
 
@@ -128,14 +128,14 @@
     def set_terminator(self, obj, terminator):
         raise NotImplementedError("abstract base class")
 
-    @jit.elidable
+    @jit.elidable()
     def size_estimate(self):
         return self._size_estimate >> NUM_DIGITS
 
     def search(self, attrtype):
         return None
 
-    @jit.elidable
+    @jit.elidable()
     def _get_new_attr(self, name, index):
         selector = name, index
         cache = self.cache_attrs
diff --git a/pypy/objspace/std/stringmethods.py 
b/pypy/objspace/std/stringmethods.py
--- a/pypy/objspace/std/stringmethods.py
+++ b/pypy/objspace/std/stringmethods.py
@@ -585,7 +585,7 @@
             return self
         return self._new(self.title(selfval))
 
-    @jit.elidable
+    @jit.elidable()
     def title(self, value):
         builder = self._builder(len(value))
         previous_is_cased = False
diff --git a/pypy/objspace/std/typeobject.py b/pypy/objspace/std/typeobject.py
--- a/pypy/objspace/std/typeobject.py
+++ b/pypy/objspace/std/typeobject.py
@@ -259,7 +259,7 @@
                     return w_value
         return w_value
 
-    @elidable
+    @elidable()
     def _pure_getdictvalue_no_unwrapping(w_self, space, version_tag, attr):
         return w_self._getdictvalue_no_unwrapping(space, attr)
 
@@ -371,7 +371,7 @@
         w_class, w_value = w_self._pure_lookup_where_with_method_cache(name, 
version_tag)
         return w_class, unwrap_cell(space, w_value)
 
-    @elidable
+    @elidable()
     def _pure_lookup_where_with_method_cache(w_self, name, version_tag):
         space = w_self.space
         cache = space.fromcache(MethodCache)
diff --git a/rpython/jit/backend/llsupport/test/zrpy_gc_test.py 
b/rpython/jit/backend/llsupport/test/zrpy_gc_test.py
--- a/rpython/jit/backend/llsupport/test/zrpy_gc_test.py
+++ b/rpython/jit/backend/llsupport/test/zrpy_gc_test.py
@@ -634,7 +634,7 @@
         self.run('compile_framework_external_exception_handling')
 
     def define_compile_framework_bug1(self):
-        @elidable
+        @elidable()
         def nonmoving():
             x = X(1)
             for i in range(7):
diff --git a/rpython/jit/codewriter/support.py 
b/rpython/jit/codewriter/support.py
--- a/rpython/jit/codewriter/support.py
+++ b/rpython/jit/codewriter/support.py
@@ -216,12 +216,12 @@
 
 _ll_3_list_resize_hint_really = rlist_ll._ll_list_resize_hint_really
 
-@elidable
+@elidable()
 def _ll_1_gc_identityhash(x):
     return lltype.identityhash(x)
 
 
-# the following function should not be "@elidable": I can think of
+# the following function should not be "@elidable()": I can think of
 # a corner case in which id(const) is constant-folded, and then 'const'
 # disappears and is collected too early (possibly causing another object
 # with the same id() to appear).
diff --git a/rpython/jit/codewriter/test/test_effectinfo.py 
b/rpython/jit/codewriter/test/test_effectinfo.py
--- a/rpython/jit/codewriter/test/test_effectinfo.py
+++ b/rpython/jit/codewriter/test/test_effectinfo.py
@@ -122,7 +122,7 @@
         class B(A):
             x = 2
 
-        @jit.elidable
+        @jit.elidable()
         def g(cls):
             return cls()
 
diff --git a/rpython/jit/codewriter/test/test_policy.py 
b/rpython/jit/codewriter/test/test_policy.py
--- a/rpython/jit/codewriter/test/test_policy.py
+++ b/rpython/jit/codewriter/test/test_policy.py
@@ -52,7 +52,7 @@
     assert not policy.look_inside_graph(graph)
 
 def test_elidable():
-    @jit.elidable
+    @jit.elidable()
     def g(x):
         return x + 2
     graph = support.getgraph(g, [5])
diff --git a/rpython/jit/metainterp/test/test_ajit.py 
b/rpython/jit/metainterp/test/test_ajit.py
--- a/rpython/jit/metainterp/test/test_ajit.py
+++ b/rpython/jit/metainterp/test/test_ajit.py
@@ -413,7 +413,7 @@
                                       call=0, call_pure=0)
 
     def test_residual_call_elidable_1(self):
-        @elidable
+        @elidable()
         def externfn(x, y):
             return x * y
         def f(n):
@@ -426,7 +426,7 @@
 
     def test_residual_call_elidable_2(self):
         myjitdriver = JitDriver(greens = [], reds = ['n'])
-        @elidable
+        @elidable()
         def externfn(x):
             return x - 1
         def f(n):
@@ -443,7 +443,7 @@
 
     def test_constfold_call_elidable(self):
         myjitdriver = JitDriver(greens = ['m'], reds = ['n'])
-        @elidable
+        @elidable()
         def externfn(x):
             return x - 3
         def f(n, m):
@@ -459,7 +459,7 @@
 
     def test_constfold_call_elidable_2(self):
         myjitdriver = JitDriver(greens = ['m'], reds = ['n'])
-        @elidable
+        @elidable()
         def externfn(x):
             return x - 3
         class V:
@@ -484,7 +484,7 @@
                 self.x = x
         v1 = V(1)
         v2 = V(2)
-        @elidable
+        @elidable()
         def externfn(x):
             if x:
                 return v1
@@ -504,7 +504,7 @@
 
     def test_elidable_raising(self):
         myjitdriver = JitDriver(greens = ['m'], reds = ['n'])
-        @elidable
+        @elidable()
         def externfn(x):
             if x <= 0:
                 raise ValueError
@@ -530,7 +530,7 @@
 
     def test_elidable_raising_2(self):
         myjitdriver = JitDriver(greens = ['m'], reds = ['n'])
-        @elidable
+        @elidable()
         def externfn(x):
             if x <= 0:
                 raise ValueError
diff --git a/rpython/jit/metainterp/test/test_call.py 
b/rpython/jit/metainterp/test/test_call.py
--- a/rpython/jit/metainterp/test/test_call.py
+++ b/rpython/jit/metainterp/test/test_call.py
@@ -28,7 +28,7 @@
     def test_call_elidable_none(self):
         d = {}
 
-        @jit.elidable
+        @jit.elidable()
         def f(a):
             return d.get(a, None)
 
diff --git a/rpython/jit/metainterp/test/test_jitprof.py 
b/rpython/jit/metainterp/test/test_jitprof.py
--- a/rpython/jit/metainterp/test/test_jitprof.py
+++ b/rpython/jit/metainterp/test/test_jitprof.py
@@ -77,7 +77,7 @@
         assert profiler.calls == 1
 
     def test_blackhole_pure(self):
-        @elidable
+        @elidable()
         def g(n):
             return n+1
         
diff --git a/rpython/jit/metainterp/test/test_send.py 
b/rpython/jit/metainterp/test/test_send.py
--- a/rpython/jit/metainterp/test/test_send.py
+++ b/rpython/jit/metainterp/test/test_send.py
@@ -596,7 +596,7 @@
     def test_constfold_pure_oosend(self):
         myjitdriver = JitDriver(greens=[], reds = ['i', 'obj'])
         class A:
-            @elidable
+            @elidable()
             def foo(self):
                 return 42
         def fn(n, i):
diff --git a/rpython/jit/metainterp/test/test_tracingopts.py 
b/rpython/jit/metainterp/test/test_tracingopts.py
--- a/rpython/jit/metainterp/test/test_tracingopts.py
+++ b/rpython/jit/metainterp/test/test_tracingopts.py
@@ -411,7 +411,7 @@
         a1.y = 6
         a2 = A()
         a2.y = 13
-        @jit.elidable
+        @jit.elidable()
         def f(b):
             return b + 1
         def fn(n):
diff --git a/rpython/jit/tl/tlc.py b/rpython/jit/tl/tlc.py
--- a/rpython/jit/tl/tlc.py
+++ b/rpython/jit/tl/tlc.py
@@ -72,7 +72,7 @@
 
     classes = [] # [(descr, cls), ...]
 
-    @elidable
+    @elidable()
     def get(key):
         for descr, cls in Class.classes:
             if key.attributes == descr.attributes and\
diff --git a/rpython/rlib/jit.py b/rpython/rlib/jit.py
--- a/rpython/rlib/jit.py
+++ b/rpython/rlib/jit.py
@@ -1,4 +1,5 @@
 import sys
+import types
 
 import py
 
@@ -11,7 +12,7 @@
 DEBUG_ELIDABLE_FUNCTIONS = False
 
 
-def elidable(func):
+def elidable(canfolderror=None):
     """ Decorate a function as "trace-elidable". Usually this means simply that
     the function is constant-foldable, i.e. is pure and has no side-effects.
 
@@ -31,22 +32,31 @@
     Most importantly it doesn't mean that an elidable function has no 
observable
     side effect, but those side effects are idempotent (ie caching).
     If a particular call to this function ends up raising an exception, then it
-    is handled like a normal function call (this decorator is ignored).
+    is handled like a normal function call (this decorator is ignored), unless
+    canfolderror is specified (which is an exception class or a tuple).
+    In this case, if it raises specific exception listed there, it's also
+    constant folded away.
     """
-    if DEBUG_ELIDABLE_FUNCTIONS:
-        cache = {}
-        oldfunc = func
-        def func(*args):
-            result = oldfunc(*args)    # if it raises, no caching
-            try:
-                oldresult = cache.setdefault(args, result)
-            except TypeError:
-                pass           # unhashable args
-            else:
-                assert oldresult == result
-            return result
-    func._elidable_function_ = True
-    return func
+    if isinstance(canfolderror, types.FunctionType):
+        raise Exception("@elidable was changed to a full "
+                        "decorator, use @elidable()")
+    def decorator(func):
+        if DEBUG_ELIDABLE_FUNCTIONS:
+            cache = {}
+            oldfunc = func
+            def func(*args):
+                result = oldfunc(*args)    # if it raises, no caching
+                try:
+                    oldresult = cache.setdefault(args, result)
+                except TypeError:
+                    pass           # unhashable args
+                else:
+                    assert oldresult == result
+                return result
+        func._elidable_function_ = True
+        if canfolderror is not None:
+            func._elidable_exceptions_ = canfolderror
+        return func
 
 def purefunction(*args, **kwargs):
     import warnings
diff --git a/rpython/rlib/jit_libffi.py b/rpython/rlib/jit_libffi.py
--- a/rpython/rlib/jit_libffi.py
+++ b/rpython/rlib/jit_libffi.py
@@ -245,7 +245,7 @@
         del cls._import
 
     @staticmethod
-    @jit.elidable
+    @jit.elidable()
     def getkind(ffi_type):
         """Returns 'v' for void, 'f' for float, 'i' for signed integer,
         'u' for unsigned integer, 'S' for singlefloat, 'L' for long long
@@ -281,7 +281,7 @@
         return '?'
 
     @staticmethod
-    @jit.elidable
+    @jit.elidable()
     def is_struct(ffi_type):
         return rffi.getintfield(ffi_type, 'c_type') == FFI_TYPE_STRUCT
 
diff --git a/rpython/rlib/libffi.py b/rpython/rlib/libffi.py
--- a/rpython/rlib/libffi.py
+++ b/rpython/rlib/libffi.py
@@ -45,7 +45,7 @@
         del cls._import
 
     @staticmethod
-    @jit.elidable
+    @jit.elidable()
     def getkind(ffi_type):
         """Returns 'v' for void, 'f' for float, 'i' for signed integer,
         and 'u' for unsigned integer.
@@ -79,7 +79,7 @@
         raise KeyError
 
     @staticmethod
-    @jit.elidable
+    @jit.elidable()
     def is_struct(ffi_type):
         return intmask(ffi_type.c_type) == FFI_TYPE_STRUCT
 
diff --git a/rpython/rlib/rbigint.py b/rpython/rlib/rbigint.py
--- a/rpython/rlib/rbigint.py
+++ b/rpython/rlib/rbigint.py
@@ -169,7 +169,7 @@
     numdigits._always_inline_ = True
 
     @staticmethod
-    @jit.elidable
+    @jit.elidable()
     def fromint(intval):
         # This function is marked as pure, so you must not call it and
         # then modify the result.
@@ -192,7 +192,7 @@
             return rbigint([_store_digit(ival & MASK)], sign, 1)
 
     @staticmethod
-    @jit.elidable
+    @jit.elidable()
     def frombool(b):
         # You must not call this function and then modify the result.
         if b:
@@ -205,7 +205,7 @@
         return rbigint(*args_from_long(l))
 
     @staticmethod
-    @jit.elidable
+    @jit.elidable()
     def fromfloat(dval):
         """ Create a new bigint object from a float """
         # This function is not marked as pure because it can raise
@@ -216,7 +216,7 @@
         return rbigint._fromfloat_finite(dval)
 
     @staticmethod
-    @jit.elidable
+    @jit.elidable()
     def _fromfloat_finite(dval):
         sign = 1
         if dval < 0.0:
@@ -238,7 +238,7 @@
         return v
 
     @staticmethod
-    @jit.elidable
+    @jit.elidable()
     @specialize.argtype(0)
     def fromrarith_int(i):
         # This function is marked as pure, so you must not call it and
@@ -246,14 +246,14 @@
         return rbigint(*args_from_rarith_int(i))
 
     @staticmethod
-    @jit.elidable
+    @jit.elidable()
     def fromdecimalstr(s):
         # This function is marked as elidable, so you must not call it and
         # then modify the result.
         return _decimalstr_to_bigint(s)
 
     @staticmethod
-    @jit.elidable
+    @jit.elidable()
     def fromstr(s, base=0):
         """As string_to_int(), but ignores an optional 'l' or 'L' suffix
         and returns an rbigint."""
@@ -271,7 +271,7 @@
         return parse_digit_string(parser)
 
     @staticmethod
-    @jit.elidable
+    @jit.elidable()
     def frombytes(s, byteorder, signed):
         if byteorder not in ('big', 'little'):
             raise InvalidEndiannessError()
@@ -311,7 +311,7 @@
         result._normalize()
         return result
 
-    @jit.elidable
+    @jit.elidable()
     def tobytes(self, nbytes, byteorder, signed):
         if byteorder not in ('big', 'little'):
             raise InvalidEndiannessError()
@@ -384,7 +384,7 @@
                 digits = ''.join([digits[i] for i in range(length-1, -1, -1)])
         return digits
 
-    @jit.elidable
+    @jit.elidable()
     def toint(self):
         """
         Get an integer from a bigint object.
@@ -400,7 +400,7 @@
             raise OverflowError
         return intmask(intmask(x) * sign)
 
-    @jit.elidable
+    @jit.elidable()
     def tolonglong(self):
         return _AsLongLong(self)
 
@@ -408,13 +408,13 @@
     def tobool(self):
         return self.sign != 0
 
-    @jit.elidable
+    @jit.elidable()
     def touint(self):
         if self.sign == -1:
             raise ValueError("cannot convert negative integer to unsigned int")
         return self._touint_helper()
 
-    @jit.elidable
+    @jit.elidable()
     def _touint_helper(self):
         x = r_uint(0)
         i = self.numdigits() - 1
@@ -427,32 +427,32 @@
             i -= 1
         return x
 
-    @jit.elidable
+    @jit.elidable()
     def toulonglong(self):
         if self.sign == -1:
             raise ValueError("cannot convert negative integer to unsigned int")
         return _AsULonglong_ignore_sign(self)
 
-    @jit.elidable
+    @jit.elidable()
     def uintmask(self):
         return _AsUInt_mask(self)
 
-    @jit.elidable
+    @jit.elidable()
     def ulonglongmask(self):
         """Return r_ulonglong(self), truncating."""
         return _AsULonglong_mask(self)
 
-    @jit.elidable
+    @jit.elidable()
     def tofloat(self):
         return _AsDouble(self)
 
-    @jit.elidable
+    @jit.elidable()
     def format(self, digits, prefix='', suffix=''):
         # 'digits' is a string whose length is the base to use,
         # and where each character is the corresponding digit.
         return _format(self, digits, prefix, suffix)
 
-    @jit.elidable
+    @jit.elidable()
     def repr(self):
         try:
             x = self.toint()
@@ -460,7 +460,7 @@
             return self.format(BASE10, suffix="L")
         return str(x) + "L"
 
-    @jit.elidable
+    @jit.elidable()
     def str(self):
         try:
             x = self.toint()
@@ -468,7 +468,7 @@
             return self.format(BASE10)
         return str(x)
 
-    @jit.elidable
+    @jit.elidable()
     def eq(self, other):
         if (self.sign != other.sign or
             self.numdigits() != other.numdigits()):
@@ -486,7 +486,7 @@
     def ne(self, other):
         return not self.eq(other)
 
-    @jit.elidable
+    @jit.elidable()
     def lt(self, other):
         if self.sign > other.sign:
             return False
@@ -533,11 +533,11 @@
     def ge(self, other):
         return not self.lt(other)
 
-    @jit.elidable
+    @jit.elidable()
     def hash(self):
         return _hash(self)
 
-    @jit.elidable
+    @jit.elidable()
     def add(self, other):
         if self.sign == 0:
             return other
@@ -550,7 +550,7 @@
         result.sign *= other.sign
         return result
 
-    @jit.elidable
+    @jit.elidable()
     def sub(self, other):
         if other.sign == 0:
             return self
@@ -563,7 +563,7 @@
         result.sign *= self.sign
         return result
 
-    @jit.elidable
+    @jit.elidable()
     def mul(self, b):
         asize = self.numdigits()
         bsize = b.numdigits()
@@ -608,12 +608,12 @@
         result.sign = a.sign * b.sign
         return result
 
-    @jit.elidable
+    @jit.elidable()
     def truediv(self, other):
         div = _bigint_true_divide(self, other)
         return div
 
-    @jit.elidable
+    @jit.elidable()
     def floordiv(self, other):
         if self.sign == 1 and other.numdigits() == 1 and other.sign == 1:
             digit = other.digit(0)
@@ -634,7 +634,7 @@
     def div(self, other):
         return self.floordiv(other)
 
-    @jit.elidable
+    @jit.elidable()
     def mod(self, other):
         if self.sign == 0:
             return NULLRBIGINT
@@ -671,7 +671,7 @@
             mod = mod.add(other)
         return mod
 
-    @jit.elidable
+    @jit.elidable()
     def divmod(v, w):
         """
         The / and % operators are now defined in terms of divmod().
@@ -697,7 +697,7 @@
             div = div.sub(ONERBIGINT)
         return div, mod
 
-    @jit.elidable
+    @jit.elidable()
     def pow(a, b, c=None):
         negativeOutput = False  # if x<0 return negative output
 
@@ -837,17 +837,17 @@
             z = z.sub(c)
         return z
 
-    @jit.elidable
+    @jit.elidable()
     def neg(self):
         return rbigint(self._digits, -self.sign, self.size)
 
-    @jit.elidable
+    @jit.elidable()
     def abs(self):
         if self.sign != -1:
             return self
         return rbigint(self._digits, 1, self.size)
 
-    @jit.elidable
+    @jit.elidable()
     def invert(self): #Implement ~x as -(x + 1)
         if self.sign == 0:
             return ONENEGATIVERBIGINT
@@ -856,7 +856,7 @@
         ret.sign = -ret.sign
         return ret
 
-    @jit.elidable
+    @jit.elidable()
     def lshift(self, int_other):
         if int_other < 0:
             raise ValueError("negative shift count")
@@ -893,7 +893,7 @@
         return z
     lshift._always_inline_ = True # It's so fast that it's always benefitial.
 
-    @jit.elidable
+    @jit.elidable()
     def lqshift(self, int_other):
         " A quicker one with much less checks, int_other is valid and for the 
most part constant."
         assert int_other > 0
@@ -913,7 +913,7 @@
         return z
     lqshift._always_inline_ = True # It's so fast that it's always benefitial.
 
-    @jit.elidable
+    @jit.elidable()
     def rshift(self, int_other, dont_invert=False):
         if int_other < 0:
             raise ValueError("negative shift count")
@@ -943,7 +943,7 @@
         return z
     rshift._always_inline_ = 'try' # It's so fast that it's always benefitial.
 
-    @jit.elidable
+    @jit.elidable()
     def abs_rshift_and_mask(self, bigshiftcount, mask):
         assert isinstance(bigshiftcount, r_ulonglong)
         assert mask >= 0
@@ -992,30 +992,30 @@
         z._normalize()
         return z
 
-    @jit.elidable
+    @jit.elidable()
     def and_(self, other):
         return _bitwise(self, '&', other)
 
-    @jit.elidable
+    @jit.elidable()
     def xor(self, other):
         return _bitwise(self, '^', other)
 
-    @jit.elidable
+    @jit.elidable()
     def or_(self, other):
         return _bitwise(self, '|', other)
 
-    @jit.elidable
+    @jit.elidable()
     def oct(self):
         if self.sign == 0:
             return '0L'
         else:
             return _format(self, BASE8, '0', 'L')
 
-    @jit.elidable
+    @jit.elidable()
     def hex(self):
         return _format(self, BASE16, '0x', 'L')
 
-    @jit.elidable
+    @jit.elidable()
     def log(self, base):
         # base is supposed to be positive or 0.0, which means we use e
         if base == 10.0:
@@ -1050,7 +1050,7 @@
 
     _normalize._always_inline_ = True
 
-    @jit.elidable
+    @jit.elidable()
     def bit_length(self):
         i = self.numdigits()
         if i == 1 and self._digits[0] == NULLDIGIT:
diff --git a/rpython/rlib/rstring.py b/rpython/rlib/rstring.py
--- a/rpython/rlib/rstring.py
+++ b/rpython/rlib/rstring.py
@@ -160,7 +160,7 @@
 
 
 @specialize.argtype(0)
-@jit.elidable
+@jit.elidable()
 def replace(input, sub, by, maxsplit=-1):
     if isinstance(input, str):
         assert isinstance(sub, str)
@@ -236,7 +236,7 @@
     return start, end
 
 @specialize.argtype(0)
-@jit.elidable
+@jit.elidable()
 def startswith(u_self, prefix, start=0, end=sys.maxint):
     length = len(u_self)
     start, end = _normalize_start_end(length, start, end)
@@ -249,7 +249,7 @@
     return True
 
 @specialize.argtype(0)
-@jit.elidable
+@jit.elidable()
 def endswith(u_self, suffix, start=0, end=sys.maxint):
     length = len(u_self)
     start, end = _normalize_start_end(length, start, end)
diff --git a/rpython/rtyper/lltypesystem/ll_str.py 
b/rpython/rtyper/lltypesystem/ll_str.py
--- a/rpython/rtyper/lltypesystem/ll_str.py
+++ b/rpython/rtyper/lltypesystem/ll_str.py
@@ -10,7 +10,7 @@
     else:
         return r_uint(i)
 
-@jit.elidable
+@jit.elidable()
 def ll_int2dec(val):
     from rpython.rtyper.lltypesystem.rstr import mallocstr
 
@@ -44,7 +44,7 @@
 for i in range(16):
     hex_chars[i] = "%x" % i
 
-@jit.elidable
+@jit.elidable()
 def ll_int2hex(i, addPrefix):
     from rpython.rtyper.lltypesystem.rstr import mallocstr
     temp = malloc(CHAR_ARRAY, 20)
@@ -81,7 +81,7 @@
         j += 1
     return result
 
-@jit.elidable
+@jit.elidable()
 def ll_int2oct(i, addPrefix):
     from rpython.rtyper.lltypesystem.rstr import mallocstr
     if i == 0:
diff --git a/rpython/rtyper/lltypesystem/module/ll_math.py 
b/rpython/rtyper/lltypesystem/module/ll_math.py
--- a/rpython/rtyper/lltypesystem/module/ll_math.py
+++ b/rpython/rtyper/lltypesystem/module/ll_math.py
@@ -71,7 +71,7 @@
 math_sin = llexternal('sin', [rffi.DOUBLE], rffi.DOUBLE, 
elidable_function=True)
 math_cos = llexternal('cos', [rffi.DOUBLE], rffi.DOUBLE, 
elidable_function=True)
 
-@jit.elidable
+@jit.elidable()
 def sqrt_nonneg(x):
     return math_sqrt(x)
 sqrt_nonneg.oopspec = "math.sqrt_nonneg(x)"
diff --git a/rpython/rtyper/lltypesystem/rstr.py 
b/rpython/rtyper/lltypesystem/rstr.py
--- a/rpython/rtyper/lltypesystem/rstr.py
+++ b/rpython/rtyper/lltypesystem/rstr.py
@@ -199,7 +199,7 @@
         self.ll = LLHelpers
         self.malloc = mallocunicode
 
-    @jit.elidable
+    @jit.elidable()
     def ll_str(self, s):
         # XXX crazy that this is here, but I don't want to break
         #     rmodel logic
@@ -214,14 +214,14 @@
             result.chars[i] = cast_primitive(Char, c)
         return result
 
-    @jit.elidable
+    @jit.elidable()
     def ll_unicode(self, s):
         if s:
             return s
         else:
             return self.ll.ll_constant_unicode(u'None')
 
-    @jit.elidable
+    @jit.elidable()
     def ll_encode_latin1(self, s):
         length = len(s.chars)
         result = mallocstr(length)
@@ -266,7 +266,7 @@
 class LLHelpers(AbstractLLHelpers):
     from rpython.rtyper.annlowlevel import llstr, llunicode
 
-    @jit.elidable
+    @jit.elidable()
     def ll_str_mul(s, times):
         if times < 0:
             times = 0
@@ -288,7 +288,7 @@
             i += j
         return newstr
 
-    @jit.elidable
+    @jit.elidable()
     def ll_char_mul(ch, times):
         if typeOf(ch) is Char:
             malloc = mallocstr
@@ -343,7 +343,7 @@
             b.chars[i] = str.chars[i]
         return b
 
-    @jit.elidable
+    @jit.elidable()
     def ll_strhash(s):
         # unlike CPython, there is no reason to avoid to return -1
         # but our malloc initializes the memory to zero, so we use zero as the
@@ -364,7 +364,7 @@
     def ll_strfasthash(s):
         return s.hash     # assumes that the hash is already computed
 
-    @jit.elidable
+    @jit.elidable()
     def ll_strconcat(s1, s2):
         len1 = s1.length()
         len2 = s2.length()
@@ -384,7 +384,7 @@
         return newstr
     ll_strconcat.oopspec = 'stroruni.concat(s1, s2)'
 
-    @jit.elidable
+    @jit.elidable()
     def ll_strip(s, ch, left, right):
         s_len = len(s.chars)
         if s_len == 0:
@@ -404,7 +404,7 @@
         s.copy_contents(s, result, lpos, 0, r_len)
         return result
 
-    @jit.elidable
+    @jit.elidable()
     def ll_strip_default(s, left, right):
         s_len = len(s.chars)
         if s_len == 0:
@@ -424,7 +424,7 @@
         s.copy_contents(s, result, lpos, 0, r_len)
         return result
 
-    @jit.elidable
+    @jit.elidable()
     def ll_strip_multiple(s, s2, left, right):
         s_len = len(s.chars)
         if s_len == 0:
@@ -444,7 +444,7 @@
         s.copy_contents(s, result, lpos, 0, r_len)
         return result
 
-    @jit.elidable
+    @jit.elidable()
     def ll_upper(s):
         s_chars = s.chars
         s_len = len(s_chars)
@@ -458,7 +458,7 @@
             i += 1
         return result
 
-    @jit.elidable
+    @jit.elidable()
     def ll_lower(s):
         s_chars = s.chars
         s_len = len(s_chars)
@@ -505,7 +505,7 @@
             i += 1
         return result
 
-    @jit.elidable
+    @jit.elidable()
     def ll_strcmp(s1, s2):
         if not s1 and not s2:
             return True
@@ -528,7 +528,7 @@
             i += 1
         return len1 - len2
 
-    @jit.elidable
+    @jit.elidable()
     def ll_streq(s1, s2):
         if s1 == s2:       # also if both are NULLs
             return True
@@ -548,7 +548,7 @@
         return True
     ll_streq.oopspec = 'stroruni.equal(s1, s2)'
 
-    @jit.elidable
+    @jit.elidable()
     def ll_startswith(s1, s2):
         len1 = len(s1.chars)
         len2 = len(s2.chars)
@@ -569,7 +569,7 @@
             return False
         return s.chars[0] == ch
 
-    @jit.elidable
+    @jit.elidable()
     def ll_endswith(s1, s2):
         len1 = len(s1.chars)
         len2 = len(s2.chars)
@@ -591,7 +591,7 @@
             return False
         return s.chars[len(s.chars) - 1] == ch
 
-    @jit.elidable
+    @jit.elidable()
     @signature(types.any(), types.any(), types.int(), types.int(), 
returns=types.int())
     def ll_find_char(s, ch, start, end):
         i = start
@@ -603,7 +603,7 @@
             i += 1
         return -1
 
-    @jit.elidable
+    @jit.elidable()
     def ll_rfind_char(s, ch, start, end):
         if end > len(s.chars):
             end = len(s.chars)
@@ -614,7 +614,7 @@
                 return i
         return -1
 
-    @jit.elidable
+    @jit.elidable()
     def ll_count_char(s, ch, start, end):
         count = 0
         i = start
@@ -676,7 +676,7 @@
             res = 0
         return res
 
-    @jit.elidable
+    @jit.elidable()
     def ll_search(s1, s2, start, end, mode):
         count = 0
         n = end - start
@@ -818,7 +818,7 @@
 
     @jit.oopspec('stroruni.slice(s1, start, stop)')
     @signature(types.any(), types.int(), types.int(), returns=types.any())
-    @jit.elidable
+    @jit.elidable()
     def _ll_stringslice(s1, start, stop):
         lgt = stop - start
         assert start >= 0
@@ -980,7 +980,7 @@
         item.copy_contents(s, item, 0, 0, prev_pos)
         return res
 
-    @jit.elidable
+    @jit.elidable()
     def ll_replace_chr_chr(s, c1, c2):
         length = len(s.chars)
         newstr = s.malloc(length)
@@ -995,7 +995,7 @@
             j += 1
         return newstr
 
-    @jit.elidable
+    @jit.elidable()
     def ll_contains(s, c):
         chars = s.chars
         strlen = len(chars)
@@ -1006,7 +1006,7 @@
             i += 1
         return False
 
-    @jit.elidable
+    @jit.elidable()
     def ll_int(s, base):
         if not 2 <= base <= 36:
             raise ValueError
diff --git a/rpython/rtyper/rfloat.py b/rpython/rtyper/rfloat.py
--- a/rpython/rtyper/rfloat.py
+++ b/rpython/rtyper/rfloat.py
@@ -136,7 +136,7 @@
         hop.exception_cannot_occur()
         return vlist[0]
 
-    @jit.elidable
+    @jit.elidable()
     def ll_str(self, f):
         return llstr(formatd(f, 'f', 6))
 
diff --git a/rpython/rtyper/rint.py b/rpython/rtyper/rint.py
--- a/rpython/rtyper/rint.py
+++ b/rpython/rtyper/rint.py
@@ -366,7 +366,7 @@
         hop.exception_cannot_occur()
         return vlist[0]
 
-    @jit.elidable
+    @jit.elidable()
     def ll_str(self, i):
         from rpython.rtyper.lltypesystem.ll_str import ll_int2dec
         return ll_int2dec(i)
diff --git a/rpython/rtyper/rstr.py b/rpython/rtyper/rstr.py
--- a/rpython/rtyper/rstr.py
+++ b/rpython/rtyper/rstr.py
@@ -20,7 +20,7 @@
         self.rstr_decode_utf_8 = func_with_new_name(str_decode_utf_8_impl,
                                                     'rstr_decode_utf_8_impl')
 
-    @jit.elidable
+    @jit.elidable()
     def ll_decode_utf8(self, llvalue):
         from rpython.rtyper.annlowlevel import hlstr
         value = hlstr(llvalue)
@@ -70,7 +70,7 @@
     def rtype_method_lower(self, hop):
         raise TypeError("Cannot do tolower on unicode string")
 
-    @jit.elidable
+    @jit.elidable()
     def ll_encode_utf8(self, ll_s):
         from rpython.rtyper.annlowlevel import hlunicode
         s = hlunicode(ll_s)
diff --git a/rpython/tool/error.py b/rpython/tool/error.py
--- a/rpython/tool/error.py
+++ b/rpython/tool/error.py
@@ -160,7 +160,7 @@
         pdb_plus_show.start(tb)
 
 
-@jit.elidable
+@jit.elidable()
 def offset2lineno(c, stopat):
     tab = c.co_lnotab
     line = c.co_firstlineno
_______________________________________________
pypy-commit mailing list
pypy-commit@python.org
https://mail.python.org/mailman/listinfo/pypy-commit

Reply via email to