[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