[pypy-svn] r70409 - in pypy/branch/jit-trace/pypy: jit/metainterp jit/metainterp/test rlib
arigo at codespeak.net
arigo at codespeak.net
Mon Jan 4 22:14:36 CET 2010
Author: arigo
Date: Mon Jan 4 22:14:36 2010
New Revision: 70409
Modified:
pypy/branch/jit-trace/pypy/jit/metainterp/test/test_basic.py
pypy/branch/jit-trace/pypy/jit/metainterp/warmspot.py
pypy/branch/jit-trace/pypy/jit/metainterp/warmstate.py
pypy/branch/jit-trace/pypy/rlib/jit.py
Log:
Add a callback to JitDriver.
Modified: pypy/branch/jit-trace/pypy/jit/metainterp/test/test_basic.py
==============================================================================
--- pypy/branch/jit-trace/pypy/jit/metainterp/test/test_basic.py (original)
+++ pypy/branch/jit-trace/pypy/jit/metainterp/test/test_basic.py Mon Jan 4 22:14:36 2010
@@ -385,6 +385,26 @@
res = self.meta_interp(f, [55])
assert res == -1
+ def test_confirm_enter_jit(self):
+ def confirm_enter_jit(x):
+ return x <= 5
+ myjitdriver = JitDriver(greens = ['x'], reds = ['y'],
+ confirm_enter_jit = confirm_enter_jit)
+ def f(x, y):
+ while y >= 0:
+ myjitdriver.can_enter_jit(x=x, y=y)
+ myjitdriver.jit_merge_point(x=x, y=y)
+ y -= x
+ return y
+ #
+ res = self.meta_interp(f, [10, 84])
+ assert res == -6
+ self.check_loop_count(0)
+ #
+ res = self.meta_interp(f, [3, 19])
+ assert res == -2
+ self.check_loop_count(1)
+
def test_format(self):
def f(n):
return len("<%d>" % n)
Modified: pypy/branch/jit-trace/pypy/jit/metainterp/warmspot.py
==============================================================================
--- pypy/branch/jit-trace/pypy/jit/metainterp/warmspot.py (original)
+++ pypy/branch/jit-trace/pypy/jit/metainterp/warmspot.py Mon Jan 4 22:14:36 2010
@@ -402,6 +402,8 @@
annhelper, self.jitdriver.can_inline, annmodel.s_Bool)
self.get_printable_location_ptr = self._make_hook_graph(
annhelper, self.jitdriver.get_printable_location, s_Str)
+ self.confirm_enter_jit_ptr = self._make_hook_graph(
+ annhelper, self.jitdriver.confirm_enter_jit, annmodel.s_Bool)
annhelper.finish()
def _make_hook_graph(self, annhelper, func, s_result, s_first_arg=None):
Modified: pypy/branch/jit-trace/pypy/jit/metainterp/warmstate.py
==============================================================================
--- pypy/branch/jit-trace/pypy/jit/metainterp/warmstate.py (original)
+++ pypy/branch/jit-trace/pypy/jit/metainterp/warmstate.py Mon Jan 4 22:14:36 2010
@@ -196,6 +196,7 @@
get_jitcell = self.make_jitcell_getter()
set_future_values = self.make_set_future_values()
self.make_jitdriver_callbacks()
+ confirm_enter_jit = self.confirm_enter_jit
def maybe_compile_and_run(*args):
"""Entry point to the JIT. Called at the point with the
@@ -227,6 +228,9 @@
cell.counter = n
return
# bound reached; start tracing
+ if not confirm_enter_jit(*greenargs):
+ cell.counter = 0
+ return
from pypy.jit.metainterp.pyjitpl import MetaInterp
metainterp = MetaInterp(metainterp_sd)
try:
@@ -237,6 +241,8 @@
self.disable_noninlinable_function(metainterp)
raise
else:
+ if not confirm_enter_jit(*greenargs):
+ return
# machine code was already compiled for these greenargs
# get the assembler and fill in the boxes
set_future_values(*args[num_green_args:])
@@ -465,7 +471,6 @@
greenargs = unwrap_greenkey(greenkey)
return can_inline(*greenargs)
self.can_inline_callable = can_inline_greenkey
-
#
get_location_ptr = self.warmrunnerdesc.get_printable_location_ptr
if get_location_ptr is None:
@@ -483,3 +488,16 @@
res = hlstr(res)
return res
self.get_location_str = get_location_str
+ #
+ confirm_enter_jit_ptr = self.warmrunnerdesc.confirm_enter_jit_ptr
+ if confirm_enter_jit_ptr is None:
+ def confirm_enter_jit(*greenargs):
+ return True
+ else:
+ rtyper = self.warmrunnerdesc.rtyper
+ #
+ def confirm_enter_jit(*greenargs):
+ fn = support.maybe_on_top_of_llinterp(rtyper,
+ confirm_enter_jit_ptr)
+ return fn(*greenargs)
+ self.confirm_enter_jit = confirm_enter_jit
Modified: pypy/branch/jit-trace/pypy/rlib/jit.py
==============================================================================
--- pypy/branch/jit-trace/pypy/rlib/jit.py (original)
+++ pypy/branch/jit-trace/pypy/rlib/jit.py Mon Jan 4 22:14:36 2010
@@ -215,6 +215,7 @@
def __init__(self, greens=None, reds=None, virtualizables=None,
get_jitcell_at=None, set_jitcell_at=None,
can_inline=None, get_printable_location=None,
+ confirm_enter_jit=None,
leave=None): # XXX 'leave' is deprecated
if greens is not None:
self.greens = greens
@@ -232,6 +233,7 @@
self.set_jitcell_at = set_jitcell_at
self.get_printable_location = get_printable_location
self.can_inline = can_inline
+ self.confirm_enter_jit = confirm_enter_jit
self.leave = leave
def _freeze_(self):
More information about the Pypy-commit
mailing list