Author: Carl Friedrich Bolz <cfb...@gmx.de> Branch: Changeset: r45239:b1ffa113af6d Date: 2011-07-01 19:23 +0200 http://bitbucket.org/pypy/pypy/changeset/b1ffa113af6d/
Log: add a shortcut promote(x) for x = hint(x, promote=True). replace most places that use the latter with the former. Cannot replace them all, due to some issues around provable non-negativeness. diff --git a/pypy/interpreter/function.py b/pypy/interpreter/function.py --- a/pypy/interpreter/function.py +++ b/pypy/interpreter/function.py @@ -63,7 +63,7 @@ if jit.we_are_jitted(): if not self.can_change_code: return _get_immutable_code(self) - return jit.hint(self.code, promote=True) + return jit.promote(self.code) return self.code def funccall(self, *args_w): # speed hack diff --git a/pypy/interpreter/generator.py b/pypy/interpreter/generator.py --- a/pypy/interpreter/generator.py +++ b/pypy/interpreter/generator.py @@ -62,7 +62,7 @@ raise operr # XXX it's not clear that last_instr should be promoted at all # but as long as it is necessary for call_assembler, let's do it early - last_instr = jit.hint(frame.last_instr, promote=True) + last_instr = jit.promote(frame.last_instr) if last_instr == -1: if w_arg and not space.is_w(w_arg, space.w_None): msg = "can't send non-None value to a just-started generator" diff --git a/pypy/interpreter/typedef.py b/pypy/interpreter/typedef.py --- a/pypy/interpreter/typedef.py +++ b/pypy/interpreter/typedef.py @@ -9,7 +9,7 @@ from pypy.interpreter.error import OperationError, operationerrfmt from pypy.tool.sourcetools import compile2, func_with_new_name from pypy.rlib.objectmodel import instantiate, compute_identity_hash, specialize -from pypy.rlib.jit import hint +from pypy.rlib.jit import promote class TypeDef: def __init__(self, __name, __base=None, **rawdict): @@ -206,7 +206,7 @@ user_overridden_class = True def getclass(self, space): - return hint(self.w__class__, promote=True) + return promote(self.w__class__) def setclass(self, space, w_subtype): # only used by descr_set___class__ diff --git a/pypy/jit/backend/x86/test/test_ztranslation.py b/pypy/jit/backend/x86/test/test_ztranslation.py --- a/pypy/jit/backend/x86/test/test_ztranslation.py +++ b/pypy/jit/backend/x86/test/test_ztranslation.py @@ -2,7 +2,7 @@ from pypy.tool.udir import udir from pypy.rlib.jit import JitDriver, unroll_parameters from pypy.rlib.jit import PARAMETERS, dont_look_inside -from pypy.rlib.jit import hint +from pypy.rlib.jit import promote from pypy.jit.metainterp.jitprof import Profiler from pypy.jit.backend.detect_cpu import getcpuclass from pypy.jit.backend.test.support import CCompiledMixin @@ -78,8 +78,7 @@ x = float(j) while i > 0: jitdriver2.jit_merge_point(i=i, res=res, func=func, x=x) - jitdriver2.can_enter_jit(i=i, res=res, func=func, x=x) - func = hint(func, promote=True) + promote(func) argchain = ArgChain() argchain.arg(x) res = func.call(argchain, rffi.DOUBLE) diff --git a/pypy/jit/metainterp/test/test_ajit.py b/pypy/jit/metainterp/test/test_ajit.py --- a/pypy/jit/metainterp/test/test_ajit.py +++ b/pypy/jit/metainterp/test/test_ajit.py @@ -1,7 +1,7 @@ import py import sys from pypy.rlib.jit import JitDriver, we_are_jitted, hint, dont_look_inside -from pypy.rlib.jit import loop_invariant, elidable +from pypy.rlib.jit import loop_invariant, elidable, promote from pypy.rlib.jit import jit_debug, assert_green, AssertGreenFailed from pypy.rlib.jit import unroll_safe, current_trace_length from pypy.jit.metainterp import pyjitpl, history @@ -309,7 +309,7 @@ return x * y externfn._elidable_function_ = True def f(n): - n = hint(n, promote=True) + promote(n) return externfn(n, n+1) res = self.interp_operations(f, [6]) assert res == 42 @@ -1252,7 +1252,7 @@ myjitdriver.jit_merge_point(x=x, l=l) a = l[x] x = a.g(x) - hint(a, promote=True) + promote(a) return x res = self.meta_interp(f, [299], listops=True) assert res == f(299) @@ -1312,7 +1312,7 @@ x -= 5 else: x -= 7 - hint(a, promote=True) + promote(a) return x res = self.meta_interp(f, [299], listops=True) assert res == f(299) @@ -1343,7 +1343,7 @@ x -= 5 else: x -= 7 - hint(a, promote=True) + promote(a) return x res = self.meta_interp(f, [299], listops=True) assert res == f(299) @@ -1377,7 +1377,7 @@ x = a.g(x) else: x -= 7 - hint(a, promote=True) + promote(a) return x res = self.meta_interp(f, [399], listops=True) assert res == f(399) @@ -1496,7 +1496,7 @@ glob.a = B() const = 2 else: - const = hint(const, promote=True) + promote(const) x -= const res += a.x a = None @@ -1531,7 +1531,7 @@ myjitdriver.can_enter_jit(x=x) myjitdriver.jit_merge_point(x=x) a = A() - hint(a, promote=True) + promote(a) x -= 1 self.meta_interp(f, [50]) self.check_loop_count(1) @@ -1595,9 +1595,9 @@ self.check_loops(jit_debug=2) def test_assert_green(self): - def f(x, promote): - if promote: - x = hint(x, promote=True) + def f(x, promote_flag): + if promote_flag: + promote(x) assert_green(x) return x res = self.interp_operations(f, [8, 1]) @@ -1817,7 +1817,7 @@ while y > 0: myjitdriver.can_enter_jit(y=y, x=x, res=res, const=const) myjitdriver.jit_merge_point(y=y, x=x, res=res, const=const) - const = hint(const, promote=True) + const = promote(const) res = res.binop(A(const)) if y<7: res = x @@ -2002,7 +2002,7 @@ n = sa = 0 while n < 10: myjitdriver.jit_merge_point(a=a, b=b, n=n, sa=sa) - if 0 < a < hint(sys.maxint/2, promote=True): pass + if 0 < a < promote(sys.maxint/2): pass if 0 < b < 100: pass sa += (((((a << b) << b) << b) >> b) >> b) >> b n += 1 @@ -2047,7 +2047,7 @@ n = sa = 0 while n < 10: myjitdriver.jit_merge_point(a=a, b=b, n=n, sa=sa) - if -hint(sys.maxint/2, promote=True) < a < 0: pass + if -promote(sys.maxint/2) < a < 0: pass if 0 < b < 100: pass sa += (((((a << b) << b) << b) >> b) >> b) >> b n += 1 @@ -2082,7 +2082,7 @@ n = sa = 0 while n < 10: myjitdriver.jit_merge_point(a=a, b=b, n=n, sa=sa) - if 0 < a < hint(sys.maxint/2, promote=True): pass + if 0 < a < promote(sys.maxint/2): pass if 0 < b < 100: pass sa += (a << b) >> b n += 1 @@ -2139,7 +2139,7 @@ if op == 'j': j += 1 elif op == 'c': - c = hint(c, promote=True) + promote(c) c = 1 - c elif op == '2': if j < 3: @@ -2208,7 +2208,8 @@ self.local_names[0] = 1 def retrieve(self): - variables = hint(self.variables, promote=True) + variables = self.variables + promote(variables) result = self.local_names[0] if result == 0: return -1 diff --git a/pypy/jit/metainterp/test/test_fficall.py b/pypy/jit/metainterp/test/test_fficall.py --- a/pypy/jit/metainterp/test/test_fficall.py +++ b/pypy/jit/metainterp/test/test_fficall.py @@ -1,7 +1,7 @@ import py from pypy.rlib.rarithmetic import r_singlefloat, r_longlong, r_ulonglong -from pypy.rlib.jit import JitDriver, hint, dont_look_inside +from pypy.rlib.jit import JitDriver, promote, dont_look_inside from pypy.rlib.unroll import unrolling_iterable from pypy.rlib.libffi import ArgChain, longlong2float, float2longlong from pypy.rlib.libffi import IS_32_BIT @@ -49,8 +49,7 @@ res = init_result while n < 10: driver.jit_merge_point(n=n, res=res, func=func) - driver.can_enter_jit(n=n, res=res, func=func) - func = hint(func, promote=True) + promote(func) argchain = ArgChain() # this loop is unrolled for method_name, argval in method_and_args: diff --git a/pypy/jit/metainterp/test/test_recursive.py b/pypy/jit/metainterp/test/test_recursive.py --- a/pypy/jit/metainterp/test/test_recursive.py +++ b/pypy/jit/metainterp/test/test_recursive.py @@ -1,6 +1,6 @@ import py from pypy.rlib.jit import JitDriver, we_are_jitted, hint -from pypy.rlib.jit import unroll_safe, dont_look_inside +from pypy.rlib.jit import unroll_safe, dont_look_inside, promote from pypy.rlib.objectmodel import we_are_translated from pypy.rlib.debug import fatalerror from pypy.jit.metainterp.test.support import LLJitMixin, OOJitMixin @@ -926,7 +926,7 @@ myjitdriver.can_enter_jit(codeno=codeno, frame=frame, n=n, x=x) myjitdriver.jit_merge_point(codeno=codeno, frame=frame, n=n, x=x) - frame.s = hint(frame.s, promote=True) + frame.s = promote(frame.s) n -= 1 s = frame.s assert s >= 0 diff --git a/pypy/jit/metainterp/test/test_send.py b/pypy/jit/metainterp/test/test_send.py --- a/pypy/jit/metainterp/test/test_send.py +++ b/pypy/jit/metainterp/test/test_send.py @@ -1,5 +1,5 @@ import py -from pypy.rlib.jit import JitDriver, hint, elidable +from pypy.rlib.jit import JitDriver, promote, elidable from pypy.jit.codewriter.policy import StopAtXPolicy from pypy.jit.metainterp.test.support import LLJitMixin, OOJitMixin @@ -613,7 +613,7 @@ while i > 0: myjitdriver.can_enter_jit(i=i, obj=obj) myjitdriver.jit_merge_point(i=i, obj=obj) - obj = hint(obj, promote=True) + promote(obj) res = obj.foo() i-=1 return res diff --git a/pypy/jit/metainterp/test/test_virtual.py b/pypy/jit/metainterp/test/test_virtual.py --- a/pypy/jit/metainterp/test/test_virtual.py +++ b/pypy/jit/metainterp/test/test_virtual.py @@ -1,5 +1,5 @@ import py -from pypy.rlib.jit import JitDriver, hint +from pypy.rlib.jit import JitDriver, promote from pypy.rlib.objectmodel import compute_unique_id from pypy.jit.codewriter.policy import StopAtXPolicy from pypy.jit.metainterp.test.support import LLJitMixin, OOJitMixin @@ -300,7 +300,7 @@ while n > 0: myjitdriver.can_enter_jit(n=n, i=i, stufflist=stufflist) myjitdriver.jit_merge_point(n=n, i=i, stufflist=stufflist) - i = hint(i, promote=True) + promote(i) v = Stuff(i) n -= stufflist.lst[v.x].x return n diff --git a/pypy/jit/metainterp/test/test_virtualizable.py b/pypy/jit/metainterp/test/test_virtualizable.py --- a/pypy/jit/metainterp/test/test_virtualizable.py +++ b/pypy/jit/metainterp/test/test_virtualizable.py @@ -5,7 +5,7 @@ from pypy.rpython.rclass import IR_IMMUTABLE, IR_IMMUTABLE_ARRAY from pypy.jit.codewriter.policy import StopAtXPolicy from pypy.jit.codewriter import heaptracker -from pypy.rlib.jit import JitDriver, hint, dont_look_inside +from pypy.rlib.jit import JitDriver, hint, dont_look_inside, promote from pypy.rlib.rarithmetic import intmask from pypy.jit.metainterp.test.support import LLJitMixin, OOJitMixin from pypy.rpython.rclass import FieldListAccessor @@ -480,7 +480,7 @@ while n > 0: myjitdriver.can_enter_jit(frame=frame, n=n, x=x) myjitdriver.jit_merge_point(frame=frame, n=n, x=x) - frame.s = hint(frame.s, promote=True) + frame.s = promote(frame.s) n -= 1 s = frame.s assert s >= 0 diff --git a/pypy/jit/tl/spli/interpreter.py b/pypy/jit/tl/spli/interpreter.py --- a/pypy/jit/tl/spli/interpreter.py +++ b/pypy/jit/tl/spli/interpreter.py @@ -2,7 +2,7 @@ from pypy.tool import stdlib_opcode from pypy.jit.tl.spli import objects, pycode from pypy.rlib.unroll import unrolling_iterable -from pypy.rlib.jit import JitDriver, hint, dont_look_inside +from pypy.rlib.jit import JitDriver, promote, dont_look_inside from pypy.rlib.objectmodel import we_are_translated opcode_method_names = stdlib_opcode.host_bytecode_spec.method_names @@ -78,7 +78,7 @@ while True: jitdriver.jit_merge_point(code=code, instr_index=instr_index, frame=self) - self.stack_depth = hint(self.stack_depth, promote=True) + self.stack_depth = promote(self.stack_depth) op = ord(code[instr_index]) instr_index += 1 if op >= HAVE_ARGUMENT: diff --git a/pypy/jit/tl/tiny2.py b/pypy/jit/tl/tiny2.py --- a/pypy/jit/tl/tiny2.py +++ b/pypy/jit/tl/tiny2.py @@ -27,7 +27,7 @@ { #1 #1 1 SUB ->#1 #1 } => when called with 5, gives '5 4 3 2 1' """ -from pypy.rlib.jit import hint +from pypy.rlib.jit import hint, promote # # See pypy/doc/jit.txt for a higher-level overview of the JIT techniques @@ -75,9 +75,9 @@ # ones. The JIT compiler cannot look into indirect calls, but it # can analyze and inline the code in directly-called functions. y = stack.pop() - hint(y.__class__, promote=True) + promote(y.__class__) x = stack.pop() - hint(x.__class__, promote=True) + promote(x.__class__) try: z = IntBox(func_int(x.as_int(), y.as_int())) except ValueError: @@ -108,7 +108,7 @@ # doesn't have to worry about the 'args' list being unpredictably # modified. oldargs = args - argcount = hint(len(oldargs), promote=True) + argcount = promote(len(oldargs)) args = [] n = 0 while n < argcount: @@ -160,8 +160,7 @@ # read out of the 'loops' list will be a compile-time constant # because it was pushed as a compile-time constant by the '{' # case above into 'loops', which is a virtual list, so the - # promotion below is just a way to make the colors match. - pos = hint(pos, promote=True) + promote(pos) else: stack.append(StrBox(opcode)) return stack diff --git a/pypy/jit/tl/tiny2_hotpath.py b/pypy/jit/tl/tiny2_hotpath.py --- a/pypy/jit/tl/tiny2_hotpath.py +++ b/pypy/jit/tl/tiny2_hotpath.py @@ -27,7 +27,7 @@ { #1 #1 1 SUB ->#1 #1 } => when called with 5, gives '5 4 3 2 1' """ -from pypy.rlib.jit import hint, JitDriver +from pypy.rlib.jit import hint, promote, JitDriver # # See pypy/doc/jit.txt for a higher-level overview of the JIT techniques @@ -77,9 +77,9 @@ # ones. The JIT compiler cannot look into indirect calls, but it # can analyze and inline the code in directly-called functions. stack, y = stack.pop() - hint(y.__class__, promote=True) + promote(y.__class__) stack, x = stack.pop() - hint(x.__class__, promote=True) + promote(x.__class__) try: z = IntBox(func_int(x.as_int(), y.as_int())) except ValueError: @@ -120,7 +120,7 @@ # modified. oldloops = invariants oldargs = reds.args - argcount = hint(len(oldargs), promote=True) + argcount = promote(len(oldargs)) args = [] n = 0 while n < argcount: @@ -189,7 +189,7 @@ # because it was pushed as a compile-time constant by the '{' # case above into 'loops', which is a virtual list, so the # promotion below is just a way to make the colors match. - pos = hint(pos, promote=True) + pos = promote(pos) tinyjitdriver.can_enter_jit(args=args, loops=loops, stack=stack, bytecode=bytecode, pos=pos) else: diff --git a/pypy/jit/tl/tiny3_hotpath.py b/pypy/jit/tl/tiny3_hotpath.py --- a/pypy/jit/tl/tiny3_hotpath.py +++ b/pypy/jit/tl/tiny3_hotpath.py @@ -28,7 +28,7 @@ { #1 #1 1 SUB ->#1 #1 } => when called with 5, gives '5 4 3 2 1' """ -from pypy.rlib.jit import hint, JitDriver +from pypy.rlib.jit import promote, hint, JitDriver from pypy.rlib.objectmodel import specialize # @@ -83,9 +83,9 @@ # ones. The JIT compiler cannot look into indirect calls, but it # can analyze and inline the code in directly-called functions. stack, y = stack.pop() - hint(y.__class__, promote=True) + promote(y.__class__) stack, x = stack.pop() - hint(x.__class__, promote=True) + promote(x.__class__) if isinstance(x, IntBox) and isinstance(y, IntBox): z = IntBox(func_int(x.as_int(), y.as_int())) else: @@ -125,7 +125,7 @@ # modified. oldloops = invariants oldargs = reds.args - argcount = hint(len(oldargs), promote=True) + argcount = promote(len(oldargs)) args = [] n = 0 while n < argcount: @@ -194,7 +194,7 @@ # because it was pushed as a compile-time constant by the '{' # case above into 'loops', which is a virtual list, so the # promotion below is just a way to make the colors match. - pos = hint(pos, promote=True) + pos = promote(pos) tinyjitdriver.can_enter_jit(args=args, loops=loops, stack=stack, bytecode=bytecode, pos=pos) else: diff --git a/pypy/jit/tl/tl.py b/pypy/jit/tl/tl.py --- a/pypy/jit/tl/tl.py +++ b/pypy/jit/tl/tl.py @@ -2,7 +2,7 @@ import py from pypy.jit.tl.tlopcode import * -from pypy.rlib.jit import JitDriver, hint, dont_look_inside +from pypy.rlib.jit import JitDriver, hint, dont_look_inside, promote def char2int(c): t = ord(c) @@ -81,7 +81,7 @@ myjitdriver.jit_merge_point(pc=pc, code=code, stack=stack, inputarg=inputarg) opcode = ord(code[pc]) - stack.stackpos = hint(stack.stackpos, promote=True) + stack.stackpos = promote(stack.stackpos) pc += 1 if opcode == NOP: diff --git a/pypy/module/_ffi/interp_ffi.py b/pypy/module/_ffi/interp_ffi.py --- a/pypy/module/_ffi/interp_ffi.py +++ b/pypy/module/_ffi/interp_ffi.py @@ -235,7 +235,7 @@ argchain.arg_longlong(floatval) def call(self, space, args_w): - self = jit.hint(self, promote=True) + self = jit.promote(self) argchain = self.build_argchain(space, args_w) w_restype = self.w_restype if w_restype.is_longlong(): 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 @@ -167,7 +167,7 @@ self.previous = profobj.current_context entry.recursionLevel += 1 if profobj.subcalls and self.previous: - caller = jit.hint(self.previous.entry, promote=True) + caller = jit.promote(self.previous.entry) subentry = caller._get_or_make_subentry(entry) subentry.recursionLevel += 1 self.ll_t0 = profobj.ll_timer() @@ -179,7 +179,7 @@ self.previous.ll_subt += tt entry._stop(tt, it) if profobj.subcalls and self.previous: - caller = jit.hint(self.previous.entry, promote=True) + caller = jit.promote(self.previous.entry) subentry = caller._get_or_make_subentry(entry, False) if subentry is not None: subentry._stop(tt, it) @@ -306,7 +306,7 @@ def _enter_call(self, f_code): # we have a superb gc, no point in freelist :) - self = jit.hint(self, promote=True) + self = jit.promote(self) entry = self._get_or_make_entry(f_code) self.current_context = ProfilerContext(self, entry) @@ -314,14 +314,14 @@ context = self.current_context if context is None: return - self = jit.hint(self, promote=True) + self = jit.promote(self) entry = self._get_or_make_entry(f_code, False) if entry is not None: context._stop(self, entry) self.current_context = context.previous def _enter_builtin_call(self, key): - self = jit.hint(self, promote=True) + self = jit.promote(self) entry = self._get_or_make_builtin_entry(key) self.current_context = ProfilerContext(self, entry) @@ -329,7 +329,7 @@ context = self.current_context if context is None: return - self = jit.hint(self, promote=True) + self = jit.promote(self) entry = self._get_or_make_builtin_entry(key, False) if entry is not None: context._stop(self, entry) 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 @@ -133,8 +133,8 @@ def _get_relative_name(space, modulename, level, w_globals): w = space.wrap ctxt_w_package = space.finditem_str(w_globals, '__package__') - ctxt_w_package = jit.hint(ctxt_w_package, promote=True) - level = jit.hint(level, promote=True) + ctxt_w_package = jit.promote(ctxt_w_package) + level = jit.promote(level) ctxt_package = None if ctxt_w_package is not None and ctxt_w_package is not space.w_None: @@ -184,7 +184,7 @@ ctxt_w_name = space.finditem_str(w_globals, '__name__') ctxt_w_path = space.finditem_str(w_globals, '__path__') - ctxt_w_name = jit.hint(ctxt_w_name, promote=True) + ctxt_w_name = jit.promote(ctxt_w_name) ctxt_name = None if ctxt_w_name is not None: try: diff --git a/pypy/objspace/std/celldict.py b/pypy/objspace/std/celldict.py --- a/pypy/objspace/std/celldict.py +++ b/pypy/objspace/std/celldict.py @@ -28,7 +28,7 @@ if makenew or jit.we_are_jitted(): # when we are jitting, we always go through the pure function # below, to ensure that we have no residual dict lookup - self = jit.hint(self, promote=True) + self = jit.promote(self) return self._getcell_makenew(key) return self.content.get(key, None) 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 @@ -357,7 +357,7 @@ self._set_mapdict_storage_and_map(new_obj.storage, new_obj.map) def _get_mapdict_map(self): - return jit.hint(self.map, promote=True) + return jit.promote(self.map) def _set_mapdict_map(self, map): self.map = map # _____________________________________________ diff --git a/pypy/objspace/std/objspace.py b/pypy/objspace/std/objspace.py --- a/pypy/objspace/std/objspace.py +++ b/pypy/objspace/std/objspace.py @@ -11,7 +11,7 @@ from pypy.rlib.debug import make_sure_not_resized from pypy.rlib.rarithmetic import base_int, widen from pypy.rlib.objectmodel import we_are_translated -from pypy.rlib.jit import hint +from pypy.rlib import jit from pypy.rlib.rbigint import rbigint from pypy.tool.sourcetools import func_with_new_name @@ -322,7 +322,7 @@ return W_SeqIterObject(w_obj) def type(self, w_obj): - hint(w_obj.__class__, promote=True) + jit.promote(w_obj.__class__) return w_obj.getclass(self) def lookup(self, w_obj, name): 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 @@ -9,7 +9,7 @@ from pypy.objspace.std.objecttype import object_typedef from pypy.rlib.objectmodel import we_are_translated from pypy.rlib.objectmodel import current_object_addr_as_int, compute_hash -from pypy.rlib.jit import hint, elidable_promote, we_are_jitted +from pypy.rlib.jit import promote, elidable_promote, we_are_jitted from pypy.rlib.jit import elidable, dont_look_inside, unroll_safe from pypy.rlib.rarithmetic import intmask, r_uint @@ -351,9 +351,9 @@ def lookup_where_with_method_cache(w_self, name): space = w_self.space - w_self = hint(w_self, promote=True) + promote(w_self) assert space.config.objspace.std.withmethodcache - version_tag = hint(w_self.version_tag(), promote=True) + version_tag = promote(w_self.version_tag()) if version_tag is None: tup = w_self._lookup_where(name) return tup @@ -447,8 +447,8 @@ w_self.flag_abstract = bool(abstract) def issubtype(w_self, w_type): - w_self = hint(w_self, promote=True) - w_type = hint(w_type, promote=True) + promote(w_self) + promote(w_type) if w_self.space.config.objspace.std.withtypeversion and we_are_jitted(): version_tag1 = w_self.version_tag() version_tag2 = w_type.version_tag() @@ -774,7 +774,7 @@ # ____________________________________________________________ def call__Type(space, w_type, __args__): - w_type = hint(w_type, promote=True) + promote(w_type) # special case for type(x) if space.is_w(w_type, space.w_type): try: diff --git a/pypy/rlib/jit.py b/pypy/rlib/jit.py --- a/pypy/rlib/jit.py +++ b/pypy/rlib/jit.py @@ -41,6 +41,10 @@ """ return x +@specialize.argtype(0) +def promote(x): + return hint(x, promote=True) + def dont_look_inside(func): """ Make sure the JIT does not trace inside decorated function (it becomes a call instead) diff --git a/pypy/rlib/libffi.py b/pypy/rlib/libffi.py --- a/pypy/rlib/libffi.py +++ b/pypy/rlib/libffi.py @@ -253,7 +253,7 @@ # the optimizer will fail to recognize the pattern and won't turn it # into a fast CALL. Note that "arg = arg.next" is optimized away, # assuming that archain is completely virtual. - self = jit.hint(self, promote=True) + self = jit.promote(self) if argchain.numargs != len(self.argtypes): raise TypeError, 'Wrong number of arguments: %d expected, got %d' %\ (argchain.numargs, len(self.argtypes)) _______________________________________________ pypy-commit mailing list pypy-commit@python.org http://mail.python.org/mailman/listinfo/pypy-commit