Author: Alex Gaynor <alex.gay...@gmail.com> Branch: jit-settrace Changeset: r67603:823690e51853 Date: 2013-10-25 09:39 -0700 http://bitbucket.org/pypy/pypy/changeset/823690e51853/
Log: Put is_tracefunc on the greenkey diff --git a/pypy/module/pypyjit/interp_jit.py b/pypy/module/pypyjit/interp_jit.py --- a/pypy/module/pypyjit/interp_jit.py +++ b/pypy/module/pypyjit/interp_jit.py @@ -27,28 +27,35 @@ JUMP_ABSOLUTE = opmap['JUMP_ABSOLUTE'] -def get_printable_location(next_instr, is_being_profiled, bytecode): +def get_printable_location(next_instr, is_being_profiled, bytecode, is_tracefunc): from pypy.tool.stdlib_opcode import opcode_method_names name = opcode_method_names[ord(bytecode.co_code[next_instr])] return '%s #%d %s' % (bytecode.get_repr(), next_instr, name) -def get_jitcell_at(next_instr, is_being_profiled, bytecode): +def make_greenkey_dict_key(next_instr, is_being_profiled, is_tracefunc): # use only uints as keys in the jit_cells dict, rather than # a tuple (next_instr, is_being_profiled) - key = (next_instr << 1) | r_uint(intmask(is_being_profiled)) + return ( + (next_instr << 2) | + (r_uint(intmask(is_being_profiled)) << 1) | + r_uint(intmask(is_tracefunc)) + ) + +def get_jitcell_at(next_instr, is_being_profiled, bytecode, is_tracefunc): + key = make_greenkey_dict_key(next_instr, is_being_profiled, is_tracefunc) return bytecode.jit_cells.get(key, None) -def set_jitcell_at(newcell, next_instr, is_being_profiled, bytecode): - key = (next_instr << 1) | r_uint(intmask(is_being_profiled)) +def set_jitcell_at(newcell, next_instr, is_being_profiled, bytecode, is_tracefunc): + key = make_greenkey_dict_key(next_instr, is_being_profiled, is_tracefunc) bytecode.jit_cells[key] = newcell -def should_unroll_one_iteration(next_instr, is_being_profiled, bytecode): +def should_unroll_one_iteration(next_instr, is_being_profiled, bytecode, is_tracefunc): return (bytecode.co_flags & CO_GENERATOR) != 0 class PyPyJitDriver(JitDriver): reds = ['frame', 'ec'] - greens = ['next_instr', 'is_being_profiled', 'pycode'] + greens = ['next_instr', 'is_being_profiled', 'pycode', 'is_tracefunc'] virtualizables = ['frame'] pypyjitdriver = PyPyJitDriver(get_printable_location = get_printable_location, @@ -68,7 +75,8 @@ while True: pypyjitdriver.jit_merge_point(ec=ec, frame=self, next_instr=next_instr, pycode=pycode, - is_being_profiled=is_being_profiled) + is_being_profiled=is_being_profiled, + is_tracefunc=ec.gettrace() is not None) co_code = pycode.co_code self.valuestackdepth = hint(self.valuestackdepth, promote=True) next_instr = self.handle_bytecode(co_code, next_instr, ec) @@ -97,7 +105,8 @@ # pypyjitdriver.can_enter_jit(frame=self, ec=ec, next_instr=jumpto, pycode=self.getcode(), - is_being_profiled=self.is_being_profiled) + is_being_profiled=self.is_being_profiled, + is_tracefunc=ec.gettrace() is not None) return jumpto def _get_adapted_tick_counter(): _______________________________________________ pypy-commit mailing list pypy-commit@python.org https://mail.python.org/mailman/listinfo/pypy-commit