Author: Maciej Fijalkowski <[email protected]>
Branch: jit-applevel-hook
Changeset: r44398:0b8de5f20516
Date: 2011-05-24 11:46 +0200
http://bitbucket.org/pypy/pypy/changeset/0b8de5f20516/

Log:    fix test and improve hooks

diff --git a/pypy/jit/metainterp/compile.py b/pypy/jit/metainterp/compile.py
--- a/pypy/jit/metainterp/compile.py
+++ b/pypy/jit/metainterp/compile.py
@@ -154,7 +154,7 @@
     old_loop_tokens.append(loop_token)
 
 def send_loop_to_backend(greenkey, jitdriver_sd, metainterp_sd, loop, type):
-    jitdriver_sd.on_compile(loop, type, greenkey)
+    jitdriver_sd.on_compile(loop.token, loop.operations, type, greenkey)
     globaldata = metainterp_sd.globaldata
     loop_token = loop.token
     loop_token.number = n = globaldata.loopnumbering
@@ -192,6 +192,8 @@
 
 def send_bridge_to_backend(jitdriver_sd, metainterp_sd, faildescr, inputargs,
                            operations, original_loop_token):
+    n = metainterp_sd.cpu.get_fail_descr_number(faildescr)
+    jitdriver_sd.on_compile_bridge(original_loop_token, operations, n)
     if not we_are_translated():
         show_loop(metainterp_sd)
         TreeLoop.check_consistency_of(inputargs, operations)
@@ -208,7 +210,6 @@
         metainterp_sd.stats.compiled()
     metainterp_sd.log("compiled new bridge")
     #
-    n = metainterp_sd.cpu.get_fail_descr_number(faildescr)
     metainterp_sd.logger_ops.log_bridge(inputargs, operations, n, ops_offset)
     #
     if metainterp_sd.warmrunnerdesc is not None:    # for tests
diff --git a/pypy/jit/metainterp/test/test_jitdriver.py 
b/pypy/jit/metainterp/test/test_jitdriver.py
--- a/pypy/jit/metainterp/test/test_jitdriver.py
+++ b/pypy/jit/metainterp/test/test_jitdriver.py
@@ -15,8 +15,8 @@
         called = {}
         
         class MyJitDriver(JitDriver):
-            def on_compile(self, loop, type, n, m):
-                called[(m, n, type)] = loop
+            def on_compile(self, looptoken, operations, type, n, m):
+                called[(m, n, type)] = looptoken
 
         driver = MyJitDriver(greens = ['n', 'm'], reds = ['i'])
 
@@ -37,8 +37,11 @@
         called = {}
         
         class MyJitDriver(JitDriver):
-            def on_compile(self, loop, type, n, m):
+            def on_compile(self, looptoken, operations, type, n, m):
                 called[(m, n, type)] = loop
+            def on_compile_bridge(self, orig_token, operations, n):
+                assert 'bridge' not in called
+                called['bridge'] = orig_token
 
         driver = MyJitDriver(greens = ['n', 'm'], reds = ['i'])
 
@@ -47,12 +50,13 @@
             while i < n + m:
                 driver.can_enter_jit(n=n, m=m, i=i)
                 driver.jit_merge_point(n=n, m=m, i=i)
-                if i == 5:
+                if i >= 4:
                     i += 2
                 i += 1
 
-        self.meta_interp(loop, [1, 4])
-        assert sorted(called.keys()) == [(4, 1, "entry bridge"), (4, 1, 
"loop")]
+        self.meta_interp(loop, [1, 10])
+        assert sorted(called.keys()) == ['bridge', (10, 1, "entry bridge"),
+                                         (10, 1, "loop")]
 
 
 class TestLLtypeSingle(JitDriverTests, LLJitMixin):
diff --git a/pypy/jit/metainterp/warmstate.py b/pypy/jit/metainterp/warmstate.py
--- a/pypy/jit/metainterp/warmstate.py
+++ b/pypy/jit/metainterp/warmstate.py
@@ -566,10 +566,13 @@
             return can_inline_greenargs(*greenargs)
         self.can_inline_greenargs = can_inline_greenargs
         self.can_inline_callable = can_inline_callable
-        def on_compile(loop, type, greenkey):
+        def on_compile(token, operations, type, greenkey):
             greenargs = unwrap_greenkey(greenkey)
-            return jd.jitdriver.on_compile(loop, type, *greenargs)
+            return jd.jitdriver.on_compile(token, operations, type, *greenargs)
+        def on_compile_bridge(orig_token, operations, n):
+            return jd.jitdriver.on_compile_bridge(orig_token, operations, n)
         jd.on_compile = on_compile
+        jd.on_compile_bridge = on_compile_bridge
 
         def get_assembler_token(greenkey, redboxes):
             # 'redboxes' is only used to know the types of red arguments
diff --git a/pypy/rlib/jit.py b/pypy/rlib/jit.py
--- a/pypy/rlib/jit.py
+++ b/pypy/rlib/jit.py
@@ -342,12 +342,17 @@
                             raise
     set_user_param._annspecialcase_ = 'specialize:arg(0)'
 
-    def on_compile(self, loop, type, *args):
-        """ A hook called when loop or bridge is compiled. Overwrite
+    def on_compile(self, looptoken, operations, type, *greenargs):
+        """ A hook called when loop is compiled. Overwrite
         for your own jitdriver if you want to do something special, like
         call applevel code
         """
 
+    def on_compile_bridge(self, orig_looptoken, operations, n):
+        """ A hook called when a bridge is compiled. Overwrite
+        for your own jitdriver if you want to do something special
+        """
+
     def _make_extregistryentries(self):
         # workaround: we cannot declare ExtRegistryEntries for functions
         # used as methods of a frozen object, but we can attach the
_______________________________________________
pypy-commit mailing list
[email protected]
http://mail.python.org/mailman/listinfo/pypy-commit

Reply via email to